diff options
| author | Anhgelus Morhtuuzh <anhgelus@anhgelus.world> | 2025-05-13 18:06:17 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <anhgelus@anhgelus.world> | 2025-05-13 18:06:17 +0200 |
| commit | f2fbf1db929e4bd2b3af014fb8d9af4c0f934a1e (patch) | |
| tree | b0f10aa56a1bb88aa576e230fdefba9da9be9593 /user/level.go | |
| parent | eaf9fa51cdd9509c5d075633b712ec9b5ea712c7 (diff) | |
feat(xp): update role after removing all old xp
Diffstat (limited to 'user/level.go')
| -rw-r--r-- | user/level.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/user/level.go b/user/level.go index 5f847b6..6d9b674 100644 --- a/user/level.go +++ b/user/level.go @@ -8,6 +8,7 @@ import ( "github.com/bwmarrin/discordgo" "slices" "sync" + "time" ) func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { @@ -55,6 +56,31 @@ func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) { func PeriodicReducer(dg *discordgo.Session) { wg := &sync.WaitGroup{} + var cs []*Copaing + if err := gokord.DB.Find(&cs).Error; err != nil { + utils.SendAlert("user/level.go - Fetching all copaings", err.Error()) + return + } + cxps := make([]*cXP, len(cs)) + for i, c := range cs { + if i%10 == 9 { + wg.Wait() // prevents spamming the DB + } + wg.Add(1) + go func() { + defer wg.Done() + xp, err := c.GetXP() + if err != nil { + utils.SendAlert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) + xp = 0 + } + cxps[i] = &cXP{ + Cxp: xp, + Copaing: c, + } + }() + } + wg.Wait() for _, g := range dg.State.Guilds { wg.Add(1) go func() { @@ -71,5 +97,20 @@ func PeriodicReducer(dg *discordgo.Session) { }() } wg.Wait() + for i, c := range cxps { + if i%50 == 49 { + utils.SendDebug("Sleeping...") + time.Sleep(15 * time.Second) // prevents spamming the API + } + oldXp := c.GetXP() + xp, err := c.ToCopaing().GetXP() + if err != nil { + utils.SendAlert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID) + continue + } + if exp.Level(oldXp) != exp.Level(xp) { + c.OnNewLevel(dg, exp.Level(xp)) + } + } utils.SendDebug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds)) } |
