diff --git a/src/internal/bot/commands.go b/src/internal/bot/commands.go index ee6c560..454e8f4 100644 --- a/src/internal/bot/commands.go +++ b/src/internal/bot/commands.go @@ -3,6 +3,7 @@ package bot import ( "fmt" "log/slog" + "sort" "strings" "github.com/bwmarrin/discordgo" @@ -92,18 +93,30 @@ func showTopEmojis(s *discordgo.Session, i *discordgo.InteractionCreate) { return } + // Sort keys + keys := make([]int, 0) + for k, _ := range top { + keys = append(keys, k) + } + sort.Ints(keys) msg := "Most used emojis:\n" - for _, v := range top { - topUsers, err := b.Db.GetTopUsersForGuildEmoji(i.GuildID, v.EmojiID, 3) + for _, v := range keys { + topUsers, err := b.Db.GetTopUsersForGuildEmoji(i.GuildID, top[v].EmojiID, 3) if err != nil { slog.Error("Error getting top users for guild emoji", "err", err) continue } + subkeys := make([]int, 0) + for k, _ := range topUsers { + subkeys = append(subkeys, k) + } + sort.Ints(subkeys) + users := []string{} - msg += fmt.Sprintf("%s: %d", v.EmojiID, v.Count) - for sk, sv := range topUsers { - users = append(users, fmt.Sprintf("<@%s>: %d", sk, sv)) + msg += fmt.Sprintf("%s: %d", top[v].EmojiID, top[v].Count) + for _, sv := range subkeys { + users = append(users, fmt.Sprintf("<@%s>: %d", topUsers[sv].EmojiID, topUsers[sv].Count)) } msg += " (" + strings.Join(users, ", ") + ")\n" } @@ -137,19 +150,31 @@ func showTopUsers(s *discordgo.Session, i *discordgo.InteractionCreate) { return } + // Sort keys + keys := make([]int, 0) + for k, _ := range top { + keys = append(keys, k) + } + sort.Ints(keys) + msg := "Users who use the most emojis:\n" - for k, v := range top { - slog.Error("Error getting top emojis for guild user", "user_id", k, "count", v) - topUsers, err := b.Db.GetTopEmojisForGuildUser(i.GuildID, k, 3) + for _, v := range keys { + topUsers, err := b.Db.GetTopEmojisForGuildUser(i.GuildID, top[v].EmojiID, 3) if err != nil { slog.Error("Error getting top emojis for guild user", "err", err) continue } + subkeys := make([]int, 0) + for k, _ := range topUsers { + subkeys = append(subkeys, k) + } + sort.Ints(subkeys) + users := []string{} - msg += fmt.Sprintf("<@%s>: %d", k, v) - for _, sv := range topUsers { - users = append(users, fmt.Sprintf("%s: %d", sv.EmojiID, sv.Count)) + msg += fmt.Sprintf("<@%s>: %d", top[v].EmojiID, top[v].Count) + for _, sv := range subkeys { + users = append(users, fmt.Sprintf("%s: %d", topUsers[sv].EmojiID, topUsers[sv].Count)) } msg += " (" + strings.Join(users, ", ") + ")\n" } diff --git a/src/internal/db/emoji_usage.go b/src/internal/db/emoji_usage.go index 65ec65d..020bae0 100644 --- a/src/internal/db/emoji_usage.go +++ b/src/internal/db/emoji_usage.go @@ -1,7 +1,5 @@ package db -import "log/slog" - type EmojiMap struct { EmojiID string Count int64 @@ -18,8 +16,8 @@ func (db *Database) LogEmojiUsage(guildID, channelID, userID, emojiID string) er } // GetTopUsersForGuild - Report usage -func (db *Database) GetTopUsersForGuild(guildID string, num int64) (map[string]int64, error) { - data := make(map[string]int64) +func (db *Database) GetTopUsersForGuild(guildID string, num int64) (map[int]EmojiMap, error) { + data := make(map[int]EmojiMap) row, err := db.db.Query( "SELECT user_id, count(*) FROM `emoji_usage` WHERE `guild_id` = ? GROUP BY user_id ORDER BY count(*) DESC LIMIT ?", guildID, @@ -31,20 +29,20 @@ func (db *Database) GetTopUsersForGuild(guildID string, num int64) (map[string]i } defer row.Close() + i := 0 for row.Next() { - var user string + var name string var count int64 - row.Scan(&user, &count) - slog.Error("Error getting top emojis for guild user", "user_id", user, "count", count) - data[user] = count + row.Scan(&name, &count) + data[i] = EmojiMap{EmojiID: name, Count: count} + i++ } - return data, nil } // GetTopUsersForGuildEmoji - Report usage -func (db *Database) GetTopUsersForGuildEmoji(guildID string, emojiID string, num int) (map[string]int64, error) { - data := make(map[string]int64) +func (db *Database) GetTopUsersForGuildEmoji(guildID string, emojiID string, num int) (map[int]EmojiMap, error) { + data := make(map[int]EmojiMap) row, err := db.db.Query( "SELECT user_id, count(*) FROM `emoji_usage` WHERE `guild_id` = ? AND `emoji_id` = ? GROUP BY emoji_id, user_id ORDER BY count(*) DESC LIMIT ?", guildID, @@ -57,11 +55,13 @@ func (db *Database) GetTopUsersForGuildEmoji(guildID string, emojiID string, num } defer row.Close() + i := 0 for row.Next() { - var user string + var name string var count int64 - row.Scan(&user, &count) - data[user] = count + row.Scan(&name, &count) + data[i] = EmojiMap{EmojiID: name, Count: count} + i++ } return data, nil