aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/level.go9
-rw-r--r--user/member.go17
-rw-r--r--user/state.go38
-rw-r--r--user/xp.go18
4 files changed, 52 insertions, 30 deletions
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)