diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-06-17 13:38:38 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-06-17 13:38:38 -0400 |
| commit | 24f5fb57f3e36ff2f6150468c4cb10c4f5bb282c (patch) | |
| tree | 80ae280ac54c1cdf36b43210f6e1dee062edf534 /cmd | |
| parent | acad94fc2d42f295e25d5a2d33d8be78290bc3a8 (diff) | |
| download | x-24f5fb57f3e36ff2f6150468c4cb10c4f5bb282c.tar.xz x-24f5fb57f3e36ff2f6150468c4cb10c4f5bb282c.zip | |
cmd/marabot: move emoji copying to another binaryv1.5.0
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/marabot/copyemoji/main.go | 110 | ||||
| -rw-r--r-- | cmd/marabot/discord.go | 6 | ||||
| -rw-r--r-- | cmd/marabot/main.go | 17 | ||||
| -rw-r--r-- | cmd/marabot/schema.sql | 13 |
4 files changed, 137 insertions, 9 deletions
diff --git a/cmd/marabot/copyemoji/main.go b/cmd/marabot/copyemoji/main.go new file mode 100644 index 0000000..13d240d --- /dev/null +++ b/cmd/marabot/copyemoji/main.go @@ -0,0 +1,110 @@ +package main + +import ( + "context" + "database/sql" + "flag" + "io" + "net/http" + + _ "modernc.org/sqlite" + "within.website/ln" + "within.website/ln/opname" + "within.website/x/internal" + "within.website/x/web/revolt" +) + +var ( + dbFile = flag.String("db-file", "../marabot.db", "Path to the database file") + furryholeDiscord = flag.String("furryhole-discord", "192289762302754817", "Discord channel ID for furryhole") + furryholeRevolt = flag.String("furryhole-revolt", "01FEXZ1XPWMEJXMF836FP16HB8", "Revolt channel ID for furryhole") + revoltEmail = flag.String("revolt-email", "", "Email for Revolt") + revoltPassword = flag.String("revolt-password", "", "Password for Revolt") + revoltAPIServer = flag.String("revolt-api-server", "https://api.revolt.chat", "API server for Revolt") + revoltWebsocketServer = flag.String("revolt-ws-server", "wss://ws.revolt.chat", "Websocket server for Revolt") +) + +func main() { + internal.HandleStartup() + + ctx, cancel := context.WithCancel(opname.With(context.Background(), "marabot.copyemoji")) + defer cancel() + + ln.Log(ctx, ln.Action("starting up")) + + db, err := sql.Open("sqlite", *dbFile) + if err != nil { + ln.FatalErr(ctx, err, ln.Action("opening sqlite database")) + } + defer db.Close() + + cli, err := revolt.NewWithEndpoint("", *revoltAPIServer, *revoltWebsocketServer) + if err != nil { + ln.FatalErr(ctx, err, ln.Action("creating revolt client")) + } + cli.SelfBot = &revolt.SelfBot{ + Email: *revoltEmail, + Password: *revoltPassword, + } + + if err := cli.Auth(ctx, "marabot-copyemoji"); err != nil { + ln.FatalErr(ctx, err, ln.Action("authing to revolt")) + } + + rows, err := db.QueryContext(ctx, "SELECT id, name, url FROM discord_emoji WHERE guild_id = ? AND id NOT IN ( SELECT discord_id FROM revolt_discord_emoji )", furryholeDiscord) + if err != nil { + ln.FatalErr(ctx, err, ln.Action("querying discord_emoji")) + } + defer rows.Close() + + for rows.Next() { + var id, name, url string + if err := rows.Scan(&id, &name, &url); err != nil { + ln.FatalErr(ctx, err, ln.Action("scanning discord_emoji")) + } + + resp, err := http.Get(url) + if err != nil { + ln.Error(ctx, err, ln.F{"url": url}, ln.Action("downloading emoji")) + continue + } + defer resp.Body.Close() + + data, err := io.ReadAll(resp.Body) + if err != nil { + ln.Error(ctx, err, ln.F{"url": url}, ln.Action("reading emoji body")) + continue + } + + uploadID, err := cli.Upload(ctx, "emojis", name+".webp", data) + if err != nil { + ln.Error(ctx, err, ln.F{"url": url}, ln.Action("uploading emoji")) + continue + } + + emoji, err := cli.CreateEmoji(ctx, uploadID, revolt.CreateEmoji{ + Name: name, + NSFW: false, + Parent: revolt.Parent{ + ID: *furryholeRevolt, + Type: "Server", + }, + }) + if err != nil { + ln.Error(ctx, err, ln.F{"url": url}, ln.Action("creating emoji on revolt")) + continue + } + + if _, err := db.ExecContext(ctx, "INSERT INTO revolt_emoji (id, server_id, name, url) VALUES (?, ?, ?, ?)", emoji.ID, furryholeRevolt, emoji.Name, emoji.URL); err != nil { + ln.Error(ctx, err, ln.F{"id": emoji.ID}, ln.Action("inserting emoji")) + continue + } + + if _, err := db.ExecContext(ctx, "INSERT INTO revolt_discord_emoji(revolt_id, discord_id, name) VALUES (?, ?, ?)", emoji.ID, id, name); err != nil { + ln.Error(ctx, err, ln.F{"id": emoji.ID}, ln.Action("inserting emoji join record")) + continue + } + + ln.Log(ctx, ln.Info("created emoji"), ln.F{"id": emoji.ID, "name": emoji.Name}) + } +} diff --git a/cmd/marabot/discord.go b/cmd/marabot/discord.go index 77a9331..d9495df 100644 --- a/cmd/marabot/discord.go +++ b/cmd/marabot/discord.go @@ -12,7 +12,7 @@ import ( func importDiscordData(ctx context.Context, db *sql.DB, dg *discordgo.Session) error { ctx = opname.With(ctx, "import-discord-data") - channels, err := dg.GuildChannels(furryholeDiscord) + channels, err := dg.GuildChannels(*furryholeDiscord) if err != nil { return err } @@ -24,7 +24,7 @@ func importDiscordData(ctx context.Context, db *sql.DB, dg *discordgo.Session) e } } - roles, err := dg.GuildRoles(furryholeDiscord) + roles, err := dg.GuildRoles(*furryholeDiscord) if err != nil { return err } @@ -37,7 +37,7 @@ func importDiscordData(ctx context.Context, db *sql.DB, dg *discordgo.Session) e } // https://cdn.discordapp.com/emojis/664686615616290816.webp?size=240&quality=lossless - emoji, err := dg.GuildEmojis(furryholeDiscord) + emoji, err := dg.GuildEmojis(*furryholeDiscord) if err != nil { return err } diff --git a/cmd/marabot/main.go b/cmd/marabot/main.go index 6f2f072..3c5511a 100644 --- a/cmd/marabot/main.go +++ b/cmd/marabot/main.go @@ -29,15 +29,16 @@ var ( tsAuthkey = flag.String("ts-authkey", "", "Tailscale authkey") tsHostname = flag.String("ts-hostname", "", "Tailscale hostname") + adminDiscordUser = flag.String("admin-discord-user", "", "Discord user ID of the admin") + adminRevoltUser = flag.String("admin-revolt-user", "", "Revolt user ID of the admin") + + furryholeDiscord = flag.String("furryhole-discord", "192289762302754817", "Discord channel ID for furryhole") + furryholeRevolt = flag.String("furryhole-revolt", "01FEXZ1XPWMEJXMF836FP16HB8", "Revolt channel ID for furryhole") + //go:embed schema.sql dbSchema string ) -const ( - furryholeDiscord = "192289762302754817" - furryholeRevolt = "01H2VRKJFPYPEAE438B6JRFSCP" -) - func main() { internal.HandleStartup() @@ -63,7 +64,10 @@ func main() { go NewIRCBot(ctx, db, ircmsgs) // Init a new client. - client := revolt.NewWithEndpoint(*revoltToken, *revoltAPIServer, *revoltWebsocketServer) + client, err := revolt.NewWithEndpoint(*revoltToken, *revoltAPIServer, *revoltWebsocketServer) + if err != nil { + ln.FatalErr(ctx, err, ln.Action("creating revolt client")) + } mr := &MaraRevolt{ cli: client, @@ -185,5 +189,6 @@ func (mr *MaraRevolt) MessageCreate(ctx context.Context, msg *revolt.Message) er return err } } + return nil } diff --git a/cmd/marabot/schema.sql b/cmd/marabot/schema.sql index 15d884d..05a7f56 100644 --- a/cmd/marabot/schema.sql +++ b/cmd/marabot/schema.sql @@ -77,3 +77,16 @@ CREATE TABLE IF NOT EXISTS irc_messages ( content TEXT NOT NULL, tags TEXT NOT NULL ); + +CREATE TABLE IF NOT EXISTS revolt_emoji ( + id TEXT PRIMARY KEY, + server_id TEXT NOT NULL, + name TEXT NOT NULL, + url TEXT NOT NULL +); + +CREATE TABLE IF NOT EXISTS revolt_discord_emoji ( + revolt_id TEXT NOT NULL, + discord_id TEXT NOT NULL, + name TEXT NOT NULL +);
\ No newline at end of file |
