aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/xp.go26
1 files changed, 19 insertions, 7 deletions
diff --git a/user/xp.go b/user/xp.go
index 45080ea..feb9cf7 100644
--- a/user/xp.go
+++ b/user/xp.go
@@ -1,6 +1,7 @@
package user
import (
+ "math"
"slices"
"sync"
@@ -32,17 +33,14 @@ func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn f
}
pastLevel := exp.Level(old)
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: xp, GuildID: c.GuildID})
+ 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 {
logger.Alert(
"user/xp.go - Saving user",
err.Error(),
- "xp",
- c.CopaingXPs,
- "discord_id",
- c.DiscordID,
- "guild_id",
- c.GuildID,
+ "xp", c.CopaingXPs,
+ "discord_id", c.DiscordID,
+ "guild_id", c.GuildID,
)
return
}
@@ -85,6 +83,20 @@ func (c *Copaing) GetXPForDays(n uint) (uint, error) {
return xp, nil
}
+func (c *Copaing) GetBoost(m *discordgo.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)
+ }
+ }
+ 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