diff options
| author | William Hergès <william@herges.fr> | 2026-01-17 17:06:38 +0100 |
|---|---|---|
| committer | William Hergès <william@herges.fr> | 2026-01-17 17:06:38 +0100 |
| commit | 64dfe4ed79022c6a7a00991db7ba679f2dcb3495 (patch) | |
| tree | 607e3964da55f97247b0962de32985c37a750aa0 /user/state.go | |
| parent | febb77607e81fbb182dd456733ea5adafda44ed4 (diff) | |
refactor(member): better distinction between cached and from database
Diffstat (limited to 'user/state.go')
| -rw-r--r-- | user/state.go | 38 |
1 files changed, 34 insertions, 4 deletions
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() |
