aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-06-17 13:38:38 -0400
committerXe Iaso <me@xeiaso.net>2023-06-17 13:38:38 -0400
commit24f5fb57f3e36ff2f6150468c4cb10c4f5bb282c (patch)
tree80ae280ac54c1cdf36b43210f6e1dee062edf534 /cmd
parentacad94fc2d42f295e25d5a2d33d8be78290bc3a8 (diff)
downloadx-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.go110
-rw-r--r--cmd/marabot/discord.go6
-rw-r--r--cmd/marabot/main.go17
-rw-r--r--cmd/marabot/schema.sql13
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