Handle removing emojis

This commit is contained in:
Daniel Mason 2025-02-12 17:02:42 +13:00
parent 08d83ef87f
commit 9103c4710c
Signed by: idanoo
GPG key ID: 387387CDBC02F132
3 changed files with 56 additions and 7 deletions

View file

@ -54,7 +54,9 @@ func (bot *Bot) Start() error {
}) })
// Add handlers // Add handlers
bot.DiscordSession.AddHandler(bot.HandleReaction) bot.DiscordSession.AddHandler(bot.HandleAddReaction)
bot.DiscordSession.AddHandler(bot.HandleRemoveReaction)
bot.DiscordSession.AddHandler(bot.HandleRemoveAllReaction)
// Load session // Load session
err = discord.Open() err = discord.Open()
@ -80,14 +82,35 @@ func (bot *Bot) Start() error {
} }
// HandleReaction - Simply log it // HandleReaction - Simply log it
func (bot *Bot) HandleReaction(discord *discordgo.Session, reaction *discordgo.MessageReactionAdd) { func (bot *Bot) HandleAddReaction(discord *discordgo.Session, reaction *discordgo.MessageReactionAdd) {
// Ignore Dyno user // Ignore Dyno user
if reaction.UserID == dynoUserID { if reaction.UserID == dynoUserID {
return return
} }
err := bot.Db.LogEmojiUsage(reaction.GuildID, reaction.ChannelID, reaction.UserID, reaction.Emoji.Name) err := bot.Db.LogEmojiUsage(reaction.GuildID, reaction.ChannelID, reaction.MessageID, reaction.UserID, reaction.Emoji.Name)
if err != nil { if err != nil {
slog.Error("Failed to log emoji usage", "err", err) slog.Error("Failed to log emoji usage", "err", err)
} }
} }
// HandleRemoveReaction - Remove for user/message/emoji
func (bot *Bot) HandleRemoveReaction(discord *discordgo.Session, reaction *discordgo.MessageReactionRemove) {
// Ignore Dyno user
if reaction.UserID == dynoUserID {
return
}
err := bot.Db.DeleteEmojiUsage(reaction.GuildID, reaction.ChannelID, reaction.MessageID, reaction.UserID, reaction.Emoji.Name)
if err != nil {
slog.Error("Failed to delete single emoji usage", "err", err)
}
}
// HandleRemoveAllReaction - Remove all for message
func (bot *Bot) HandleRemoveAllReaction(discord *discordgo.Session, reaction *discordgo.MessageReactionRemoveAll) {
err := bot.Db.DeleteEmojiAll(reaction.GuildID, reaction.ChannelID, reaction.MessageID)
if err != nil {
slog.Error("Failed to delete all emoji usage for message", "err", err)
}
}

View file

@ -41,9 +41,10 @@ func (db *Database) runMigrations() (*Database, error) {
"`id` INTEGER PRIMARY KEY AUTOINCREMENT, " + "`id` INTEGER PRIMARY KEY AUTOINCREMENT, " +
"`guild_id` TEXT, " + "`guild_id` TEXT, " +
"`channel_id` TEXT, " + "`channel_id` TEXT, " +
"`message_id` TEXT, " +
"`user_id` TEXT, " + "`user_id` TEXT, " +
"`emoji_id` TEXT, " + "`emoji_id` TEXT, " +
"`timestamp` DATETIME, `viewed` INT DEFAULT 0" + "`timestamp` DATETIME" +
")") ")")
if err != nil { if err != nil {
return db, err return db, err
@ -54,6 +55,11 @@ func (db *Database) runMigrations() (*Database, error) {
return db, err return db, err
} }
_, err = db.db.Exec("CREATE INDEX IF NOT EXISTS `idx_emoji_usage_message_id_user_id_emoji_id` ON `emoji_usage` (`message_id`, `user_id`, `guild_id`, `emoji_id`)")
if err != nil {
return db, err
}
_, err = db.db.Exec("CREATE INDEX IF NOT EXISTS `idx_emoji_usage_emoji_id,guild_id` ON `emoji_usage` (`guild_id`, `emoji_id`)") _, err = db.db.Exec("CREATE INDEX IF NOT EXISTS `idx_emoji_usage_emoji_id,guild_id` ON `emoji_usage` (`guild_id`, `emoji_id`)")
return db, err return db, err
} }

View file

@ -6,10 +6,30 @@ type EmojiMap struct {
} }
// LogEmojiUsage - Log usage // LogEmojiUsage - Log usage
func (db *Database) LogEmojiUsage(guildID, channelID, userID, emojiID string) error { func (db *Database) LogEmojiUsage(guildID, channelID, messageID, userID, emojiID string) error {
_, err := db.db.Exec( _, err := db.db.Exec(
"INSERT INTO `emoji_usage` (`guild_id`, `channel_id`, `user_id`, `emoji_id`, `timestamp`) VALUES (?,?,?,?, datetime())", "INSERT INTO `emoji_usage` (`guild_id`, `channel_id`, `message_id`, `user_id`, `emoji_id`, `timestamp`) VALUES (?,?,?,?,?, datetime())",
guildID, channelID, userID, emojiID, guildID, channelID, messageID, userID, emojiID,
)
return err
}
// DeleteEmojiUsage - Delete for guild/channel/message/user
func (db *Database) DeleteEmojiUsage(guildID, channelID, messageID, userID, emojiID string) error {
_, err := db.db.Exec(
"DELETE FROM `emoji_usage` WHERE `guild_id` = ? AND `channel_id` = ? AND `message_id` = ? AND `user_id` = ? AND `emoji_id` = ?",
guildID, channelID, messageID, userID, emojiID,
)
return err
}
// DeleteEmojiAll - Delete for whole message
func (db *Database) DeleteEmojiAll(guildID, channelID, messageID string) error {
_, err := db.db.Exec(
"DELETE FROM `emoji_usage` WHERE `guild_id` = ? AND `channel_id` = ? AND `message_id` = ?",
guildID, channelID, messageID,
) )
return err return err