diff --git a/db/db.go b/db/db.go index 9bd309b..29062d1 100644 --- a/db/db.go +++ b/db/db.go @@ -118,11 +118,11 @@ func (db *DB) ListWords() ([]DictEntry, error) { return entries, nil } -func (db *DB) IncrementXD(userID string) error { +func (db *DB) IncrementXD(userID string, count int) error { _, err := db.Exec( - `INSERT INTO xd_counts (user_id, count) VALUES (?, 1) - ON CONFLICT(user_id) DO UPDATE SET count = count + 1`, - userID, + `INSERT INTO xd_counts (user_id, count) VALUES (?, ?) + ON CONFLICT(user_id) DO UPDATE SET count = count + ?`, + userID, count, count, ) return err } diff --git a/features/starboard.go b/features/starboard.go index 8348352..cd5ca49 100644 --- a/features/starboard.go +++ b/features/starboard.go @@ -158,15 +158,23 @@ func (s *Starboard) HandleReactionRemove(e *events.GuildMessageReactionRemove) { } func (s *Starboard) buildStarboardMessage(msg *discord.Message, channelID, guildID, messageID snowflake.ID) (content string, embeds []discord.Embed, files []*discord.File) { - content = msg.Content - if content == "" { - content = "*(no text content)*" - } - if len(content) > 2000 { - content = content[:1997] + "..." + jumpURL := fmt.Sprintf("https://discord.com/channels/%s/%s/%s", guildID, channelID, messageID) + content = jumpURL + + embed := discord.Embed{ + Author: &discord.EmbedAuthor{ + Name: msg.Author.EffectiveName(), + IconURL: msg.Author.EffectiveAvatarURL(), + }, } - jumpURL := fmt.Sprintf("https://discord.com/channels/%s/%s/%s", guildID, channelID, messageID) + if msg.Content != "" { + desc := msg.Content + if len(desc) > 4096 { + desc = desc[:4093] + "..." + } + embed.Description = desc + } for _, a := range msg.Attachments { resp, err := http.Get(a.URL) @@ -196,12 +204,14 @@ func (s *Starboard) buildStarboardMessage(msg *discord.Message, channelID, guild } parts = append(parts, fmt.Sprintf("%s %d", e, r.Count)) } - parts = append(parts, fmt.Sprintf("\n[[ jump to message ]](%s)", jumpURL)) - embeds = append(embeds, discord.Embed{ - Description: strings.Join(parts, " "), + embed.Fields = append(embed.Fields, discord.EmbedField{ + Name: "Reactions", + Value: strings.Join(parts, " | "), }) } + embeds = append(embeds, embed) + return } diff --git a/features/xdtracker.go b/features/xdtracker.go index 136af56..74ef526 100644 --- a/features/xdtracker.go +++ b/features/xdtracker.go @@ -46,11 +46,12 @@ func (x *XDTracker) HandleMessage(e *events.MessageCreate) { } content := strings.ToLower(e.Message.Content) - if !strings.Contains(content, "xd") { + count := strings.Count(content, "xd") + if count == 0 { return } - if err := x.db.IncrementXD(e.Message.Author.ID.String()); err != nil { + if err := x.db.IncrementXD(e.Message.Author.ID.String(), count); err != nil { slog.Error("failed to increment xd count", slog.Any("err", err)) return } @@ -94,24 +95,19 @@ func (x *XDTracker) HandleLeaderboard(e *events.ApplicationCommandInteractionCre total = 0 } - var sb strings.Builder - sb.WriteString("**XD Leaderboard**\n\n") - for i, entry := range entries { - medal := "" - switch i { - case 0: - medal = "🥇" - case 1: - medal = "🥈" - case 2: - medal = "🥉" - } - sb.WriteString(fmt.Sprintf("%s <@%s> — **%d** xd\n", medal, entry.UserID, entry.Count)) + userCount, err := x.db.GetXDUserCount() + if err != nil { + userCount = 0 } - sb.WriteString(fmt.Sprintf("\n**%d** total xds tracked", total)) + var sb strings.Builder + for i, entry := range entries { + sb.WriteString(fmt.Sprintf("%d. <@%s> - **%d** xd\n", i+1, entry.UserID, entry.Count)) + } - e.CreateMessage(discord.NewMessageCreate().WithContent(sb.String())) + sb.WriteString(fmt.Sprintf("\nTotal: **%d** xd across **%d** users", total, userCount)) + + e.CreateMessage(discord.NewMessageCreate().WithEmbeds(discord.NewEmbed().WithTitle("xd leaderboard").WithDescription(sb.String()))) } func (x *XDTracker) HandleStats(e *events.ApplicationCommandInteractionCreate) { @@ -167,7 +163,7 @@ func (x *XDTracker) BackfillHistory() { for _, ch := range channels { switch ch.Type() { case discord.ChannelTypeGuildText, discord.ChannelTypeGuildNews: - x.backfillChannel(ch.ID()) + go x.backfillChannel(ch.ID()) } } @@ -200,8 +196,8 @@ func (x *XDTracker) backfillChannel(channelID snowflake.ID) { } content := strings.ToLower(msg.Content) - if strings.Contains(content, "xd") { - if err := x.db.IncrementXD(msg.Author.ID.String()); err != nil { + if count := strings.Count(content, "xd"); count > 0 { + if err := x.db.IncrementXD(msg.Author.ID.String(), count); err != nil { slog.Error("failed to increment xd count during backfill", slog.Any("err", err)) continue } diff --git a/main.go b/main.go index a750a4c..db99444 100644 --- a/main.go +++ b/main.go @@ -153,12 +153,10 @@ func handleCommand(e *events.ApplicationCommandInteractionCreate, dict *features if !cfg.Features.Dictionary.Enabled { return } - opts := data.All() - if len(opts) == 0 { + if data.SubCommandName == nil { return } - subCmd := opts[0].Name - switch subCmd { + switch *data.SubCommandName { case "add": dict.HandleAdd(e) case "get": @@ -173,13 +171,11 @@ func handleCommand(e *events.ApplicationCommandInteractionCreate, dict *features if !cfg.Features.XDTracker.Enabled { return } - opts := data.All() - if len(opts) == 0 { + if data.SubCommandName == nil { xd.HandleStats(e) return } - subCmd := opts[0].Name - switch subCmd { + switch *data.SubCommandName { case "leaderboard": xd.HandleLeaderboard(e) case "stats":