Blame
Date:
Fri Jul 30 13:39:45 2021 UTC
Message:
typo
001
2021-04-27
op
package main
002
2021-04-27
op
003
2021-04-27
op
import (
004
2021-04-27
op
"crypto/tls"
005
2021-04-27
op
"flag"
006
2021-04-27
op
"fmt"
007
2021-04-27
op
"io"
008
2021-04-27
op
"io/ioutil"
009
2021-04-27
op
"log"
010
2021-04-27
op
"net/http"
011
2021-07-30
op
"path"
012
2021-04-27
op
"path/filepath"
013
2021-04-27
op
"regexp"
014
2021-04-27
op
015
2021-04-27
op
irc "github.com/fluffle/goirc/client"
016
2021-04-27
op
)
017
2021-04-27
op
018
2021-04-27
op
var (
019
2021-04-27
op
baseurl = flag.String("baseurl", "gemini://m2i.omarpolo.com", "base url")
020
2021-04-27
op
matrixOutDir = flag.String("matrix-out", "", "matrix out directory")
021
2021-04-27
op
022
2021-07-30
op
msgRe = regexp.MustCompile(`https://.*/[^\s]+\.(txt|png|jpg|jpeg|gif)`)
023
2021-07-30
op
channel = "#gemini-it"
024
2021-04-27
op
)
025
2021-04-27
op
026
2021-04-27
op
func matrix2gemini(conn *irc.Conn, line *irc.Line) {
027
2021-07-30
op
matches := msgRe.FindAllString(line.Text(), -1)
028
2021-04-27
op
029
2021-04-27
op
// it's not a good idea to defer inside a loop, but we know
030
2021-04-27
op
// len(matches) is small (usually just 1). Morover, I like
031
2021-04-27
op
// living in danger!
032
2021-04-27
op
033
2021-04-27
op
for _, link := range matches {
034
2021-04-27
op
resp, err := http.Get(link)
035
2021-04-27
op
if err != nil {
036
2021-04-27
op
conn.Privmsg(
037
2021-04-27
op
channel,
038
2021-04-27
op
fmt.Sprintf("failed to download %q: %s", link, err),
039
2021-04-27
op
)
040
2021-04-27
op
continue
041
2021-04-27
op
}
042
2021-04-27
op
defer resp.Body.Close()
043
2021-04-27
op
044
2021-07-30
op
ext := path.Ext(link)
045
2021-07-30
op
tmpfile, err := ioutil.TempFile(*matrixOutDir, "message-*" + ext)
046
2021-04-27
op
if err != nil {
047
2021-04-27
op
conn.Privmsg(channel, fmt.Sprintf("failed to tmpfile: %s", err))
048
2021-04-27
op
return
049
2021-04-27
op
}
050
2021-04-27
op
defer tmpfile.Close()
051
2021-04-27
op
052
2021-04-27
op
io.Copy(tmpfile, resp.Body)
053
2021-04-27
op
054
2021-04-27
op
conn.Privmsg(
055
2021-04-27
op
channel,
056
2021-04-27
op
fmt.Sprintf(
057
2021-04-27
op
"better: %s/%s",
058
2021-04-27
op
*baseurl,
059
2021-04-27
op
filepath.Base(tmpfile.Name()),
060
2021-04-27
op
),
061
2021-04-27
op
)
062
2021-04-27
op
}
063
2021-04-27
op
}
064
2021-04-27
op
065
2021-04-27
op
func dostuff(conn *irc.Conn, line *irc.Line) {
066
2021-04-27
op
matrix2gemini(conn, line)
067
2021-04-27
op
// ...
068
2021-04-27
op
}
069
2021-04-27
op
070
2021-04-27
op
func main() {
071
2021-04-27
op
flag.Parse()
072
2021-04-27
op
073
2021-04-27
op
cfg := irc.NewConfig("gemitbot")
074
2021-04-27
op
cfg.SSL = true
075
2021-07-30
op
cfg.SSLConfig = &tls.Config{ServerName: "irc.libera.chat"}
076
2021-07-30
op
cfg.Server = "irc.libera.chat:7000"
077
2021-04-27
op
cfg.NewNick = func(n string) string { return n + "^" }
078
2021-04-27
op
079
2021-04-27
op
c := irc.Client(cfg)
080
2021-04-27
op
081
2021-04-27
op
c.HandleFunc(irc.CONNECTED, func(conn *irc.Conn, line *irc.Line) {
082
2021-04-27
op
log.Println("connected, joining", channel)
083
2021-04-27
op
conn.Join(channel)
084
2021-04-27
op
})
085
2021-04-27
op
086
2021-04-27
op
c.HandleFunc(irc.PRIVMSG, dostuff)
087
2021-04-27
op
c.HandleFunc(irc.ACTION, dostuff)
088
2021-04-27
op
089
2021-04-27
op
quit := make(chan bool)
090
2021-04-27
op
091
2021-04-27
op
c.HandleFunc(irc.DISCONNECTED, func(conn *irc.Conn, line *irc.Line) {
092
2021-04-27
op
quit <- true
093
2021-04-27
op
})
094
2021-04-27
op
095
2021-04-27
op
if err := c.Connect(); err != nil {
096
2021-04-27
op
log.Fatalln("connection error:", err)
097
2021-04-27
op
}
098
2021-04-27
op
099
2021-04-27
op
<-quit
100
2021-04-27
op
}
Omar Polo