From 64dfe4ed79022c6a7a00991db7ba679f2dcb3495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sat, 17 Jan 2026 17:06:38 +0100 Subject: refactor(member): better distinction between cached and from database --- user/level.go | 9 +++++---- user/member.go | 17 +++++++---------- user/state.go | 38 ++++++++++++++++++++++++++++++++++---- user/xp.go | 18 ++++++------------ 4 files changed, 52 insertions(+), 30 deletions(-) (limited to 'user') diff --git a/user/level.go b/user/level.go index e7b96af..654ecd1 100644 --- a/user/level.go +++ b/user/level.go @@ -76,7 +76,7 @@ func PeriodicReducer(s *discordgo.Session) { } cxps[i] = &cXP{ Cxp: xp, - Copaing: c, + copaing: c, } }() } @@ -105,13 +105,14 @@ func PeriodicReducer(s *discordgo.Session) { time.Sleep(15 * time.Second) // prevents spamming the API } oldXp := c.GetXP() - xp, err := c.ToCopaing().GetXP(s.Logger()) + cp := c.Copaing() + xp, err := cp.GetXP(s.Logger()) if err != nil { - s.Logger().Error("getting xp of copaing", "error", err, "copaing", c.ID, "guild", c.GuildID) + s.Logger().Error("getting xp of copaing", "error", err, "copaing", cp.ID, "guild", cp.GuildID) continue } if exp.Level(oldXp) != exp.Level(xp) { - c.OnNewLevel(s, exp.Level(xp)) + cp.OnNewLevel(s, exp.Level(xp)) } } s.Logger().Debug("periodic reduce finished", "guilds affected", i) diff --git a/user/member.go b/user/member.go index 690f7c5..9c9ad1f 100644 --- a/user/member.go +++ b/user/member.go @@ -23,7 +23,7 @@ type CopaingXP struct { } type CopaingAccess interface { - ToCopaing() *Copaing + Copaing() *Copaing GetXP() uint } @@ -54,18 +54,15 @@ func (c *Copaing) Load(ctx context.Context) error { return err } -func (c *Copaing) Save(ctx context.Context) error { - state := GetState(ctx) - _, err := state.CopaingAdd(c, 0) - if err != nil { - return err - } +func (c *Copaing) Save() error { return gokord.DB.Save(c).Error } -func (c *Copaing) Delete(ctx context.Context) error { - state := GetState(ctx) - err := state.CopaingRemove(c) +func (c *Copaing) Delete() error { + err := gokord.DB. + Where("copaing_id = ? and guild_id = ?", c.ID, c.GuildID). + Delete(&CopaingXP{}). + Error if err != nil { return err } diff --git a/user/state.go b/user/state.go index 07096db..84f2852 100644 --- a/user/state.go +++ b/user/state.go @@ -15,9 +15,9 @@ type CopaingCached struct { XPToAdd uint } -// Copaing turns a CopaingCached into a Copaing. +// copaing turns a CopaingCached into a Copaing. // This operation is heavy. -func (cc *CopaingCached) Copaing(ctx context.Context) *Copaing { +func (cc *CopaingCached) copaing(ctx context.Context) *Copaing { c := Copaing{DiscordID: cc.DiscordID, GuildID: cc.GuildID} if err := c.Load(ctx); err != nil { panic(err) @@ -25,6 +25,15 @@ func (cc *CopaingCached) Copaing(ctx context.Context) *Copaing { return &c } +func (cc *CopaingCached) Sync(ctx context.Context) error { + synced, err := GetState(ctx).CopaingAdd(cc.copaing(ctx), cc.XPToAdd) + if err != nil { + return err + } + *cc = *synced + return nil +} + func (cc *CopaingCached) Save(ctx context.Context) error { state := GetState(ctx) @@ -34,6 +43,26 @@ func (cc *CopaingCached) Save(ctx context.Context) error { return state.storage.Write(KeyCopaingCachedRaw(cc.GuildID, cc.DiscordID), *cc) } +func (cc *CopaingCached) SaveInDB(ctx context.Context) error { + c := cc.copaing(ctx) + c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: cc.XPToAdd, GuildID: c.GuildID}) + err := c.Save() + if err != nil { + return err + } + cc.XPToAdd = 0 + return cc.Save(ctx) +} + +func (cc *CopaingCached) Delete(ctx context.Context) error { + c := cc.copaing(ctx) + err := c.Delete() + if err != nil { + return err + } + return GetState(ctx).CopaingRemove(c) +} + func FromCopaing(c *Copaing) *CopaingCached { return &CopaingCached{ ID: c.ID, @@ -92,11 +121,12 @@ func (s *State) CopaingAdd(c *Copaing, xpToAdd uint) (*CopaingCached, error) { var err error var cc *CopaingCached if cc, err = s.Copaing(c.GuildID, c.DiscordID); err == nil { - cc.XPs = calcXP(c) - cc.XPToAdd = xpToAdd + cc.XPs = calcXP(c) + xpToAdd } else { cc = FromCopaing(c) } + cc.XPToAdd = xpToAdd + s.mu.Lock() defer s.mu.Unlock() diff --git a/user/xp.go b/user/xp.go index eceb673..246b097 100644 --- a/user/xp.go +++ b/user/xp.go @@ -14,12 +14,12 @@ import ( ) type cXP struct { - Cxp uint - *Copaing + Cxp uint + copaing *Copaing } -func (c *cXP) ToCopaing() *Copaing { - return c.Copaing +func (c *cXP) Copaing() *Copaing { + return c.copaing } func (c *cXP) GetXP() uint { @@ -105,19 +105,13 @@ func GetBestXP(logger *slog.Logger, guildId string, n uint, d int) ([]CopaingAcc logger.Error("fetching xp", "error", err, "copaing", c.ID, "guild", c.GuildID) return } - l = append(l, &cXP{Cxp: xp, Copaing: &c}) + l = append(l, &cXP{Cxp: xp, copaing: &c}) }() } wg.Wait() slices.SortFunc(l, func(a, b *cXP) int { // desc order - if a.Cxp < b.Cxp { - return 1 - } - if a.Cxp > b.Cxp { - return -1 - } - return 0 + return int(b.Cxp) - int(a.Cxp) }) m := min(len(l), int(n)) cs := make([]CopaingAccess, m) -- cgit v1.2.3