feat(xp): new add
This commit is contained in:
parent
e0a8f66344
commit
799df74fcd
4 changed files with 45 additions and 17 deletions
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
13
user/xp.go
13
user/xp.go
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue