From eaf9fa51cdd9509c5d075633b712ec9b5ea712c7 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 13 May 2025 17:35:03 +0200 Subject: [PATCH] perf(db): remove useless XP data --- exp/functions.go | 15 ++++++++++ user/level.go | 73 +++++++++--------------------------------------- user/xp.go | 16 ++++------- 3 files changed, 34 insertions(+), 70 deletions(-) diff --git a/exp/functions.go b/exp/functions.go index 2cbe7bf..720a755 100644 --- a/exp/functions.go +++ b/exp/functions.go @@ -1,8 +1,11 @@ package exp import ( + "fmt" + "github.com/anhgelus/gokord" "math" "slices" + "time" ) func MessageXP(length uint, diversity uint) uint { @@ -42,3 +45,15 @@ func LevelXP(level uint) uint { math.Pow(float64(5*level), 2), )) } + +// TimeStampNDaysBefore returns the timestamp (year-month-day) n days before today +func TimeStampNDaysBefore(n uint) string { + var y, d int + var m time.Month + if gokord.Debug { + y, m, d = time.Unix(time.Now().Unix()-int64(24*60*60), 0).Date() // reduce time for debug + } else { + y, m, d = time.Unix(time.Now().Unix()-int64(n*24*60*60), 0).Date() + } + return fmt.Sprintf("%d-%d-%d", y, m, d) +} diff --git a/user/level.go b/user/level.go index 1143c59..5f847b6 100644 --- a/user/level.go +++ b/user/level.go @@ -8,7 +8,6 @@ import ( "github.com/bwmarrin/discordgo" "slices" "sync" - "time" ) func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { @@ -55,68 +54,22 @@ func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) { } func PeriodicReducer(dg *discordgo.Session) { - var wg sync.WaitGroup + wg := &sync.WaitGroup{} for _, g := range dg.State.Guilds { - var cs []*Copaing - err := gokord.DB.Where("guild_id = ?", g.ID).Find(&cs).Error - if err != nil { - utils.SendAlert("user/level.go - Querying all copaings in Guild", err.Error(), "guild_id", g.ID) - continue - } - for i, c := range cs { - if i%50 == 49 { - time.Sleep(15 * time.Second) // sleep prevents from spamming the Discord API and the database - } - var u *discordgo.User - u, err = dg.User(c.DiscordID) + wg.Add(1) + go func() { + defer wg.Done() + cfg := config.GetGuildConfig(g.ID) + err := gokord.DB. + Model(&CopaingXP{}). + Where("guild_id = ? and created_at < ?", g.ID, exp.TimeStampNDaysBefore(cfg.DaysXPRemains)). + Delete(&CopaingXP{}). + Error if err != nil { - utils.SendAlert( - "user/level.go - Fetching user", err.Error(), - "discord_id", c.DiscordID, - "guild_id", g.ID, - ) - utils.SendWarn("Removing user from database", "discord_id", c.DiscordID) - if err = gokord.DB.Delete(c).Error; err != nil { - utils.SendAlert( - "user/level.go - Removing user from database", err.Error(), - "discord_id", c.DiscordID, - "guild_id", g.ID, - ) - } - continue + utils.SendAlert("user/level.go - Removing old XP", err.Error(), "guild_id", g.ID) } - if u.Bot { - continue - } - if _, err = dg.GuildMember(g.ID, c.DiscordID); err != nil { - utils.SendAlert( - "user/level.go - Fetching member", err.Error(), - "discord_id", c.DiscordID, - "guild_id", g.ID, - ) - utils.SendWarn( - "Removing user from guild in database", - "discord_id", c.DiscordID, - "guild_id", g.ID, - ) - if err = gokord.DB.Where("guild_id = ?", g.ID).Delete(c).Error; err != nil { - utils.SendAlert( - "user/level.go - Removing user from guild in database", err.Error(), - "discord_id", c.DiscordID, - "guild_id", g.ID, - ) - } - continue - } - wg.Add(1) - go func() { - //do things - wg.Done() - }() - } - wg.Wait() // finish the entire guild before starting another - utils.SendDebug("Periodic reduce, guild finished", "guild", g.Name) - time.Sleep(15 * time.Second) // sleep prevents from spamming the Discord API and the database + }() } + wg.Wait() utils.SendDebug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds)) } diff --git a/user/xp.go b/user/xp.go index 7501139..d88e3ce 100644 --- a/user/xp.go +++ b/user/xp.go @@ -1,7 +1,6 @@ package user import ( - "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/utils" "github.com/anhgelus/les-copaings-bot/config" @@ -9,7 +8,6 @@ import ( "github.com/bwmarrin/discordgo" "slices" "sync" - "time" ) type cXP struct { @@ -61,16 +59,14 @@ func (c *Copaing) GetXP() (uint, error) { func (c *Copaing) GetXPForDays(n uint) (uint, error) { xp := uint(0) - var y, d int - var m time.Month - if gokord.Debug { - y, m, d = time.Unix(time.Now().Unix()-int64(24*60*60), 0).Date() // reduce time for debug - } else { - y, m, d = time.Unix(time.Now().Unix()-int64(n*24*60*60), 0).Date() - } rows, err := gokord.DB. Model(&CopaingXP{}). - Where(fmt.Sprintf("created_at >= '%d-%d-%d' and guild_id = ? and copaing_id = ?", y, m, d), c.GuildID, c.ID). + Where( + "created_at >= '?' and guild_id = ? and copaing_id = ?", + exp.TimeStampNDaysBefore(n), + c.GuildID, + c.ID, + ). Rows() defer rows.Close() if err != nil {