aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--user/state.go26
-rw-r--r--user/xp.go16
2 files changed, 27 insertions, 15 deletions
diff --git a/user/state.go b/user/state.go
index 676728b..2c27fef 100644
--- a/user/state.go
+++ b/user/state.go
@@ -3,6 +3,7 @@ package user
import (
"context"
"errors"
+ "math"
"sync"
"time"
@@ -162,6 +163,19 @@ func SetState(ctx context.Context, state *State) context.Context {
return context.WithValue(ctx, ContextKeyState, state)
}
+func deepCopy(src CopaingCached) CopaingCached {
+ res := CopaingCached{
+ ID: src.ID,
+ DiscordID: src.DiscordID,
+ GuildID: src.GuildID,
+ XP: src.XP,
+ XPToAdd: src.XPToAdd,
+ XPs: make([]XPCached, len(src.XPs)),
+ }
+ copy(res.XPs, src.XPs)
+ return res
+}
+
func (s *State) Copaing(guildID, copaingID string) (*CopaingCached, error) {
s.mu.RLock()
defer s.mu.RUnlock()
@@ -181,7 +195,7 @@ func (s *State) Copaings(guild string) []CopaingCached {
var ccs []CopaingCached
for _, cc := range s.storage {
if cc.GuildID == guild {
- ccs = append(ccs, cc)
+ ccs = append(ccs, deepCopy(cc))
}
}
return ccs
@@ -197,15 +211,16 @@ func calcXP(c *Copaing) uint {
func generateXPs(c *Copaing) []XPCached {
data := map[time.Duration]XPCached{}
- sixH := 6 * time.Hour
+ var sumEach time.Duration = 6
for _, xp := range c.CopaingXPs {
- // we add sixH at the end because we want it to be rounded to ceil
- since := time.Since(xp.CreatedAt)/sixH + sixH
+ // we add sumEach at the end because we want it to be rounded to ceil
+ tmp := time.Since(xp.CreatedAt)/(sumEach*time.Hour) + sumEach
+ since := time.Duration(math.Floor(float64(tmp)))
if v, ok := data[since]; ok {
v.XP += xp.XP
} else {
data[since] = XPCached{
- Time: since,
+ Time: since * time.Hour,
XP: xp.XP,
}
}
@@ -214,7 +229,6 @@ func generateXPs(c *Copaing) []XPCached {
i := 0
for _, v := range data {
ccs[i] = v
- println(v.Time.String(), v.XP)
i++
}
return ccs
diff --git a/user/xp.go b/user/xp.go
index 35c11f3..161a450 100644
--- a/user/xp.go
+++ b/user/xp.go
@@ -40,30 +40,28 @@ func (cc *CopaingCached) AddXP(ctx context.Context, s bot.Session, m *user.Membe
}
}
-func (cc *CopaingCached) GetXPForDays(n uint) uint {
+func (cc *CopaingCached) GetXPForDays(d int) uint {
xp := uint(0)
for _, v := range cc.XPs {
- if v.Time <= time.Duration(n*24)*time.Hour {
+ if v.Time <= time.Duration(d*24)*time.Hour {
xp += v.XP
}
}
return xp + cc.XPToAdd
}
-// GetBestXP returns n Copaing with the best XP within d days (d <= cfg.DaysXPRemain; d < 0 <=> d = cfg.DaysXPRemain)
+// GetBestXP returns n Copaings with the best XP within d days (d <= cfg.DaysXPRemain; d < 0 <=> d = cfg.DaysXPRemain)
func GetBestXP(ctx context.Context, guildId string, n uint, d int) []CopaingCached {
ccs := GetState(ctx).Copaings(guildId)
if d > 0 {
- for _, v := range ccs {
- v.XP = v.GetXPForDays(n)
+ for i, cc := range ccs {
+ cc.XP = cc.GetXPForDays(d)
+ ccs[i] = cc
}
}
slices.SortFunc(ccs, func(a, b CopaingCached) int {
// desc order
return int(b.XP) - int(a.XP)
})
- m := min(len(ccs), int(n))
- res := make([]CopaingCached, m)
- copy(ccs[:m], res)
- return res
+ return ccs[:min(len(ccs), int(n))]
}