diff options
Diffstat (limited to 'user')
| -rw-r--r-- | user/state.go | 7 | ||||
| -rw-r--r-- | user/xp.go | 16 |
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 { @@ -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] +} |
