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 | |
| parent | 1e4998c429d2cf40f947d8bd8ce29691ec102ff1 (diff) | |
| download | x-acad94fc2d42f295e25d5a2d33d8be78290bc3a8.tar.xz x-acad94fc2d42f295e25d5a2d33d8be78290bc3a8.zip | |
gomod2nix update
Signed-off-by: Xe Iaso <me@xeiaso.net>
| -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 | ||||
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 3 | ||||
| -rw-r--r-- | gomod2nix.toml | 3 |
7 files changed, 140 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 +); @@ -48,6 +48,7 @@ require ( github.com/google/uuid v1.3.0 // indirect github.com/mattn/go-isatty v0.0.18 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/thoj/go-ircevent v0.0.0-20210723090443-73e444401d64 // indirect lukechampine.com/uint128 v1.2.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect @@ -465,6 +465,8 @@ github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ0 github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= github.com/tetratelabs/wazero v1.2.0 h1:I/8LMf4YkCZ3r2XaL9whhA0VMyAvF6QE+O7rco0DCeQ= github.com/tetratelabs/wazero v1.2.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/thoj/go-ircevent v0.0.0-20210723090443-73e444401d64 h1:l/T7dYuJEQZOwVOpjIXr1180aM9PZL/d1MnMVIxefX4= +github.com/thoj/go-ircevent v0.0.0-20210723090443-73e444401d64/go.mod h1:Q1NAJOuRdQCqN/VIWdnaaEhV8LpeO2rtlBP7/iDJNII= github.com/tmc/scp v0.0.0-20170824174625-f7b48647feef h1:7D6Nm4D6f0ci9yttWaKjM1TMAXrH5Su72dojqYGntFY= github.com/tmc/scp v0.0.0-20170824174625-f7b48647feef/go.mod h1:WLFStEdnJXpjK8kd4qKLwQKX/1vrDzp5BcDyiZJBHJM= github.com/twitchyliquid64/golang-asm v0.0.0-20190126203739-365674df15fc/go.mod h1:NoCfSFWosfqMqmmD7hApkirIK9ozpHjxRnRxs1l413A= @@ -595,6 +597,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= diff --git a/gomod2nix.toml b/gomod2nix.toml index 2953a58..705c1ee 100644 --- a/gomod2nix.toml +++ b/gomod2nix.toml @@ -316,6 +316,9 @@ schema = 3 [mod."github.com/tetratelabs/wazero"] version = "v1.2.0" hash = "sha256-fEutqeRE/JD53g249+Gs//R19SjV7bnD80/0DKpfrAo=" + [mod."github.com/thoj/go-ircevent"] + version = "v0.0.0-20210723090443-73e444401d64" + hash = "sha256-gwYmlaF6DG5HcI4RoztWoyzb2952tdHA9vEu4gVdDVY=" [mod."github.com/tmc/scp"] version = "v0.0.0-20170824174625-f7b48647feef" hash = "sha256-qHwQb3JA43VVhJdB18/2zXbxqW/bgw1yvr8YhqFyd74=" |
