aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/xp.go30
1 files changed, 27 insertions, 3 deletions
diff --git a/user/xp.go b/user/xp.go
index dbca9de..6b0f6cc 100644
--- a/user/xp.go
+++ b/user/xp.go
@@ -2,6 +2,7 @@ package user
import (
"log/slog"
+ "math"
"slices"
"sync"
@@ -32,10 +33,16 @@ func (c *Copaing) AddXP(s bot.Session, m *user.Member, xp uint, fn func(uint, ui
return
}
pastLevel := exp.Level(old)
- s.Logger().Debug("adding xp", "user", m.DisplayName(), "old", old, "to add", xp)
- c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: xp, GuildID: c.GuildID})
+ s.Logger().Debug("adding xp", "member", m.DisplayName(), "old xp", old, "xp to add", xp, "old level", pastLevel)
+ c.CopaingXPs = append(c.CopaingXPs, CopaingXP{CopaingID: c.ID, XP: uint(math.Floor(float64(xp) * c.GetBoost(m))), GuildID: c.GuildID})
if err = c.Save(); err != nil {
- s.Logger().Error("saving user", "error", err, "user", m.DisplayName(), "xp", xp, "guild", c.GuildID)
+ s.Logger().Error(
+ "saving user",
+ "error", err.Error(),
+ "xp", c.CopaingXPs,
+ "discord_id", c.DiscordID,
+ "guild_id", c.GuildID,
+ )
return
}
newLevel := exp.Level(old + xp)
@@ -77,6 +84,23 @@ func (c *Copaing) GetXPForDays(logger *slog.Logger, n uint) (uint, error) {
return xp, nil
}
+func (c *Copaing) GetBoost(m *user.Member) float64 {
+ boost := 1.0
+ if m.PremiumSince != nil {
+ boost = max(boost, 2.0)
+ }
+ cfg := config.GetGuildConfig(c.GuildID)
+ for _, r := range cfg.BoostXpRoles {
+ if slices.Contains(m.Roles, r.RoleID) {
+ boost = max(boost, r.Boost)
+ }
+ }
+ if m.User.PrimaryGuild.GuildID == c.GuildID {
+ boost = max(boost, 1.5)
+ }
+ return boost
+}
+
// GetBestXP returns n Copaing with the best XP within d days (d <= cfg.DaysXPRemain; d < 0 <=> d = cfg.DaysXPRemain)
//
// This function is slow