1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
package irc
import (
"context"
"crypto/tls"
"flag"
"fmt"
"log/slog"
"github.com/bwmarrin/discordgo"
ircevent "github.com/thoj/go-ircevent"
)
var (
discordAnnounceChannel = flag.String("discord-announce-channel", "", "Discord channel to announce in")
ircServer = flag.String("irc-server", "irc.libera.chat:6697", "IRC server to connect to")
ircUsername = flag.String("irc-username", "[Mara]", "IRC username")
ircIdent = flag.String("irc-ident", "mara", "IRC ident")
ircPassword = flag.String("irc-password", "", "IRC password")
ircChannel = flag.String("irc-channel", "#mimi", "IRC channel to join")
)
type Module struct {
conn *ircevent.Connection
dg *discordgo.Session
}
func New(ctx context.Context, dg *discordgo.Session) (*Module, error) {
conn := ircevent.IRC(*ircUsername, *ircIdent)
conn.UseTLS = true
conn.UseSASL = false
conn.SASLLogin = *ircUsername
conn.SASLPassword = *ircPassword
conn.SASLMech = "PLAIN"
conn.TLSConfig = &tls.Config{
ServerName: "irc.libera.chat",
}
conn.AddCallback("001", func(e *ircevent.Event) {
conn.Privmsgf("NickServ", "IDENTIFY %s %s", *ircUsername, *ircPassword)
})
conn.AddCallback("900", func(e *ircevent.Event) {
conn.Join(*ircChannel)
slog.Debug("joined channel", "channel", *ircChannel)
})
if err := conn.Connect(*ircServer); err != nil {
return nil, fmt.Errorf("irc: error connecting to IRC server: %w", err)
}
go func() {
<-ctx.Done()
conn.Quit()
}()
go func() {
for {
select {
case <-ctx.Done():
return
case err := <-conn.Error:
slog.Error("error from IRC server", "err", err)
}
}
}()
return &Module{
conn: conn,
dg: dg,
}, nil
}
|