diff --git a/src/internal/bot/commands.go b/src/internal/bot/commands.go index f50c9e2..2e52255 100644 --- a/src/internal/bot/commands.go +++ b/src/internal/bot/commands.go @@ -93,15 +93,15 @@ func showTopEmojis(s *discordgo.Session, i *discordgo.InteractionCreate) { } msg := "Most used emojis:\n" - for k, v := range top { - topUsers, err := b.Db.GetTopUsersForGuildEmoji(i.GuildID, k, 3) + for _, v := range top { + topUsers, err := b.Db.GetTopUsersForGuildEmoji(i.GuildID, v.EmojiID, 3) if err != nil { slog.Error("Error getting top users for guild emoji", "err", err) continue } users := []string{} - msg += fmt.Sprintf("%s: %d", k, v) + msg += fmt.Sprintf("%s: %d", v.EmojiID, v.Count) for sk, sv := range topUsers { users = append(users, fmt.Sprintf("<@%s>: %d", sk, sv)) } @@ -147,8 +147,8 @@ func showTopUsers(s *discordgo.Session, i *discordgo.InteractionCreate) { users := []string{} msg += fmt.Sprintf("<@%s>: %d", k, v) - for sk, sv := range topUsers { - users = append(users, fmt.Sprintf("%s: %d", sk, sv)) + for _, sv := range topUsers { + users = append(users, fmt.Sprintf("%s: %d", sv.EmojiID, sv.Count)) } msg += " (" + strings.Join(users, ", ") + ")\n" } diff --git a/src/internal/bot/common.go b/src/internal/bot/common.go new file mode 100644 index 0000000..8eae14e --- /dev/null +++ b/src/internal/bot/common.go @@ -0,0 +1,10 @@ +package bot + +func orderMap(m map[string]int64) []string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + + return keys +} diff --git a/src/internal/db/emoji_usage.go b/src/internal/db/emoji_usage.go index a67905a..7d6a19e 100644 --- a/src/internal/db/emoji_usage.go +++ b/src/internal/db/emoji_usage.go @@ -1,5 +1,10 @@ package db +type EmojiMap struct { + EmojiID string + Count int64 +} + // LogEmojiUsage - Log usage func (db *Database) LogEmojiUsage(guildID, channelID, userID, emojiID string) error { _, err := db.db.Exec( @@ -60,8 +65,8 @@ func (db *Database) GetTopUsersForGuildEmoji(guildID string, emojiID string, num } // GetTopEmojisForGuild - Report usage -func (db *Database) GetTopEmojisForGuild(guildID string, num int64) (map[string]int64, error) { - data := make(map[string]int64) +func (db *Database) GetTopEmojisForGuild(guildID string, num int64) (map[int]EmojiMap, error) { + data := make(map[int]EmojiMap) row, err := db.db.Query( "SELECT emoji_id, count(*) FROM `emoji_usage` WHERE `guild_id` = ? GROUP BY emoji_id ORDER BY count(*) DESC LIMIT ?", guildID, @@ -73,19 +78,21 @@ func (db *Database) GetTopEmojisForGuild(guildID string, num int64) (map[string] } defer row.Close() + i := 0 for row.Next() { var emoji string var count int64 row.Scan(&emoji, &count) - data[emoji] = count + data[i] = EmojiMap{EmojiID: emoji, Count: count} + i++ } return data, nil } // GetTopEmojisForGuildUser - Report usage -func (db *Database) GetTopEmojisForGuildUser(guildID string, userID string, num int) (map[string]int64, error) { - data := make(map[string]int64) +func (db *Database) GetTopEmojisForGuildUser(guildID string, userID string, num int) (map[int]EmojiMap, error) { + data := make(map[int]EmojiMap) row, err := db.db.Query( "SELECT emoji_id, count(*) FROM `emoji_usage` WHERE `guild_id` = ? AND `user_id` = ? GROUP BY emoji_id ORDER BY count(*) DESC LIMIT ?", guildID, @@ -98,11 +105,13 @@ func (db *Database) GetTopEmojisForGuildUser(guildID string, userID string, num } defer row.Close() + i := 0 for row.Next() { var emoji string var count int64 row.Scan(&emoji, &count) - data[emoji] = count + data[i] = EmojiMap{EmojiID: emoji, Count: count} + i++ } return data, nil