From c1e4653a5c7ae34dd23d442f67a171eff466aad3 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 18:41:30 +0200 Subject: feat(copaing): time between last event --- xp/member.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'xp/member.go') diff --git a/xp/member.go b/xp/member.go index 4f1e6ee..bcfcedf 100644 --- a/xp/member.go +++ b/xp/member.go @@ -1,11 +1,15 @@ package xp import ( + "context" + "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/bwmarrin/discordgo" "github.com/redis/go-redis/v9" "gorm.io/gorm" + "strconv" + "time" ) type Copaing struct { @@ -17,6 +21,10 @@ type Copaing struct { var redisClient *redis.Client +const ( + LastEvent = "last_event" +) + func GetCopaing(discordID string, guildID string) *Copaing { c := Copaing{DiscordID: discordID, GuildID: guildID} return c.Load() @@ -42,6 +50,57 @@ func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn f } } +func (c *Copaing) SetLastEvent() { + client, err := getRedisClient() + if err != nil { + utils.SendAlert("xp/member.go - Getting redis client (set)", err.Error()) + return + } + u := c.GetUserBase() + t := time.Now().Unix() + err = client.Set(context.Background(), fmt.Sprintf( + "%s:%s", + u.GenKey(), + LastEvent, + ), strconv.FormatInt(t, 10), 0).Err() + if err != nil { + utils.SendAlert("xp/member.go - Setting last event", err.Error(), "time", t, "base_key", u.GenKey()) + return + } +} + +func (c *Copaing) HourSinceLastEvent() uint { + client, err := getRedisClient() + if err != nil { + utils.SendAlert("xp/member.go - Getting redis client (get)", err.Error()) + return 0 + } + u := c.GetUserBase() + res := client.Get(context.Background(), fmt.Sprintf("%s:%s", u.GenKey(), LastEvent)) + if res.Err() != nil { + utils.SendAlert("xp/member.go - Getting last event", res.Err().Error(), "base_key", u.GenKey()) + return 0 + } + t := time.Now().Unix() + last, err := strconv.Atoi(res.Val()) + if err != nil { + utils.SendAlert( + "xp/member.go - Converting time fetched into int", + res.Err().Error(), + "base_key", + u.GenKey(), + "val", + res.Val(), + ) + return 0 + } + return utils.HoursOfUnix(t - int64(last)) +} + +func (c *Copaing) GetUserBase() *gokord.UserBase { + return &gokord.UserBase{DiscordID: c.DiscordID, GuildID: c.GuildID} +} + func getRedisClient() (*redis.Client, error) { if redisClient == nil { var err error -- cgit v1.2.3 From 2aaeb2115b25952b71113a683b466c00cb92e690 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 18:47:52 +0200 Subject: feat(xp): basic reducer --- xp/member.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'xp/member.go') diff --git a/xp/member.go b/xp/member.go index bcfcedf..fc01ec0 100644 --- a/xp/member.go +++ b/xp/member.go @@ -2,6 +2,7 @@ package xp import ( "context" + "errors" "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" @@ -77,7 +78,9 @@ func (c *Copaing) HourSinceLastEvent() uint { } u := c.GetUserBase() res := client.Get(context.Background(), fmt.Sprintf("%s:%s", u.GenKey(), LastEvent)) - if res.Err() != nil { + if errors.Is(res.Err(), redis.Nil) { + return 0 + } else if res.Err() != nil { utils.SendAlert("xp/member.go - Getting last event", res.Err().Error(), "base_key", u.GenKey()) return 0 } -- cgit v1.2.3 From f00941a17ad1c789b7354c685d84386ed7904163 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 18:56:21 +0200 Subject: feat(xp): storage of already removed xp --- xp/member.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) (limited to 'xp/member.go') diff --git a/xp/member.go b/xp/member.go index fc01ec0..b9073f3 100644 --- a/xp/member.go +++ b/xp/member.go @@ -23,7 +23,8 @@ type Copaing struct { var redisClient *redis.Client const ( - LastEvent = "last_event" + LastEvent = "last_event" + AlreadyRemoved = "already_removed" ) func GetCopaing(discordID string, guildID string) *Copaing { @@ -88,8 +89,8 @@ func (c *Copaing) HourSinceLastEvent() uint { last, err := strconv.Atoi(res.Val()) if err != nil { utils.SendAlert( - "xp/member.go - Converting time fetched into int", - res.Err().Error(), + "xp/member.go - Converting time fetched into int (last event)", + err.Error(), "base_key", u.GenKey(), "val", @@ -100,6 +101,73 @@ func (c *Copaing) HourSinceLastEvent() uint { 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 { return &gokord.UserBase{DiscordID: c.DiscordID, GuildID: c.GuildID} } -- cgit v1.2.3 From 9f9c27f42298d51a356743724095a6dd79196dfe Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 19:15:37 +0200 Subject: feat(debug): adapt xp functions while debug is enabled --- xp/member.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'xp/member.go') diff --git a/xp/member.go b/xp/member.go index b9073f3..977f5a0 100644 --- a/xp/member.go +++ b/xp/member.go @@ -9,6 +9,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/redis/go-redis/v9" "gorm.io/gorm" + "math" "strconv" "time" ) @@ -98,6 +99,9 @@ func (c *Copaing) HourSinceLastEvent() uint { ) return 0 } + if gokord.Debug { + return uint(math.Floor(float64(t-int64(last)) / 60)) // not hours of unix, is minutes of unix + } return utils.HoursOfUnix(t - int64(last)) } -- cgit v1.2.3 From 5655170779702fb8e390ab948bee7cff1f3fde87 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 19:42:32 +0200 Subject: fix(xp): already removed never reset --- xp/member.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'xp/member.go') diff --git a/xp/member.go b/xp/member.go index 977f5a0..bbf013c 100644 --- a/xp/member.go +++ b/xp/member.go @@ -70,6 +70,15 @@ func (c *Copaing) SetLastEvent() { utils.SendAlert("xp/member.go - Setting last event", err.Error(), "time", t, "base_key", u.GenKey()) return } + err = client.Set(context.Background(), fmt.Sprintf( + "%s:%s", + u.GenKey(), + AlreadyRemoved, + ), "0", 0).Err() + if err != nil { + utils.SendAlert("xp/member.go - Setting already removed to 0", err.Error(), "time", t, "base_key", u.GenKey()) + return + } } func (c *Copaing) HourSinceLastEvent() uint { @@ -120,7 +129,7 @@ func (c *Copaing) AddXPAlreadyRemoved(xp uint) uint { ), exp, 0).Err() if err != nil { utils.SendAlert( - "xp/member.go - Setting last event", + "xp/member.go - Setting already removed", err.Error(), "xp already removed", exp, -- cgit v1.2.3