aboutsummaryrefslogtreecommitdiff
path: root/xp
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me>2024-04-15 16:12:19 +0200
committerAnhgelus Morhtuuzh <anhgelus.morhtuuzh@proton.me>2024-04-15 16:12:19 +0200
commit9e6a5ce1d37d07e22383e2f6507117cc8e6ff85c (patch)
tree7fae4d58183da89f9f1517d5a1852d63043785c1 /xp
parentbeb0ea0ca44c96083a2ba2f683accc68ad30f1b1 (diff)
feat(level): update roles on new level
Diffstat (limited to 'xp')
-rw-r--r--xp/events.go19
-rw-r--r--xp/functions.go2
-rw-r--r--xp/level.go39
-rw-r--r--xp/member.go4
4 files changed, 56 insertions, 8 deletions
diff --git a/xp/events.go b/xp/events.go
index 3ce4f06..f936bd2 100644
--- a/xp/events.go
+++ b/xp/events.go
@@ -21,12 +21,24 @@ const (
)
func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) {
+ if m.Author.Bot {
+ return
+ }
c := GetCopaing(m.Author.ID, m.GuildID)
// add xp
trimmed := utils.TrimMessage(strings.ToLower(m.Content))
- c.AddXP(s, XPMessage(uint(len(trimmed)), calcDiversity(trimmed)), func(_ uint, _ uint) {
+ m.Member.User = m.Author
+ m.Member.GuildID = m.GuildID
+ c.AddXP(s, m.Member, XPMessage(uint(len(trimmed)), calcDiversity(trimmed)), func(_ uint, _ uint) {
if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil {
- utils.SendAlert("xp/events.go - reaction add new level", "cannot add the reaction: "+err.Error())
+ utils.SendAlert(
+ "xp/events.go - add reaction for new level",
+ err.Error(),
+ "channel id",
+ m.ChannelID,
+ "message id",
+ m.Message.ID,
+ )
}
})
}
@@ -119,7 +131,8 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate, client *r
timeInVocal = MaxTimeInVocal
}
c := GetCopaing(u.DiscordID, u.GuildID)
- c.AddXP(s, XPVocal(uint(timeInVocal)), func(_ uint, _ uint) {
+ e.Member.GuildID = e.GuildID
+ c.AddXP(s, e.Member, XPVocal(uint(timeInVocal)), func(_ uint, _ uint) {
//TODO: handle new level in vocal
})
}
diff --git a/xp/functions.go b/xp/functions.go
index e6979c0..196c3d3 100644
--- a/xp/functions.go
+++ b/xp/functions.go
@@ -28,6 +28,6 @@ func XPForLevel(level uint) uint {
func Lose(time uint, xp uint) uint {
return uint(math.Floor(
- math.Pow(float64(time), 2) * math.Pow(10, -2+math.Log(float64(time/85))) * math.Floor(float64(time/500)),
+ math.Pow(float64(time), 2) * math.Pow(10, -2+math.Log(float64(time/85))) * math.Floor(float64(xp/500)),
))
}
diff --git a/xp/level.go b/xp/level.go
index 67ee5a5..671bf2e 100644
--- a/xp/level.go
+++ b/xp/level.go
@@ -1,9 +1,44 @@
package xp
import (
+ "github.com/anhgelus/gokord/utils"
+ "github.com/anhgelus/les-copaings-bot/config"
"github.com/bwmarrin/discordgo"
+ "slices"
)
-func onNewLevel(s *discordgo.Session, level uint) {
- // check roles
+func onNewLevel(s *discordgo.Session, m *discordgo.Member, level uint) {
+ cfg := config.GetGuildConfig(m.GuildID)
+ xpForLevel := XPForLevel(level)
+ for _, role := range cfg.XpRoles {
+ if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) {
+ utils.SendDebug(
+ "Add role",
+ "role_id",
+ role.RoleID,
+ "user_id",
+ m.User.ID,
+ "guild_id",
+ m.GuildID,
+ )
+ err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.RoleID)
+ if err != nil {
+ utils.SendAlert("xp/level.go - Adding role", err.Error(), "role_id", role.RoleID)
+ }
+ } else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) {
+ utils.SendDebug(
+ "Remove role",
+ "role_id",
+ role.RoleID,
+ "user_id",
+ m.User.ID,
+ "guild_id",
+ m.GuildID,
+ )
+ err := s.GuildMemberRoleRemove(m.GuildID, m.User.ID, role.RoleID)
+ if err != nil {
+ utils.SendAlert("xp/level.go - Removing role", err.Error(), "role_id", role.RoleID)
+ }
+ }
+ }
}
diff --git a/xp/member.go b/xp/member.go
index 280b9e0..5599192 100644
--- a/xp/member.go
+++ b/xp/member.go
@@ -31,14 +31,14 @@ func (c *Copaing) Save() {
gokord.DB.Save(c)
}
-func (c *Copaing) AddXP(s *discordgo.Session, xp uint, fn func(uint, uint)) {
+func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) {
pastLevel := Level(c.XP)
c.XP += xp
c.Save()
newLevel := Level(c.XP)
if newLevel > pastLevel {
fn(c.XP, newLevel)
- onNewLevel(s, newLevel)
+ onNewLevel(s, m, newLevel)
}
}