feat(cli): refactor the cli to use discord bot struct and database

This commit is contained in:
Gustavo "Guz" L. de Mello
2024-08-13 21:10:53 -03:00
parent 30654384af
commit 1d98883488

135
main.go
View File

@@ -1,16 +1,13 @@
package main
import (
"database/sql"
"fmt"
"dislate/internals/discord"
"dislate/internals/guilddb"
"dislate/internals/translator"
"log"
"os"
"os/signal"
"slices"
"syscall"
"github.com/bwmarrin/discordgo"
_ "github.com/tursodatabase/go-libsql"
)
const DEST_CHANNEL = "1270407366617333920"
@@ -20,7 +17,7 @@ const USER_WEBHOOK_FORMAT = "dislate-user-%s"
func main() {
log.Printf("Hello, world")
db, err := sql.Open("libsql", "file:./guild.db")
db, err := guilddb.NewSQLiteDB("file:./guild.db")
if err != nil {
log.Printf("ERROR: failed to open database %s", err)
return
@@ -33,133 +30,25 @@ func main() {
}
}()
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS MessageMap (
Original text NOT NULL PRIMARY KEY UNIQUE,
Translated text NOT NULL UNIQUE
);
`)
if err != nil {
log.Printf("ERROR: failed to create MessageMap table %s", err)
if err := db.Prepare(); err != nil {
log.Printf("ERROR: failed to prepare database: %s", err)
return
}
discord, err := discordgo.New("Bot " + os.Getenv("DISCORD_TOKEN"))
bot, err := discord.NewBot(os.Getenv(""), db, translator.NewMockTranslator())
if err != nil {
log.Printf("ERROR: failed to start bot %s", err)
log.Printf("ERROR: failed to create discord bot: %s", err)
return
}
discord.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.ChannelID != INPUT_CHANNEL {
return
}
if m.Author.Bot {
return
}
ws, err := s.ChannelWebhooks(DEST_CHANNEL)
if err != nil {
log.Printf("ERROR: failed to find channel webhooks: %s", err)
return
}
var w *discordgo.Webhook
if wi := slices.IndexFunc(ws, func(w *discordgo.Webhook) bool {
return w.Name == fmt.Sprintf(USER_WEBHOOK_FORMAT, m.Author.ID)
}); wi == -1 {
w, err = s.WebhookCreate(
DEST_CHANNEL,
fmt.Sprintf(USER_WEBHOOK_FORMAT, m.Author.ID),
m.Author.AvatarURL(""),
)
if err != nil {
log.Printf("ERROR: failed to create webhook for user %s: %s", m.Author.ID, err)
return
}
} else {
w = ws[wi]
}
wm, err := s.WebhookExecute(w.ID, w.Token, true, &discordgo.WebhookParams{
Username: m.Author.GlobalName,
AvatarURL: m.Author.AvatarURL(""),
Content: m.Content,
})
if err != nil {
log.Printf("ERROR: failed to message using webhook for user %s: %s", m.Author.ID, err)
return
}
_, err = db.Exec(`
INSERT INTO MessageMap (Original, Translated)
VALUES ($1, $2) ON CONFLICT DO NOTHING
`, m.ID, wm.ID)
if err != nil {
log.Printf("ERROR: failed add message to database. Original: %s, Translated: %s: %s", m.ID, wm.ID, err)
return
}
})
discord.AddHandler(func(s *discordgo.Session, m *discordgo.MessageUpdate) {
if m.Author.Bot {
return
}
q := db.QueryRow(`
SELECT * FROM MessageMap
WHERE "Original" = $1
`, m.ID)
var original, translated string
err := q.Scan(&original, &translated)
if err != nil {
log.Printf("ERROR: failed query message to database. Original: %s: %s", m.ID, err)
return
}
ws, err := s.ChannelWebhooks(DEST_CHANNEL)
if err != nil {
log.Printf("ERROR: failed to find channel webhooks: %s", err)
return
}
var w *discordgo.Webhook
if wi := slices.IndexFunc(ws, func(w *discordgo.Webhook) bool {
return w.Name == fmt.Sprintf(USER_WEBHOOK_FORMAT, m.Author.ID)
}); wi == -1 {
w, err = s.WebhookCreate(
DEST_CHANNEL,
fmt.Sprintf(USER_WEBHOOK_FORMAT, m.Author.ID),
m.Author.AvatarURL(""),
)
if err != nil {
log.Printf("ERROR: failed to create webhook for user %s: %s", m.Author.ID, err)
return
}
} else {
w = ws[wi]
}
_, err = s.WebhookMessageEdit(w.ID, w.Token, translated, &discordgo.WebhookEdit{
Content: &m.Content,
})
if err != nil {
log.Printf("ERROR: failed to edit webhook message, Original %s, Translated %s: %s", m.ID, translated, err)
return
}
})
err = discord.Open()
if err != nil {
log.Printf("could not open session: %s", err)
if err := bot.Start(); err != nil {
log.Printf("ERROR: failed to start discord bot: %s", err)
return
}
log.Printf("Bot session opened successfully")
defer func() {
err = discord.Close()
if err != nil {
log.Printf("could not close session: %s", err)
if err := bot.Stop(); err != nil {
log.Printf("ERROR: failed to stop discord bot: %s", err)
return
}
log.Printf("Bot session closed successfully")
}()
sig := make(chan os.Signal, 1)