aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/state.go7
-rw-r--r--user/xp.go16
2 files changed, 17 insertions, 6 deletions
diff --git a/user/state.go b/user/state.go
index 540d496..b977fb6 100644
--- a/user/state.go
+++ b/user/state.go
@@ -41,6 +41,7 @@ func (cc *CopaingCached) Sync(ctx context.Context) error {
synced := FromCopaing(cc.copaing())
synced.XPs += cc.XPToAdd
synced.XPToAdd = cc.XPToAdd
+ synced.lastSync = time.Now()
err := synced.Save(ctx)
if err != nil {
return err
@@ -144,12 +145,12 @@ func (s *State) Copaing(guildID, copaingID string) (*CopaingCached, error) {
s.mu.RLock()
defer s.mu.RUnlock()
- c, err := s.storage.Get(KeyCopaingCachedRaw(guildID, copaingID))
+ raw, err := s.storage.Get(KeyCopaingCachedRaw(guildID, copaingID))
if err != nil {
return nil, err
}
- mC := c.(CopaingCached)
- return &mC, nil
+ c := raw.(CopaingCached)
+ return &c, nil
}
func (s *State) Copaings(guild string) []CopaingCached {
diff --git a/user/xp.go b/user/xp.go
index 985b5f8..9c6c6ab 100644
--- a/user/xp.go
+++ b/user/xp.go
@@ -78,10 +78,11 @@ func (c *Copaing) GetXPForDays(logger *slog.Logger, n uint) (uint, error) {
// GetBestXP returns n Copaing with the best XP within d days (d <= cfg.DaysXPRemain; d < 0 <=> d = cfg.DaysXPRemain)
//
// This function is slow
-func GetBestXP(logger *slog.Logger, guildId string, n uint, d int) ([]CopaingAccess, error) {
+func GetBestXP(ctx context.Context, logger *slog.Logger, guildId string, n uint, d int) ([]CopaingCached, error) {
if d < 0 {
cfg := config.GetGuildConfig(guildId)
d = int(cfg.DaysXPRemains)
+ return getBestXPFull(ctx, guildId, n), nil
}
rows, err := gokord.DB.Model(&Copaing{}).Where("guild_id = ?", guildId).Rows()
if err != nil {
@@ -112,9 +113,18 @@ func GetBestXP(logger *slog.Logger, guildId string, n uint, d int) ([]CopaingAcc
return int(b.Cxp) - int(a.Cxp)
})
m := min(len(l), int(n))
- cs := make([]CopaingAccess, m)
+ cs := make([]CopaingCached, m)
for i, c := range l[:m] {
- cs[i] = c
+ cs[i] = CopaingCached{DiscordID: c.copaing.DiscordID, XPs: c.Cxp}
}
return cs, nil
}
+
+func getBestXPFull(ctx context.Context, guildId string, n uint) []CopaingCached {
+ ccs := GetState(ctx).Copaings(guildId)
+ slices.SortFunc(ccs, func(a, b CopaingCached) int {
+ return int(b.XPs) - int(a.XPs)
+ })
+ m := min(len(ccs), int(n))
+ return ccs[:m]
+}