From e0a8f6634424f10a22b0a0740e0bbc17534eaa0e Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 13:26:32 +0200 Subject: [PATCH] refactor(xp): remove reducer --- events.go | 2 - exp/functions.go | 12 ----- user/level.go | 87 +------------------------------- user/xp.go | 128 ----------------------------------------------- 4 files changed, 1 insertion(+), 228 deletions(-) diff --git a/events.go b/events.go index 6974606..54c444e 100644 --- a/events.go +++ b/events.go @@ -31,7 +31,6 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { return } c := user.GetCopaing(m.Author.ID, m.GuildID) - user.LastEventUpdate(s, c) // add exp trimmed := utils.TrimMessage(strings.ToLower(m.Content)) m.Member.User = m.Author @@ -55,7 +54,6 @@ func OnVoiceUpdate(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { if e.Member.User.Bot { return } - user.LastEventUpdate(s, user.GetCopaing(e.UserID, e.GuildID)) cfg := config.GetGuildConfig(e.GuildID) client, err := config.GetRedisClient() if err != nil { diff --git a/exp/functions.go b/exp/functions.go index c69ef26..2cbe7bf 100644 --- a/exp/functions.go +++ b/exp/functions.go @@ -1,7 +1,6 @@ package exp import ( - "github.com/anhgelus/gokord" "math" "slices" ) @@ -43,14 +42,3 @@ func LevelXP(level uint) uint { math.Pow(float64(5*level), 2), )) } - -func Lose(time uint, xp uint) uint { - if gokord.Debug { - return uint(math.Floor( - math.Pow(float64(time), 3) * math.Pow(10, -2+math.Log(float64(time))) * math.Floor(float64(xp/500)+1), - )) // a little bit faster to lose exp - } - return uint(math.Floor( - math.Pow(float64(time), 2) * math.Pow(10, -2+math.Log(float64(time/85))) * math.Floor(float64(xp/500)+1), - )) -} diff --git a/user/level.go b/user/level.go index 122b707..1143c59 100644 --- a/user/level.go +++ b/user/level.go @@ -54,91 +54,6 @@ func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) { onNewLevel(dg, m, level) } -func LastEventUpdate(dg *discordgo.Session, c *Copaing) { - h := c.HourSinceLastEvent() - l := exp.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 { - calc := int(c.XP) - int(l) + int(c.XPAlreadyRemoved()) - if calc < 0 { - c.XP = 0 - } else { - c.XP = uint(calc) - } - } - if oldXP != c.XP { - lvl := exp.Level(c.XP) - if exp.Level(oldXP) != lvl { - utils.SendDebug( - "Level changed", - "old", exp.Level(oldXP), - "new", lvl, - "discord_id", c.DiscordID, - "guild_id", c.GuildID, - ) - c.OnNewLevel(dg, lvl) - } - if err := c.Save(); err != nil { - utils.SendAlert( - "user/level.go - Saving user", err.Error(), - "exp", c.XP, - "discord_id", c.DiscordID, - "guild_id", c.GuildID, - ) - } - } - c.SetLastEvent() -} - -func UpdateXP(dg *discordgo.Session, c *Copaing) { - oldXP := c.XP - if oldXP == 0 { - return - } - h := c.HourSinceLastEvent() - l := exp.Lose(h, c.XP) - xp := c.XPAlreadyRemoved() - if l-xp < 0 { - utils.SendWarn("lose - xp_removed is negative", "lose", l, "xp removed", xp) - c.AddXPAlreadyRemoved(0) - } else { - 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 { - lvl := exp.Level(c.XP) - if exp.Level(oldXP) != lvl { - utils.SendDebug( - "Level updated", - "old", exp.Level(oldXP), - "new", lvl, - "discord_id", c.DiscordID, - "guild_id", c.GuildID, - ) - c.OnNewLevel(dg, lvl) - } - utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) - if err := c.Save(); err != nil { - utils.SendAlert( - "user/level.go - Saving user", err.Error(), - "xp", c.XP, - "discord_id", c.DiscordID, - "guild_id", c.GuildID, - ) - } - } -} - func PeriodicReducer(dg *discordgo.Session) { var wg sync.WaitGroup for _, g := range dg.State.Guilds { @@ -195,7 +110,7 @@ func PeriodicReducer(dg *discordgo.Session) { } wg.Add(1) go func() { - UpdateXP(dg, c) + //do things wg.Done() }() } diff --git a/user/xp.go b/user/xp.go index 90be09d..23cefcd 100644 --- a/user/xp.go +++ b/user/xp.go @@ -1,18 +1,9 @@ package user import ( - "context" - "errors" - "fmt" - "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" - "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" - "github.com/redis/go-redis/v9" - "math" - "strconv" - "time" ) func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) { @@ -39,122 +30,3 @@ func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn f onNewLevel(s, m, newLevel) } } - -func (c *Copaing) SetLastEvent() { - client, err := config.GetRedisClient() - if err != nil { - utils.SendAlert("user/xp.go - Getting redis client (set)", err.Error()) - return - } - t := time.Now().Unix() - err = client.Set(context.Background(), c.GenKey(LastEvent), strconv.FormatInt(t, 10), 0).Err() - if err != nil { - utils.SendAlert("user/xp.go - Setting last event", err.Error(), "time", t, "base_key", c.GenKey("")) - return - } - err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), "0", 0).Err() - if err != nil { - utils.SendAlert( - "user/xp.go - Setting already removed to 0", - err.Error(), - "time", - t, - "base_key", - c.GenKey(""), - ) - return - } -} - -func (c *Copaing) HourSinceLastEvent() uint { - client, err := config.GetRedisClient() - if err != nil { - utils.SendAlert("user/xp.go - Getting redis client (get)", err.Error()) - return 0 - } - res := client.Get(context.Background(), c.GenKey(LastEvent)) - if errors.Is(res.Err(), redis.Nil) { - return 0 - } else if res.Err() != nil { - utils.SendAlert("user/xp.go - Getting last event", res.Err().Error(), "base_key", c.GenKey("")) - return 0 - } - t := time.Now().Unix() - last, err := strconv.Atoi(res.Val()) - if err != nil { - utils.SendAlert( - "user/xp.go - Converting time fetched into int (last event)", - err.Error(), - "base_key", - c.GenKey(""), - "val", - res.Val(), - ) - return 0 - } - if gokord.Debug { - return uint(math.Floor(float64(t-int64(last)) / 60)) // not hours of unix, is minutes of unix - } - return utils.HoursOfUnix(t - int64(last)) -} - -func (c *Copaing) AddXPAlreadyRemoved(xp uint) uint { - client, err := config.GetRedisClient() - if err != nil { - utils.SendAlert("user/xp.go - Getting redis client (set)", err.Error()) - return 0 - } - nxp := xp + c.XPAlreadyRemoved() - err = client.Set(context.Background(), c.GenKey(AlreadyRemoved), nxp, 0).Err() - if err != nil { - utils.SendAlert( - "user/xp.go - Setting already removed", - err.Error(), - "exp already removed", - nxp, - "base_key", - c.GenKey(""), - ) - return 0 - } - return nxp -} - -func (c *Copaing) XPAlreadyRemoved() uint { - client, err := config.GetRedisClient() - if err != nil { - utils.SendAlert("user/xp.go - Getting redis client (exp)", err.Error()) - return 0 - } - res := client.Get(context.Background(), fmt.Sprintf("%s:%s", c.GenKey(""), AlreadyRemoved)) - if errors.Is(res.Err(), redis.Nil) { - return 0 - } else if res.Err() != nil { - utils.SendAlert("user/xp.go - Getting already removed", res.Err().Error(), "base_key", c.GenKey("")) - return 0 - } - xp, err := strconv.Atoi(res.Val()) - if err != nil { - utils.SendAlert( - "user/xp.go - Converting time fetched into int (already removed)", - err.Error(), - "base_key", - c.GenKey(""), - "val", - res.Val(), - ) - return 0 - } - if xp < 0 { - utils.SendAlert( - "user/xp.go - Assertion exp >= 0", - "xp is negative", - "base_key", - c.GenKey(""), - "xp", - xp, - ) - return 0 - } - return uint(xp) -}