From 799df74fcda5266fd295b49fc759c605c815cad9 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 14:11:11 +0200 Subject: [PATCH] feat(xp): new add --- commands/config.go | 14 +++++++------- config/guild.go | 1 + user/member.go | 34 +++++++++++++++++++++++++++++++--- user/xp.go | 13 ++++++------- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/commands/config.go b/commands/config.go index 32da9c6..4615c36 100644 --- a/commands/config.go +++ b/commands/config.go @@ -98,7 +98,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { } return } - exp := exp.LevelXP(uint(level)) + xp := exp.LevelXP(uint(level)) r, ok := optMap["role"] if !ok { err := resp.Message("Le rôle n'a pas été renseigné.").Send() @@ -116,7 +116,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case "add": for _, r := range cfg.XpRoles { if r.RoleID == role.ID { - err := resp.Message("Le rôle est déjà présent dans la config").Send() + err = resp.Message("Le rôle est déjà présent dans la config").Send() if err != nil { utils.SendAlert("commands/config.go - Role already in config", err.Error()) } @@ -124,7 +124,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { } } cfg.XpRoles = append(cfg.XpRoles, config.XpRole{ - XP: exp, + XP: xp, RoleID: role.ID, }) err = cfg.Save() @@ -143,7 +143,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case "del": _, r := cfg.FindXpRole(role.ID) if r == nil { - err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send() + err = resp.Message("Le rôle n'a pas été trouvé dans la config.").Send() if err != nil { utils.SendAlert("commands/config.go - Role not found (del)", err.Error()) } @@ -165,13 +165,13 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case "edit": _, r := cfg.FindXpRole(role.ID) if r == nil { - err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send() + err = resp.Message("Le rôle n'a pas été trouvé dans la config.").Send() if err != nil { utils.SendAlert("commands/config.go - Role not found (edit)", err.Error()) } return } - r.XP = exp + r.XP = xp err = gokord.DB.Save(r).Error if err != nil { utils.SendAlert( @@ -186,7 +186,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { ) } default: - err := resp.Message("Le type d'action n'est pas valide.").Send() + err = resp.Message("Le type d'action n'est pas valide.").Send() if err != nil { utils.SendAlert("commands/config.go - Invalid action type", err.Error()) } diff --git a/config/guild.go b/config/guild.go index 5e41465..fb7eaef 100644 --- a/config/guild.go +++ b/config/guild.go @@ -12,6 +12,7 @@ type GuildConfig struct { XpRoles []XpRole DisabledChannels string FallbackChannel string + DaysXPRemains uint `gorm:"default:90"` // 30 * 3 = 90 (three months) } type XpRole struct { diff --git a/user/member.go b/user/member.go index dc93979..b61aa76 100644 --- a/user/member.go +++ b/user/member.go @@ -4,6 +4,8 @@ import ( "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/les-copaings-bot/config" + "time" ) type Copaing struct { @@ -14,9 +16,11 @@ type Copaing struct { } type CopaingXP struct { - ID uint `gorm:"primarykey"` - XP uint `gorm:"default:0"` - CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"` + ID uint `gorm:"primarykey"` + XP uint `gorm:"default:0"` + CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"` + GuildID string `gorm:"not null;"` + CreatedAt time.Time } const ( @@ -48,6 +52,30 @@ func (c *Copaing) Load() error { Error } +func (c *Copaing) GetXP() (uint, error) { + cfg := config.GetGuildConfig(c.GuildID) + xp := uint(0) + y, m, d := time.Unix(time.Now().Unix()-int64(cfg.DaysXPRemains*24*60*60), 0).Date() + rows, err := gokord.DB. + Model(&CopaingXP{}). + Where(fmt.Sprintf("created_at >= '%d-%d-%d' and guild_id = ? and discord_id = ?", y, m, d), c.GuildID, c.DiscordID). + Rows() + defer rows.Close() + if err != nil { + return 0, err + } + for rows.Next() { + var cXP CopaingXP + err = gokord.DB.ScanRows(rows, &cXP) + if err != nil { + utils.SendAlert("user/member.go - Scaning rows", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID) + continue + } + xp += cXP.XP + } + return xp, nil +} + func (c *Copaing) Save() error { return gokord.DB.Save(c).Error } diff --git a/user/xp.go b/user/xp.go index 23cefcd..f8bcd06 100644 --- a/user/xp.go +++ b/user/xp.go @@ -7,10 +7,10 @@ import ( ) func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) { - pastLevel := exp.Level(c.XP) - old := c.XP - c.XP += xp - if err := c.Save(); err != nil { + old, err := c.GetXP() + pastLevel := exp.Level(old) + c.XP = append(c.XP, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID}) + if err = c.Save(); err != nil { utils.SendAlert( "user/xp.go - Saving user", err.Error(), @@ -21,12 +21,11 @@ func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn f "guild_id", c.GuildID, ) - c.XP = old return } - newLevel := exp.Level(c.XP) + newLevel := exp.Level(old + xp) if newLevel > pastLevel { - fn(c.XP, newLevel) + fn(old+xp, newLevel) onNewLevel(s, m, newLevel) } }