aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-06-17 09:09:54 -0400
committerXe Iaso <me@xeiaso.net>2023-06-17 09:09:54 -0400
commitacad94fc2d42f295e25d5a2d33d8be78290bc3a8 (patch)
treec89e5dbf50580e35279f555573231f302668020b /cmd
parent1e4998c429d2cf40f947d8bd8ce29691ec102ff1 (diff)
downloadx-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.go52
-rw-r--r--cmd/marabot/irc.go65
-rw-r--r--cmd/marabot/main.go38
-rw-r--r--cmd/marabot/schema.sql10
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
+);