11 5ad39add 2021-04-27 op "path/filepath"
14 7cc05214 2021-04-27 op irc "github.com/fluffle/goirc/client"
18 7cc05214 2021-04-27 op baseurl = flag.String("baseurl", "gemini://m2i.omarpolo.com", "base url")
19 7cc05214 2021-04-27 op matrixOutDir = flag.String("matrix-out", "", "matrix out directory")
21 7cc05214 2021-04-27 op matrixRe = regexp.MustCompile(`https://matrix.org/[^\s]+\.txt`)
22 d1fc3257 2021-04-27 op channel = "#gemini-italia"
25 7cc05214 2021-04-27 op func matrix2gemini(conn *irc.Conn, line *irc.Line) {
26 7cc05214 2021-04-27 op matches := matrixRe.FindAllString(line.Text(), -1)
28 7cc05214 2021-04-27 op // it's not a good idea to defer inside a loop, but we know
29 7cc05214 2021-04-27 op // len(matches) is small (usually just 1). Morover, I like
30 7cc05214 2021-04-27 op // living in danger!
32 7cc05214 2021-04-27 op for _, link := range matches {
33 7cc05214 2021-04-27 op resp, err := http.Get(link)
34 7cc05214 2021-04-27 op if err != nil {
37 7cc05214 2021-04-27 op fmt.Sprintf("failed to download %q: %s", link, err),
41 7cc05214 2021-04-27 op defer resp.Body.Close()
43 7cc05214 2021-04-27 op tmpfile, err := ioutil.TempFile(*matrixOutDir, "message-")
44 7cc05214 2021-04-27 op if err != nil {
45 7cc05214 2021-04-27 op conn.Privmsg(channel, fmt.Sprintf("failed to tmpfile: %s", err))
48 7cc05214 2021-04-27 op defer tmpfile.Close()
50 7cc05214 2021-04-27 op io.Copy(tmpfile, resp.Body)
55 5ad39add 2021-04-27 op "better: %s/%s",
57 5ad39add 2021-04-27 op filepath.Base(tmpfile.Name()),
63 7cc05214 2021-04-27 op func dostuff(conn *irc.Conn, line *irc.Line) {
64 7cc05214 2021-04-27 op matrix2gemini(conn, line)
71 7cc05214 2021-04-27 op cfg := irc.NewConfig("gemitbot")
72 7cc05214 2021-04-27 op cfg.SSL = true
73 7cc05214 2021-04-27 op cfg.SSLConfig = &tls.Config{ServerName: "irc.freenode.net"}
74 7cc05214 2021-04-27 op cfg.Server = "irc.freenode.net:7000"
75 7cc05214 2021-04-27 op cfg.NewNick = func(n string) string { return n + "^" }
77 7cc05214 2021-04-27 op c := irc.Client(cfg)
79 7cc05214 2021-04-27 op c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) {
80 7cc05214 2021-04-27 op log.Println("connected, joining", channel)
81 7cc05214 2021-04-27 op conn.Join(channel)
84 7cc05214 2021-04-27 op c.HandleFunc(irc.PRIVMSG, dostuff)
85 7cc05214 2021-04-27 op c.HandleFunc(irc.ACTION, dostuff)
87 7cc05214 2021-04-27 op quit := make(chan bool)
89 7cc05214 2021-04-27 op c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) {
93 7cc05214 2021-04-27 op if err := c.Connect(); err != nil {
94 7cc05214 2021-04-27 op log.Fatalln("connection error:", err)