aboutsummaryrefslogtreecommitdiff
path: root/cmd/mimi/modules/irc/irc.go
blob: 3f7edbbc7908941510c36ea5cb6c81c0d718c833 (plain)
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
}