diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-06-17 09:09:54 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-06-17 09:09:54 -0400 |
| commit | acad94fc2d42f295e25d5a2d33d8be78290bc3a8 (patch) | |
| tree | c89e5dbf50580e35279f555573231f302668020b /cmd | |
| parent | 1e4998c429d2cf40f947d8bd8ce29691ec102ff1 (diff) | |
| download | x-acad94fc2d42f295e25d5a2d33d8be78290bc3a8.tar.xz x-acad94fc2d42f295e25d5a2d33d8be78290bc3a8.zip | |
gomod2nix update
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/marabot/discord.go | 52 | ||||
| -rw-r--r-- | cmd/marabot/irc.go | 65 | ||||
| -rw-r--r-- | cmd/marabot/main.go | 38 | ||||
| -rw-r--r-- | cmd/marabot/schema.sql | 10 |
4 files changed, 133 insertions, 32 deletions
diff --git a/cmd/marabot/discord.go b/cmd/marabot/discord.go new file mode 100644 index 0000000..77a9331 --- /dev/null +++ b/cmd/marabot/discord.go @@ -0,0 +1,52 @@ +package main + +import ( + "context" + "database/sql" + "fmt" + + "github.com/bwmarrin/discordgo" + "within.website/ln" + "within.website/ln/opname" +) + +func importDiscordData(ctx context.Context, db *sql.DB, dg *discordgo.Session) error { + ctx = opname.With(ctx, "import-discord-data") + channels, err := dg.GuildChannels(furryholeDiscord) + if err != nil { + return err + } + + for _, ch := range channels { + if _, err := db.Exec("INSERT INTO discord_channels (id, guild_id, name, topic, nsfw) VALUES (?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, topic = EXCLUDED.topic, nsfw = EXCLUDED.nsfw", ch.ID, ch.GuildID, ch.Name, ch.Topic, ch.NSFW); err != nil { + ln.Error(ctx, err, ln.F{"channel_name": ch.Name, "channel_id": ch.ID}) + continue + } + } + + roles, err := dg.GuildRoles(furryholeDiscord) + if err != nil { + return err + } + + for _, role := range roles { + if _, err := db.ExecContext(ctx, "INSERT INTO discord_roles (guild_id, id, name, color, hoist, position) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, color = EXCLUDED.color, position = EXCLUDED.position", furryholeDiscord, role.ID, role.Name, fmt.Sprintf("#%06x", role.Color), role.Hoist, role.Position); err != nil { + ln.Error(ctx, err, ln.Action("inserting role")) + continue + } + } + + // https://cdn.discordapp.com/emojis/664686615616290816.webp?size=240&quality=lossless + emoji, err := dg.GuildEmojis(furryholeDiscord) + if err != nil { + return err + } + for _, emoji := range emoji { + if _, err := db.ExecContext(ctx, "INSERT INTO discord_emoji (id, guild_id, name, url) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, url = EXCLUDED.url", emoji.ID, furryholeDiscord, emoji.Name, fmt.Sprintf("https://cdn.discordapp.com/emojis/%s.webp?size=240&quality=lossless", emoji.ID)); err != nil { + ln.Error(ctx, err, ln.Action("inserting emoji")) + continue + } + } + + return nil +} diff --git a/cmd/marabot/irc.go b/cmd/marabot/irc.go new file mode 100644 index 0000000..51479c6 --- /dev/null +++ b/cmd/marabot/irc.go @@ -0,0 +1,65 @@ +package main + +import ( + "context" + "database/sql" + "flag" + + irc "github.com/thoj/go-ircevent" + "within.website/ln" + "within.website/ln/opname" +) + +var ( + ircNick = flag.String("irc-nick", "[Mara]", "IRC nickname") + ircUser = flag.String("irc-user", "sh0rk", "IRC username") + ircReal = flag.String("irc-real", "Friendly sh0rk Mara", "IRC realname") + ircServer = flag.String("irc-server", "chrysalis:6667", "IRC server to connect to") + ircSASLUsername = flag.String("irc-sasl-username", "", "SASL username") + ircSASLPassword = flag.String("irc-sasl-password", "", "SASL password") +) + +func NewIRCBot(ctx context.Context, db *sql.DB, messages chan string) { + ctx = opname.With(ctx, "ircbot") + ctx = ln.WithF(ctx, ln.F{ + "irc_server": *ircServer, + }) + for { + irccon := irc.IRC(*ircNick, *ircUser) + go func() { + <-ctx.Done() + irccon.Disconnect() + }() + + go func() { + for { + select { + case <-ctx.Done(): + return + case msg := <-messages: + irccon.Privmsg("#xeserv", msg) + } + } + }() + + if *ircSASLUsername != "" && *ircSASLPassword != "" { + irccon.UseSASL = true + irccon.SASLLogin = *ircSASLUsername + irccon.SASLPassword = *ircSASLPassword + irccon.SASLMech = "plain" + } + + irccon.AddCallback("001", func(e *irc.Event) { irccon.Join("#xeserv") }) + irccon.AddCallback("PRIVMSG", func(e *irc.Event) { + if _, err := db.ExecContext(ctx, `INSERT INTO irc_messages(nick, user, host, channel, content, tags) VALUES (?, ?, ?, ?, ?, ?)`, e.Nick, e.User, e.Host, e.Arguments[0], e.Message(), ""); err != nil { + ln.Error(ctx, err) + } + }) + err := irccon.Connect(*ircServer) + if err != nil { + ln.Error(ctx, err) + return + } + irccon.Loop() + } +} diff --git a/cmd/marabot/main.go b/cmd/marabot/main.go index 5a6ea2b..6f2f072 100644 --- a/cmd/marabot/main.go +++ b/cmd/marabot/main.go @@ -58,6 +58,10 @@ func main() { ln.FatalErr(ctx, err, ln.Action("running database schema")) } + ircmsgs := make(chan string) + + go NewIRCBot(ctx, db, ircmsgs) + // Init a new client. client := revolt.NewWithEndpoint(*revoltToken, *revoltAPIServer, *revoltWebsocketServer) @@ -81,38 +85,8 @@ func main() { } defer dg.Close() - channels, err := dg.GuildChannels(furryholeDiscord) - if err == nil { - for _, ch := range channels { - if _, err := mr.db.Exec("INSERT INTO discord_channels (id, guild_id, name, topic, nsfw) VALUES (?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, topic = EXCLUDED.topic, nsfw = EXCLUDED.nsfw", ch.ID, ch.GuildID, ch.Name, ch.Topic, ch.NSFW); err != nil { - ln.Error(ctx, err, ln.F{"channel_name": ch.Name, "channel_id": ch.ID}) - continue - } - } - } - - roles, err := dg.GuildRoles(furryholeDiscord) - if err != nil { - ln.FatalErr(ctx, err, ln.Action("getting guild roles")) - } - - for _, role := range roles { - if _, err := db.ExecContext(ctx, "INSERT INTO discord_roles (guild_id, id, name, color, hoist, position) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, color = EXCLUDED.color, position = EXCLUDED.position", furryholeDiscord, role.ID, role.Name, fmt.Sprintf("#%06x", role.Color), role.Hoist, role.Position); err != nil { - ln.Error(ctx, err, ln.Action("inserting role")) - continue - } - } - - // https://cdn.discordapp.com/emojis/664686615616290816.webp?size=240&quality=lossless - emoji, err := dg.GuildEmojis(furryholeDiscord) - if err != nil { - ln.FatalErr(ctx, err, ln.Action("getting guild emoji")) - } - for _, emoji := range emoji { - if _, err := db.ExecContext(ctx, "INSERT INTO discord_emoji (id, guild_id, name, url) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = EXCLUDED.name, url = EXCLUDED.url", emoji.ID, furryholeDiscord, emoji.Name, fmt.Sprintf("https://cdn.discordapp.com/emojis/%s.webp?size=240&quality=lossless", emoji.ID)); err != nil { - ln.Error(ctx, err, ln.Action("inserting emoji")) - continue - } + if err := importDiscordData(ctx, db, dg); err != nil { + ln.Error(ctx, err) } // Wait for close. diff --git a/cmd/marabot/schema.sql b/cmd/marabot/schema.sql index 10a01fd..15d884d 100644 --- a/cmd/marabot/schema.sql +++ b/cmd/marabot/schema.sql @@ -67,3 +67,13 @@ CREATE TABLE IF NOT EXISTS discord_emoji ( name TEXT NOT NULL, url TEXT NOT NULL ); + +CREATE TABLE IF NOT EXISTS irc_messages ( + id SERIAL PRIMARY KEY, + nick TEXT NOT NULL, + user TEXT NOT NULL, + host TEXT NOT NULL, + channel TEXT NOT NULL, + content TEXT NOT NULL, + tags TEXT NOT NULL +); |
