feat(xp): new add

This commit is contained in:
Anhgelus Morhtuuzh 2025-05-13 14:11:11 +02:00
parent e0a8f66344
commit 799df74fcd
Signed by: anhgelus
GPG key ID: CAD341EFA92DDDE5
4 changed files with 45 additions and 17 deletions

View file

@ -98,7 +98,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
} }
return return
} }
exp := exp.LevelXP(uint(level)) xp := exp.LevelXP(uint(level))
r, ok := optMap["role"] r, ok := optMap["role"]
if !ok { if !ok {
err := resp.Message("Le rôle n'a pas été renseigné.").Send() 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": case "add":
for _, r := range cfg.XpRoles { for _, r := range cfg.XpRoles {
if r.RoleID == role.ID { 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 { if err != nil {
utils.SendAlert("commands/config.go - Role already in config", err.Error()) 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{ cfg.XpRoles = append(cfg.XpRoles, config.XpRole{
XP: exp, XP: xp,
RoleID: role.ID, RoleID: role.ID,
}) })
err = cfg.Save() err = cfg.Save()
@ -143,7 +143,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
case "del": case "del":
_, r := cfg.FindXpRole(role.ID) _, r := cfg.FindXpRole(role.ID)
if r == nil { 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 { if err != nil {
utils.SendAlert("commands/config.go - Role not found (del)", err.Error()) 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": case "edit":
_, r := cfg.FindXpRole(role.ID) _, r := cfg.FindXpRole(role.ID)
if r == nil { 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 { if err != nil {
utils.SendAlert("commands/config.go - Role not found (edit)", err.Error()) utils.SendAlert("commands/config.go - Role not found (edit)", err.Error())
} }
return return
} }
r.XP = exp r.XP = xp
err = gokord.DB.Save(r).Error err = gokord.DB.Save(r).Error
if err != nil { if err != nil {
utils.SendAlert( utils.SendAlert(
@ -186,7 +186,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
) )
} }
default: 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 { if err != nil {
utils.SendAlert("commands/config.go - Invalid action type", err.Error()) utils.SendAlert("commands/config.go - Invalid action type", err.Error())
} }

View file

@ -12,6 +12,7 @@ type GuildConfig struct {
XpRoles []XpRole XpRoles []XpRole
DisabledChannels string DisabledChannels string
FallbackChannel string FallbackChannel string
DaysXPRemains uint `gorm:"default:90"` // 30 * 3 = 90 (three months)
} }
type XpRole struct { type XpRole struct {

View file

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"github.com/anhgelus/gokord" "github.com/anhgelus/gokord"
"github.com/anhgelus/gokord/utils" "github.com/anhgelus/gokord/utils"
"github.com/anhgelus/les-copaings-bot/config"
"time"
) )
type Copaing struct { type Copaing struct {
@ -14,9 +16,11 @@ type Copaing struct {
} }
type CopaingXP struct { type CopaingXP struct {
ID uint `gorm:"primarykey"` ID uint `gorm:"primarykey"`
XP uint `gorm:"default:0"` XP uint `gorm:"default:0"`
CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"` CopaingID uint `gorm:"not null;constraint:OnDelete:CASCADE;"`
GuildID string `gorm:"not null;"`
CreatedAt time.Time
} }
const ( const (
@ -48,6 +52,30 @@ func (c *Copaing) Load() error {
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 { func (c *Copaing) Save() error {
return gokord.DB.Save(c).Error return gokord.DB.Save(c).Error
} }

View file

@ -7,10 +7,10 @@ import (
) )
func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) { func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) {
pastLevel := exp.Level(c.XP) old, err := c.GetXP()
old := c.XP pastLevel := exp.Level(old)
c.XP += xp c.XP = append(c.XP, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID})
if err := c.Save(); err != nil { if err = c.Save(); err != nil {
utils.SendAlert( utils.SendAlert(
"user/xp.go - Saving user", "user/xp.go - Saving user",
err.Error(), err.Error(),
@ -21,12 +21,11 @@ func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn f
"guild_id", "guild_id",
c.GuildID, c.GuildID,
) )
c.XP = old
return return
} }
newLevel := exp.Level(c.XP) newLevel := exp.Level(old + xp)
if newLevel > pastLevel { if newLevel > pastLevel {
fn(c.XP, newLevel) fn(old+xp, newLevel)
onNewLevel(s, m, newLevel) onNewLevel(s, m, newLevel)
} }
} }