Blame


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