Blame
Date:
Tue Apr 27 13:35:04 2021 UTC
Message:
connect to correct channel
01
2021-04-27
op
package main
02
2021-04-27
op
03
2021-04-27
op
import (
04
2021-04-27
op
"crypto/tls"
05
2021-04-27
op
"flag"
06
2021-04-27
op
"fmt"
07
2021-04-27
op
"io"
08
2021-04-27
op
"io/ioutil"
09
2021-04-27
op
"log"
10
2021-04-27
op
"net/http"
11
2021-04-27
op
"path/filepath"
12
2021-04-27
op
"regexp"
13
2021-04-27
op
14
2021-04-27
op
irc "github.com/fluffle/goirc/client"
15
2021-04-27
op
)
16
2021-04-27
op
17
2021-04-27
op
var (
18
2021-04-27
op
baseurl = flag.String("baseurl", "gemini://m2i.omarpolo.com", "base url")
19
2021-04-27
op
matrixOutDir = flag.String("matrix-out", "", "matrix out directory")
20
2021-04-27
op
21
2021-04-27
op
matrixRe = regexp.MustCompile(`https://matrix.org/[^\s]+\.txt`)
22
2021-04-27
op
channel = "#gemini-italia"
23
2021-04-27
op
)
24
2021-04-27
op
25
2021-04-27
op
func matrix2gemini(conn *irc.Conn, line *irc.Line) {
26
2021-04-27
op
matches := matrixRe.FindAllString(line.Text(), -1)
27
2021-04-27
op
28
2021-04-27
op
// it's not a good idea to defer inside a loop, but we know
29
2021-04-27
op
// len(matches) is small (usually just 1). Morover, I like
30
2021-04-27
op
// living in danger!
31
2021-04-27
op
32
2021-04-27
op
for _, link := range matches {
33
2021-04-27
op
resp, err := http.Get(link)
34
2021-04-27
op
if err != nil {
35
2021-04-27
op
conn.Privmsg(
36
2021-04-27
op
channel,
37
2021-04-27
op
fmt.Sprintf("failed to download %q: %s", link, err),
38
2021-04-27
op
)
39
2021-04-27
op
continue
40
2021-04-27
op
}
41
2021-04-27
op
defer resp.Body.Close()
42
2021-04-27
op
43
2021-04-27
op
tmpfile, err := ioutil.TempFile(*matrixOutDir, "message-")
44
2021-04-27
op
if err != nil {
45
2021-04-27
op
conn.Privmsg(channel, fmt.Sprintf("failed to tmpfile: %s", err))
46
2021-04-27
op
return
47
2021-04-27
op
}
48
2021-04-27
op
defer tmpfile.Close()
49
2021-04-27
op
50
2021-04-27
op
io.Copy(tmpfile, resp.Body)
51
2021-04-27
op
52
2021-04-27
op
conn.Privmsg(
53
2021-04-27
op
channel,
54
2021-04-27
op
fmt.Sprintf(
55
2021-04-27
op
"better: %s/%s",
56
2021-04-27
op
*baseurl,
57
2021-04-27
op
filepath.Base(tmpfile.Name()),
58
2021-04-27
op
),
59
2021-04-27
op
)
60
2021-04-27
op
}
61
2021-04-27
op
}
62
2021-04-27
op
63
2021-04-27
op
func dostuff(conn *irc.Conn, line *irc.Line) {
64
2021-04-27
op
matrix2gemini(conn, line)
65
2021-04-27
op
// ...
66
2021-04-27
op
}
67
2021-04-27
op
68
2021-04-27
op
func main() {
69
2021-04-27
op
flag.Parse()
70
2021-04-27
op
71
2021-04-27
op
cfg := irc.NewConfig("gemitbot")
72
2021-04-27
op
cfg.SSL = true
73
2021-04-27
op
cfg.SSLConfig = &tls.Config{ServerName: "irc.freenode.net"}
74
2021-04-27
op
cfg.Server = "irc.freenode.net:7000"
75
2021-04-27
op
cfg.NewNick = func(n string) string { return n + "^" }
76
2021-04-27
op
77
2021-04-27
op
c := irc.Client(cfg)
78
2021-04-27
op
79
2021-04-27
op
c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) {
80
2021-04-27
op
log.Println("connected, joining", channel)
81
2021-04-27
op
conn.Join(channel)
82
2021-04-27
op
})
83
2021-04-27
op
84
2021-04-27
op
c.HandleFunc(irc.PRIVMSG, dostuff)
85
2021-04-27
op
c.HandleFunc(irc.ACTION, dostuff)
86
2021-04-27
op
87
2021-04-27
op
quit := make(chan bool)
88
2021-04-27
op
89
2021-04-27
op
c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) {
90
2021-04-27
op
quit <- true
91
2021-04-27
op
})
92
2021-04-27
op
93
2021-04-27
op
if err := c.Connect(); err != nil {
94
2021-04-27
op
log.Fatalln("connection error:", err)
95
2021-04-27
op
}
96
2021-04-27
op
97
2021-04-27
op
<-quit
98
2021-04-27
op
}
Omar Polo