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
}
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
}

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) {
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
}

View file

@ -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
}

12
main.go
View file

@ -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":