feat(xp): storage of already removed xp

This commit is contained in:
Anhgelus Morhtuuzh 2024-04-15 18:56:21 +02:00
parent 2aaeb2115b
commit f00941a17a
No known key found for this signature in database
GPG key ID: CF4550297832A29F
2 changed files with 79 additions and 4 deletions

View file

@ -45,7 +45,14 @@ func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) {
func onLastEventUpdate(c *Copaing) { func onLastEventUpdate(c *Copaing) {
h := c.HourSinceLastEvent() h := c.HourSinceLastEvent()
c.XP -= Lose(h, c.XP) l := Lose(h, c.XP)
xp := c.XPAlreadyRemoved()
if l-xp < 0 {
utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp)
c.XP = 0
} else {
c.XP -= l - c.XPAlreadyRemoved()
}
c.Save() c.Save()
c.SetLastEvent() c.SetLastEvent()
} }

View file

@ -23,7 +23,8 @@ type Copaing struct {
var redisClient *redis.Client var redisClient *redis.Client
const ( const (
LastEvent = "last_event" LastEvent = "last_event"
AlreadyRemoved = "already_removed"
) )
func GetCopaing(discordID string, guildID string) *Copaing { func GetCopaing(discordID string, guildID string) *Copaing {
@ -88,8 +89,8 @@ func (c *Copaing) HourSinceLastEvent() uint {
last, err := strconv.Atoi(res.Val()) last, err := strconv.Atoi(res.Val())
if err != nil { if err != nil {
utils.SendAlert( utils.SendAlert(
"xp/member.go - Converting time fetched into int", "xp/member.go - Converting time fetched into int (last event)",
res.Err().Error(), err.Error(),
"base_key", "base_key",
u.GenKey(), u.GenKey(),
"val", "val",
@ -100,6 +101,73 @@ func (c *Copaing) HourSinceLastEvent() uint {
return utils.HoursOfUnix(t - int64(last)) return utils.HoursOfUnix(t - int64(last))
} }
func (c *Copaing) AddXPAlreadyRemoved(xp uint) uint {
client, err := getRedisClient()
if err != nil {
utils.SendAlert("xp/member.go - Getting redis client (set)", err.Error())
return 0
}
u := c.GetUserBase()
exp := xp + c.XPAlreadyRemoved()
err = client.Set(context.Background(), fmt.Sprintf(
"%s:%s",
u.GenKey(),
AlreadyRemoved,
), exp, 0).Err()
if err != nil {
utils.SendAlert(
"xp/member.go - Setting last event",
err.Error(),
"xp already removed",
exp,
"base_key",
u.GenKey(),
)
return 0
}
return exp
}
func (c *Copaing) XPAlreadyRemoved() uint {
client, err := getRedisClient()
if err != nil {
utils.SendAlert("xp/member.go - Getting redis client (xp)", err.Error())
return 0
}
u := c.GetUserBase()
res := client.Get(context.Background(), fmt.Sprintf("%s:%s", u.GenKey(), AlreadyRemoved))
if errors.Is(res.Err(), redis.Nil) {
return 0
} else if res.Err() != nil {
utils.SendAlert("xp/member.go - Getting already removed", res.Err().Error(), "base_key", u.GenKey())
return 0
}
xp, err := strconv.Atoi(res.Val())
if err != nil {
utils.SendAlert(
"xp/member.go - Converting time fetched into int (already removed)",
err.Error(),
"base_key",
u.GenKey(),
"val",
res.Val(),
)
return 0
}
if xp < 0 {
utils.SendAlert(
"xp/member.go - Assertion xp >= 0",
"xp is negative",
"base_key",
u.GenKey(),
"xp",
xp,
)
return 0
}
return uint(xp)
}
func (c *Copaing) GetUserBase() *gokord.UserBase { func (c *Copaing) GetUserBase() *gokord.UserBase {
return &gokord.UserBase{DiscordID: c.DiscordID, GuildID: c.GuildID} return &gokord.UserBase{DiscordID: c.DiscordID, GuildID: c.GuildID}
} }