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/level.go | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index 671bf2e..574a127 100644 --- a/xp/level.go +++ b/xp/level.go @@ -42,3 +42,10 @@ func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) { } } } + +func onLastEventUpdate(c *Copaing) { + h := c.HourSinceLastEvent() + c.XP -= Lose(h, c.XP) + c.Save() + c.SetLastEvent() +} -- 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/level.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index 574a127..2ec6106 100644 --- a/xp/level.go +++ b/xp/level.go @@ -45,7 +45,14 @@ func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) { func onLastEventUpdate(c *Copaing) { 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.SetLastEvent() } -- cgit v1.2.3 From 9de1f3f90b2d94215f14458a11a951cb143a8dc2 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 18:59:10 +0200 Subject: feat(xp): xp update without reseting last event --- xp/level.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index 2ec6106..14d0e95 100644 --- a/xp/level.go +++ b/xp/level.go @@ -56,3 +56,18 @@ func onLastEventUpdate(c *Copaing) { c.Save() c.SetLastEvent() } + +func onXPUpdate(c *Copaing) { + h := c.HourSinceLastEvent() + 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 + c.AddXPAlreadyRemoved(0) + } else { + c.XP -= l - c.XPAlreadyRemoved() + c.AddXPAlreadyRemoved(l - xp) + } + c.Save() +} -- cgit v1.2.3 From 0a6ecf6af7dc8df0a2255ddb7c022cfad6452493 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 19:06:33 +0200 Subject: feat(xp): implements xp reducer --- xp/level.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index 14d0e95..b179cdb 100644 --- a/xp/level.go +++ b/xp/level.go @@ -43,7 +43,7 @@ func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) { } } -func onLastEventUpdate(c *Copaing) { +func LastEventUpdate(c *Copaing) { h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() @@ -57,7 +57,7 @@ func onLastEventUpdate(c *Copaing) { c.SetLastEvent() } -func onXPUpdate(c *Copaing) { +func XPUpdate(c *Copaing) { h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() -- cgit v1.2.3 From 76745af0e841518835a73e6e3590a1b85e579163 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 15 Apr 2024 19:40:42 +0200 Subject: fix(xp): strange comportment with -= --- xp/level.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index b179cdb..aeb7d91 100644 --- a/xp/level.go +++ b/xp/level.go @@ -51,7 +51,7 @@ func LastEventUpdate(c *Copaing) { utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) c.XP = 0 } else { - c.XP -= l - c.XPAlreadyRemoved() + c.XP = c.XP - l + c.XPAlreadyRemoved() } c.Save() c.SetLastEvent() @@ -63,10 +63,9 @@ func XPUpdate(c *Copaing) { xp := c.XPAlreadyRemoved() if l-xp < 0 { utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) - c.XP = 0 c.AddXPAlreadyRemoved(0) } else { - c.XP -= l - c.XPAlreadyRemoved() + c.XP = c.XP - l + xp c.AddXPAlreadyRemoved(l - xp) } c.Save() -- cgit v1.2.3 From c3dc81bd29318a4916bf8fc383a0d1a5ca90fa64 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 16 Apr 2024 15:15:30 +0200 Subject: fix(reducer): sql error integer > int64max --- xp/level.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index aeb7d91..bbcc71f 100644 --- a/xp/level.go +++ b/xp/level.go @@ -47,26 +47,69 @@ func LastEventUpdate(c *Copaing) { h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() + oldXP := c.XP if l-xp < 0 { utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) c.XP = 0 } else { - c.XP = c.XP - l + c.XPAlreadyRemoved() + calc := int(c.XP) - int(l) + int(c.XPAlreadyRemoved()) + if calc < 0 { + c.XP = 0 + } else { + c.XP = uint(calc) + } + } + if oldXP != c.XP { + c.Save() } - c.Save() c.SetLastEvent() } func XPUpdate(c *Copaing) { + oldXP := c.XP + if oldXP == 0 { + return + } h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() if l-xp < 0 { - utils.SendWarn("lose - xp already removed is negative", "lose", l, "xp", xp) + utils.SendWarn("lose - xp_removed is negative", "lose", l, "xp removed", xp) c.AddXPAlreadyRemoved(0) } else { - c.XP = c.XP - l + xp - c.AddXPAlreadyRemoved(l - xp) + calc := int(c.XP) - int(l) + int(xp) + if calc < 0 { + c.AddXPAlreadyRemoved(c.XP) + c.XP = 0 + } else { + c.XP = uint(calc) + c.AddXPAlreadyRemoved(l - xp) + } + } + if oldXP != c.XP { + utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) + c.Save() } - c.Save() } + +//func PeriodicReducer(s *discordgo.Session) { +// var wg sync.WaitGroup +// for _, g := range s.State.Guilds { +// for _, m := range utils.FetchGuildUser(s, g.ID) { +// if m.User.Bot { +// continue +// } +// wg.Add(1) +// go func() { +// utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) +// c := GetCopaing(m.User.ID, g.ID) +// XPUpdate(c) +// wg.Done() +// }() +// } +// wg.Wait() // finish the entire guild before starting another +// utils.SendDebug("Guild finished", "guild", g.Name) +// time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API +// } +// utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds)) +//} -- cgit v1.2.3 From ef39c156f94b854796bb1c2adddfd40a5acaeca8 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 16 Apr 2024 15:23:15 +0200 Subject: feat(reducer): role update on new level --- xp/level.go | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index bbcc71f..12e5a28 100644 --- a/xp/level.go +++ b/xp/level.go @@ -43,7 +43,23 @@ func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) { } } -func LastEventUpdate(c *Copaing) { +func (c *Copaing) OnNewLevel(s *discordgo.Session, level uint) { + m, err := s.GuildMember(c.GuildID, c.DiscordID) + if err != nil { + utils.SendAlert( + "xp/level.go - Getting member for new level", + err.Error(), + "discord_id", + c.DiscordID, + "guild_id", + c.GuildID, + ) + return + } + onNewLevel(s, m, level) +} + +func LastEventUpdate(s *discordgo.Session, c *Copaing) { h := c.HourSinceLastEvent() l := Lose(h, c.XP) xp := c.XPAlreadyRemoved() @@ -61,11 +77,15 @@ func LastEventUpdate(c *Copaing) { } if oldXP != c.XP { c.Save() + lvl := Level(c.XP) + if Level(oldXP) != Level(c.XP) { + c.OnNewLevel(s, lvl) + } } c.SetLastEvent() } -func XPUpdate(c *Copaing) { +func XPUpdate(s *discordgo.Session, c *Copaing) { oldXP := c.XP if oldXP == 0 { return @@ -89,6 +109,10 @@ func XPUpdate(c *Copaing) { if oldXP != c.XP { utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) c.Save() + lvl := Level(c.XP) + if Level(oldXP) != Level(c.XP) { + c.OnNewLevel(s, lvl) + } } } @@ -103,7 +127,7 @@ func XPUpdate(c *Copaing) { // go func() { // utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) // c := GetCopaing(m.User.ID, g.ID) -// XPUpdate(c) +// XPUpdate(s, c) // wg.Done() // }() // } -- cgit v1.2.3 From 7fe68106bec7133981ac91026156977e0c7b4ca1 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 16 Apr 2024 15:24:25 +0200 Subject: feat(reducer): periodic reducer updating xp --- xp/level.go | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index 12e5a28..bbe11a4 100644 --- a/xp/level.go +++ b/xp/level.go @@ -5,6 +5,8 @@ import ( "github.com/anhgelus/les-copaings-bot/config" "github.com/bwmarrin/discordgo" "slices" + "sync" + "time" ) func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) { @@ -116,24 +118,24 @@ func XPUpdate(s *discordgo.Session, c *Copaing) { } } -//func PeriodicReducer(s *discordgo.Session) { -// var wg sync.WaitGroup -// for _, g := range s.State.Guilds { -// for _, m := range utils.FetchGuildUser(s, g.ID) { -// if m.User.Bot { -// continue -// } -// wg.Add(1) -// go func() { -// utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) -// c := GetCopaing(m.User.ID, g.ID) -// XPUpdate(s, c) -// wg.Done() -// }() -// } -// wg.Wait() // finish the entire guild before starting another -// utils.SendDebug("Guild finished", "guild", g.Name) -// time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API -// } -// utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds)) -//} +func PeriodicReducer(s *discordgo.Session) { + var wg sync.WaitGroup + for _, g := range s.State.Guilds { + for _, m := range utils.FetchGuildUser(s, g.ID) { + if m.User.Bot { + continue + } + wg.Add(1) + go func() { + utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) + c := GetCopaing(m.User.ID, g.ID) + XPUpdate(s, c) + wg.Done() + }() + } + wg.Wait() // finish the entire guild before starting another + utils.SendDebug("Guild finished", "guild", g.Name) + time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API + } + utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds)) +} -- cgit v1.2.3 From b4e72dcae10265bbc1595f2e520b1407cf8e250d Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 16 Apr 2024 15:44:02 +0200 Subject: docs(debug): better debug log --- xp/level.go | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) (limited to 'xp/level.go') diff --git a/xp/level.go b/xp/level.go index bbe11a4..4830298 100644 --- a/xp/level.go +++ b/xp/level.go @@ -78,11 +78,22 @@ func LastEventUpdate(s *discordgo.Session, c *Copaing) { } } if oldXP != c.XP { - c.Save() lvl := Level(c.XP) - if Level(oldXP) != Level(c.XP) { + if Level(oldXP) != lvl { + utils.SendDebug( + "Level changed", + "old", + Level(oldXP), + "new", + lvl, + "discord_id", + c.DiscordID, + "guild_id", + c.GuildID, + ) c.OnNewLevel(s, lvl) } + c.Save() } c.SetLastEvent() } @@ -109,12 +120,23 @@ func XPUpdate(s *discordgo.Session, c *Copaing) { } } if oldXP != c.XP { - utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) - c.Save() lvl := Level(c.XP) - if Level(oldXP) != Level(c.XP) { + if Level(oldXP) != lvl { + utils.SendDebug( + "Level updated", + "old", + Level(oldXP), + "new", + lvl, + "discord_id", + c.DiscordID, + "guild_id", + c.GuildID, + ) c.OnNewLevel(s, lvl) } + utils.SendDebug("Save XP", "old", oldXP, "new", c.XP, "user", c.DiscordID) + c.Save() } } @@ -127,15 +149,14 @@ func PeriodicReducer(s *discordgo.Session) { } wg.Add(1) go func() { - utils.SendDebug("Async reducer", "user", m.DisplayName(), "guild", g.Name) c := GetCopaing(m.User.ID, g.ID) XPUpdate(s, c) wg.Done() }() } wg.Wait() // finish the entire guild before starting another - utils.SendDebug("Guild finished", "guild", g.Name) - time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API + utils.SendDebug("Periodic reduce, guild finished", "guild", g.Name) + time.Sleep(10 * time.Second) // sleep prevents from spamming the Discord API and the database } utils.SendDebug("Periodic reduce finished", "len(guilds)", len(s.State.Guilds)) } -- cgit v1.2.3