aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/reset.go3
-rw-r--r--commands/top.go2
-rw-r--r--events.go14
-rw-r--r--user/level.go9
-rw-r--r--user/member.go17
-rw-r--r--user/state.go38
-rw-r--r--user/xp.go18
7 files changed, 58 insertions, 43 deletions
diff --git a/commands/reset.go b/commands/reset.go
index 56d3e44..ae31781 100644
--- a/commands/reset.go
+++ b/commands/reset.go
@@ -12,6 +12,7 @@ import (
func Reset(s bot.Session, i *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) {
var copaings []*user.Copaing
+ //TODO: delete everything from cache
gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings)
if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil {
s.Logger().Error("sending reset success", "error", err)
@@ -35,7 +36,7 @@ func ResetUser(ctx context.Context) func(s bot.Session, i *event.InteractionCrea
}
return
}
- err := user.GetCopaing(ctx, m.ID, i.GuildID).Copaing(ctx).Delete(ctx)
+ err := user.GetCopaing(ctx, m.ID, i.GuildID).Delete(ctx)
if err != nil {
s.Logger().Error("deleting copaing", "error", err, "user", m.Username, "guild", i.GuildID)
err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send()
diff --git a/commands/top.go b/commands/top.go
index bb08144..bd92a28 100644
--- a/commands/top.go
+++ b/commands/top.go
@@ -68,7 +68,7 @@ func Top(s bot.Session, i *event.InteractionCreate, _ cmd.OptionMap, resp *cmd.R
func genTopsMessage(tops []user.CopaingAccess) string {
msg := ""
for i, c := range tops {
- msg += fmt.Sprintf("%d. **<@%s>** - niveau %d", i+1, c.ToCopaing().DiscordID, exp.Level(c.GetXP()))
+ msg += fmt.Sprintf("%d. **<@%s>** - niveau %d", i+1, c.Copaing().DiscordID, exp.Level(c.GetXP()))
if i != len(tops)-1 {
msg += "\n"
}
diff --git a/events.go b/events.go
index bdf8c77..839fa6c 100644
--- a/events.go
+++ b/events.go
@@ -9,7 +9,6 @@ import (
"git.anhgelus.world/anhgelus/les-copaings-bot/config"
"git.anhgelus.world/anhgelus/les-copaings-bot/exp"
"git.anhgelus.world/anhgelus/les-copaings-bot/user"
- "github.com/anhgelus/gokord"
"github.com/nyttikord/gokord/bot"
"github.com/nyttikord/gokord/event"
)
@@ -118,15 +117,8 @@ func OnLeave(ctx context.Context, s bot.Session, e *event.GuildMemberRemove) {
if e.User.Bot {
return
}
- c := user.GetCopaing(ctx, e.User.ID, e.GuildID).Copaing(ctx)
- err := gokord.DB.
- Where("copaing_id = ? and guild_id = ?", c.ID, e.GuildID).
- Delete(&user.CopaingXP{}).
- Error
- if err != nil {
- s.Logger().Error("deleting user xp from DB", "user", e.User.Username, "guild", e.GuildID)
- }
- if err = c.Delete(ctx); err != nil {
- s.Logger().Error("deleting user from DB", "user", e.User.Username, "guild", e.GuildID)
+ c := user.GetCopaing(ctx, e.User.ID, e.GuildID)
+ if err := c.Delete(ctx); err != nil {
+ s.Logger().Error("deleting user", "user", e.User.Username, "guild", e.GuildID)
}
}
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)