From 50256de97095f619c5a36da6e52eb149d6aceb0e Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 25 Nov 2024 09:35:44 +0100 Subject: [PATCH] refactor(reducer): iterate over users in database and possible fix of 'shadow' users --- xp/events.go | 2 +- xp/level.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) diff --git a/xp/events.go b/xp/events.go index 90af121..23d4b4b 100644 --- a/xp/events.go +++ b/xp/events.go @@ -168,5 +168,5 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { utils.SendDebug("Leave event", "user_id", e.User.ID) c := GetCopaing(e.User.ID, e.GuildID) - gokord.DB.Delete(c) + gokord.DB.Where("guild_id = ?", e.GuildID).Delete(c) } diff --git a/xp/level.go b/xp/level.go index e577920..7a01117 100644 --- a/xp/level.go +++ b/xp/level.go @@ -1,6 +1,7 @@ package xp import ( + "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/anhgelus/les-copaings-bot/config" "github.com/bwmarrin/discordgo" @@ -165,16 +166,74 @@ func XPUpdate(s *discordgo.Session, c *Copaing) { func PeriodicReducer(s *discordgo.Session) { var wg sync.WaitGroup for _, g := range s.State.Guilds { - for i, m := range utils.FetchGuildUser(s, g.ID) { + var cs []*Copaing + err := gokord.DB.Where("guild_id = ?", g.ID).Find(&cs).Error + if err != nil { + utils.SendAlert("xp/level.go - Querying all copaings in Guild", err.Error(), "guild_id", g.ID) + continue + } + for i, c := range cs { if i%50 == 49 { time.Sleep(15 * time.Second) // sleep prevents from spamming the Discord API and the database } - if m.User.Bot { + var u *discordgo.User + u, err = s.User(c.DiscordID) + if err != nil { + utils.SendAlert( + "xp/level.go - Fetching user", + err.Error(), + "discord_id", + c.DiscordID, + "guild_id", + g.ID, + ) + utils.SendWarn("Removing user from database", "discord_id", c.DiscordID) + if gokord.DB.Delete(c).Error != nil { + utils.SendAlert( + "xp/level.go - Removing user from database", + err.Error(), + "discord_id", + c.DiscordID, + "guild_id", + g.ID, + ) + } + continue + } + if u.Bot { + continue + } + _, err = s.GuildMember(g.ID, c.DiscordID) + if err != nil { + utils.SendAlert( + "xp/level.go - Fetching member", + err.Error(), + "discord_id", + c.DiscordID, + "guild_id", + g.ID, + ) + utils.SendWarn( + "Removing user from guild in database", + "discord_id", + c.DiscordID, + "guild_id", + g.ID, + ) + if gokord.DB.Where("guild_id = ?", g.ID).Delete(c).Error != nil { + utils.SendAlert( + "xp/level.go - Removing user from guild in database", + err.Error(), + "discord_id", + c.DiscordID, + "guild_id", + g.ID, + ) + } continue } wg.Add(1) go func() { - c := GetCopaing(m.User.ID, g.ID) XPUpdate(s, c) wg.Done() }()