From c3dc81bd29318a4916bf8fc383a0d1a5ca90fa64 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 16 Apr 2024 15:15:30 +0200 Subject: [PATCH] fix(reducer): sql error integer > int64max --- main.go | 11 +++++++++++ xp/level.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/main.go b/main.go index ed84b8a..1a9693a 100644 --- a/main.go +++ b/main.go @@ -120,7 +120,18 @@ func main() { } func afterInit(dg *discordgo.Session) { + // handlers dg.AddHandler(xp.OnMessage) dg.AddHandler(xp.OnVoiceUpdate) dg.AddHandler(xp.OnLeave) + + // setup timer for periodic reducer + //d := 24 * time.Hour + //if gokord.Debug { + // // reduce for debug + // d = time.Minute + //} + //utils.NewTimer(d, func(stop chan struct{}) { + // xp.PeriodicReducer(dg) + //}) } diff --git a/xp/level.go b/xp/level.go index aeb7d91..bbcc71f 100644 --- a/xp/level.go +++ b/xp/level.go @@ -47,26 +47,69 @@ func LastEventUpdate(c *Copaing) { h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() + oldXP := c.XP if l-xp < 0 { utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) c.XP = 0 } else { - c.XP = c.XP - l + c.XPAlreadyRemoved() + calc := int(c.XP) - int(l) + int(c.XPAlreadyRemoved()) + if calc < 0 { + c.XP = 0 + } else { + c.XP = uint(calc) + } + } + if oldXP != c.XP { + c.Save() } - c.Save() c.SetLastEvent() } func XPUpdate(c *Copaing) { + oldXP := c.XP + if oldXP == 0 { + return + } h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() if l-xp < 0 { - utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) + utils.SendWarn("lose - xp_removed is negative", "lose", l, "xp removed", xp) c.AddXPAlreadyRemoved(0) } else { - c.XP = c.XP - l + xp - c.AddXPAlreadyRemoved(l - xp) + calc := int(c.XP) - int(l) + int(xp) + if calc < 0 { + c.AddXPAlreadyRemoved(c.XP) + c.XP = 0 + } else { + c.XP = uint(calc) + c.AddXPAlreadyRemoved(l - xp) + } + } + if oldXP != c.XP { + utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) + c.Save() } - c.Save() } + +//func PeriodicReducer(s *discordgo.Session) { +// var wg sync.WaitGroup +// for _, g := range s.State.Guilds { +// for _, m := range utils.FetchGuildUser(s, g.ID) { +// if m.User.Bot { +// continue +// } +// wg.Add(1) +// go func() { +// utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) +// c := GetCopaing(m.User.ID, g.ID) +// XPUpdate(c) +// wg.Done() +// }() +// } +// wg.Wait() // finish the entire guild before starting another +// utils.SendDebug("Guild finished", "guild", g.Name) +// time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API +// } +// utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds)) +//}