Blob


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