aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/config.go14
-rw-r--r--config/guild.go1
-rw-r--r--user/member.go34
-rw-r--r--user/xp.go13
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)
}
}