This commit is contained in:
Elisiei Yehorov 2026-06-02 04:22:00 +02:00
parent 752c72a81a
commit 805cf9024b
Signed by: elisiei
GPG key ID: BA1D158DCE3DF089
4 changed files with 44 additions and 42 deletions

View file

@ -118,11 +118,11 @@ func (db *DB) ListWords() ([]DictEntry, error) {
return entries, nil return entries, nil
} }
func (db *DB) IncrementXD(userID string) error { func (db *DB) IncrementXD(userID string, count int) error {
_, err := db.Exec( _, err := db.Exec(
`INSERT INTO xd_counts (user_id, count) VALUES (?, 1) `INSERT INTO xd_counts (user_id, count) VALUES (?, ?)
ON CONFLICT(user_id) DO UPDATE SET count = count + 1`, ON CONFLICT(user_id) DO UPDATE SET count = count + ?`,
userID, userID, count, count,
) )
return err return err
} }

View file

@ -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) { func (s *Starboard) buildStarboardMessage(msg *discord.Message, channelID, guildID, messageID snowflake.ID) (content string, embeds []discord.Embed, files []*discord.File) {
content = msg.Content jumpURL := fmt.Sprintf("https://discord.com/channels/%s/%s/%s", guildID, channelID, messageID)
if content == "" { content = jumpURL
content = "*(no text content)*"
} embed := discord.Embed{
if len(content) > 2000 { Author: &discord.EmbedAuthor{
content = content[:1997] + "..." 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 { for _, a := range msg.Attachments {
resp, err := http.Get(a.URL) 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("%s %d", e, r.Count))
} }
parts = append(parts, fmt.Sprintf("\n[[ jump to message ]](%s)", jumpURL)) embed.Fields = append(embed.Fields, discord.EmbedField{
embeds = append(embeds, discord.Embed{ Name: "Reactions",
Description: strings.Join(parts, " "), Value: strings.Join(parts, " | "),
}) })
} }
embeds = append(embeds, embed)
return return
} }

View file

@ -46,11 +46,12 @@ func (x *XDTracker) HandleMessage(e *events.MessageCreate) {
} }
content := strings.ToLower(e.Message.Content) content := strings.ToLower(e.Message.Content)
if !strings.Contains(content, "xd") { count := strings.Count(content, "xd")
if count == 0 {
return 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)) slog.Error("failed to increment xd count", slog.Any("err", err))
return return
} }
@ -94,24 +95,19 @@ func (x *XDTracker) HandleLeaderboard(e *events.ApplicationCommandInteractionCre
total = 0 total = 0
} }
var sb strings.Builder userCount, err := x.db.GetXDUserCount()
sb.WriteString("**XD Leaderboard**\n\n") if err != nil {
for i, entry := range entries { userCount = 0
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))
} }
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) { func (x *XDTracker) HandleStats(e *events.ApplicationCommandInteractionCreate) {
@ -167,7 +163,7 @@ func (x *XDTracker) BackfillHistory() {
for _, ch := range channels { for _, ch := range channels {
switch ch.Type() { switch ch.Type() {
case discord.ChannelTypeGuildText, discord.ChannelTypeGuildNews: 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) content := strings.ToLower(msg.Content)
if strings.Contains(content, "xd") { if count := strings.Count(content, "xd"); count > 0 {
if err := x.db.IncrementXD(msg.Author.ID.String()); err != nil { 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)) slog.Error("failed to increment xd count during backfill", slog.Any("err", err))
continue continue
} }

12
main.go
View file

@ -153,12 +153,10 @@ func handleCommand(e *events.ApplicationCommandInteractionCreate, dict *features
if !cfg.Features.Dictionary.Enabled { if !cfg.Features.Dictionary.Enabled {
return return
} }
opts := data.All() if data.SubCommandName == nil {
if len(opts) == 0 {
return return
} }
subCmd := opts[0].Name switch *data.SubCommandName {
switch subCmd {
case "add": case "add":
dict.HandleAdd(e) dict.HandleAdd(e)
case "get": case "get":
@ -173,13 +171,11 @@ func handleCommand(e *events.ApplicationCommandInteractionCreate, dict *features
if !cfg.Features.XDTracker.Enabled { if !cfg.Features.XDTracker.Enabled {
return return
} }
opts := data.All() if data.SubCommandName == nil {
if len(opts) == 0 {
xd.HandleStats(e) xd.HandleStats(e)
return return
} }
subCmd := opts[0].Name switch *data.SubCommandName {
switch subCmd {
case "leaderboard": case "leaderboard":
xd.HandleLeaderboard(e) xd.HandleLeaderboard(e)
case "stats": case "stats":