aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commands/config.go32
-rw-r--r--go.mod10
-rw-r--r--go.sum42
-rw-r--r--main.go3
-rw-r--r--xp/events.go19
-rw-r--r--xp/functions.go2
-rw-r--r--xp/level.go39
-rw-r--r--xp/member.go4
8 files changed, 78 insertions, 73 deletions
diff --git a/commands/config.go b/commands/config.go
index 51180c4..32f2818 100644
--- a/commands/config.go
+++ b/commands/config.go
@@ -8,14 +8,6 @@ import (
"github.com/bwmarrin/discordgo"
)
-func Config(s *discordgo.Session, i *discordgo.InteractionCreate) {
- resp := utils.ResponseBuilder{C: s, I: i}
- err := resp.Message("Merci d'utiliser les sous-commandes.").IsEphemeral().Send()
- if err != nil {
- utils.SendAlert("commands/config.go - Sending please use subcommand", err.Error())
- }
-}
-
func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
cfg := config.GetGuildConfig(i.GuildID)
resp := utils.ResponseBuilder{C: s, I: i}
@@ -23,9 +15,9 @@ func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
l := len(cfg.XpRoles) - 1
for i, r := range cfg.XpRoles {
if i == l {
- roles += fmt.Sprintf("> **%d** - <@&%s>", xp.Level(r.XP), r.RoleID)
+ roles += fmt.Sprintf("> Niveau %d - <@&%s>", xp.Level(r.XP), r.RoleID)
} else {
- roles += fmt.Sprintf("> **%d** - <@&%s>\n", xp.Level(r.XP), r.RoleID)
+ roles += fmt.Sprintf("> Niveau %d - <@&%s>\n", xp.Level(r.XP), r.RoleID)
}
}
err := resp.Embeds([]*discordgo.MessageEmbed{
@@ -50,14 +42,12 @@ func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate) {
func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
optMap := utils.GenerateOptionMapForSubcommand(i)
- for k, v := range optMap {
- utils.SendSuccess("option map", "key", k, "value", v)
- }
resp := utils.ResponseBuilder{C: s, I: i}
+ resp.IsEphemeral()
// verify every args
t, ok := optMap["type"]
if !ok {
- err := resp.Message("Le type d'action n'a pas été renseigné.").IsEphemeral().Send()
+ err := resp.Message("Le type d'action n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Action type not set", err.Error())
}
@@ -66,7 +56,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
ts := t.StringValue()
lvl, ok := optMap["level"]
if !ok {
- err := resp.Message("Le niveau n'a pas été renseigné.").IsEphemeral().Send()
+ err := resp.Message("Le niveau n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Level not set", err.Error())
}
@@ -74,7 +64,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}
level := lvl.IntValue()
if level < 1 {
- err := resp.Message("Le niveau doit forcément être supérieur à 0.").IsEphemeral().Send()
+ err := resp.Message("Le niveau doit forcément être supérieur à 0.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Invalid level", err.Error())
}
@@ -83,7 +73,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
exp := xp.XPForLevel(uint(level))
r, ok := optMap["role"]
if !ok {
- err := resp.Message("Le role n'a pas été renseigné.").IsEphemeral().Send()
+ err := resp.Message("Le rôle n'a pas été renseigné.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not set", err.Error())
}
@@ -102,7 +92,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
case "del":
pos, r := cfg.FindXpRole(exp, role.ID)
if r == nil {
- err := resp.Message("Le role n'a pas été trouvé dans la config.").IsEphemeral().Send()
+ err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not found (del)", err.Error())
}
@@ -112,7 +102,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
case "edit":
pos, r := cfg.FindXpRole(exp, role.ID)
if r == nil {
- err := resp.Message("Le role n'a pas été trouvé dans la config.").IsEphemeral().Send()
+ err := resp.Message("Le rôle n'a pas été trouvé dans la config.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Role not found (edit)", err.Error())
}
@@ -121,7 +111,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
r.RoleID = role.ID
cfg.XpRoles[pos] = *r
default:
- err := resp.Message("Le type d'action n'est pas valide.").IsEphemeral().Send()
+ err := resp.Message("Le type d'action n'est pas valide.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Invalid action type", err.Error())
}
@@ -129,7 +119,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) {
}
// save
cfg.Save()
- err := resp.Message("La configuration a bien été mise à jour.").IsEphemeral().Send()
+ err := resp.Message("La configuration a bien été mise à jour.").Send()
if err != nil {
utils.SendAlert("commands/config.go - Config updated", err.Error())
}
diff --git a/go.mod b/go.mod
index fab5864..304ffb7 100644
--- a/go.mod
+++ b/go.mod
@@ -2,10 +2,14 @@ module github.com/anhgelus/les-copaings-bot
go 1.22
-require github.com/anhgelus/gokord v0.2.0
+require (
+ github.com/anhgelus/gokord v0.2.1
+ github.com/bwmarrin/discordgo v0.28.1
+ github.com/redis/go-redis/v9 v9.5.1
+ gorm.io/gorm v1.25.9
+)
require (
- github.com/bwmarrin/discordgo v0.28.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/gorilla/websocket v1.5.1 // indirect
@@ -16,12 +20,10 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.1 // indirect
- github.com/redis/go-redis/v9 v9.5.1 // indirect
golang.org/x/crypto v0.22.0 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
gorm.io/driver/postgres v1.5.7 // indirect
- gorm.io/gorm v1.25.9 // indirect
)
diff --git a/go.sum b/go.sum
index 2a43c00..6d386ea 100644
--- a/go.sum
+++ b/go.sum
@@ -1,41 +1,7 @@
-github.com/anhgelus/gokord v0.1.0 h1:FTaCc6mpInsJw5LZQMSc0CQk3rhMiTMiLYrkz31liMI=
-github.com/anhgelus/gokord v0.1.0/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.1 h1:ZSNHA2DocqfadvFlrur7MDV+Newe5rXbqMlgPAXyDs8=
-github.com/anhgelus/gokord v0.1.1/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.2 h1:+DMUXweXTQoKZblkP/IgYQsst1dCv4gwzHUb7LXtQ1k=
-github.com/anhgelus/gokord v0.1.2/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414130304-4e4b63fbcee5 h1:5c6fo5kdNowNZ2fjIxlanb+36IoACDoC+xDclxsrY9s=
-github.com/anhgelus/gokord v0.1.3-0.20240414130304-4e4b63fbcee5/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414131019-7aa4d9b782d9 h1:QU49AHXZK6YR8nctNNkYEIm8XVbDeX9gZj2sNJizMHc=
-github.com/anhgelus/gokord v0.1.3-0.20240414131019-7aa4d9b782d9/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414131245-ffd200d5a39f h1:hoSuvF8odc+4iKSKfju0txUHFnnFFrMyFkn0Xgw+Am8=
-github.com/anhgelus/gokord v0.1.3-0.20240414131245-ffd200d5a39f/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414131626-4b1333f66900 h1:eljywevvcOZOlauY2eKuU2K47NDLvo1vPWWTvjnYzHE=
-github.com/anhgelus/gokord v0.1.3-0.20240414131626-4b1333f66900/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414132146-03e7ed2add2c h1:v0LA8+NnPrYgAbgMvaF4/8xt4aiPoHVzeg2C55hp9sI=
-github.com/anhgelus/gokord v0.1.3-0.20240414132146-03e7ed2add2c/go.mod h1:X13jrV37XBOIKfOOt3wwKWeA32u9yyJYsCwsgEXc78U=
-github.com/anhgelus/gokord v0.1.3-0.20240414132547-e356bd4cdbd2 h1:/Zv3M4PowSH+5q3GqOPmvJ1t8BTe8ZvMlo3Cd4qpnHk=
-github.com/anhgelus/gokord v0.1.3-0.20240414132547-e356bd4cdbd2/go.mod h1:lRYqODauBGzkmjuIrklmCkUt9OMxnNvb1af8ifbjRIs=
-github.com/anhgelus/gokord v0.1.3-0.20240414132927-426d437f7613 h1:mbZ5nKVtCo9pIDlVHRZ3yd0cBww+U4wQYHyq0S153T4=
-github.com/anhgelus/gokord v0.1.3-0.20240414132927-426d437f7613/go.mod h1:lRYqODauBGzkmjuIrklmCkUt9OMxnNvb1af8ifbjRIs=
-github.com/anhgelus/gokord v0.1.3 h1:27OS08egivF/KSIYNb+L0/xCv+4ENW0Rk4nLywc2bWY=
-github.com/anhgelus/gokord v0.1.3/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.4 h1:hoe87eCcf+Y22WDKwesQuyvxna4SWXrjpYNpdwH8pbI=
-github.com/anhgelus/gokord v0.1.4/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.5 h1:yFFKK6B1hCZU3mvoLAW2nZnjTkXJv7J7uqi/bWMuJbA=
-github.com/anhgelus/gokord v0.1.5/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.6-0.20240415111450-5f4b048c7253 h1:XDES1W0OLHQMyU3+wNv96FjivpUXoi1s2+UEZjG7y14=
-github.com/anhgelus/gokord v0.1.6-0.20240415111450-5f4b048c7253/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.6-0.20240415112117-6f6a99167c29 h1:ZpcDTpx0obVleuXAGj/PqjlFUUTo+MKMLMP0CngcDTU=
-github.com/anhgelus/gokord v0.1.6-0.20240415112117-6f6a99167c29/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.6-0.20240415112732-e29b97ef3a65 h1:/Ho6Q18UwMNTIENOmsu0e64nZEB96xc9fSD/A55laEA=
-github.com/anhgelus/gokord v0.1.6-0.20240415112732-e29b97ef3a65/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.6-0.20240415112938-8cc98f5fc515 h1:2ZGhq4WgtIdd8wPOk2K8QLSOlxi2ojduGaJ/yxm5+Mw=
-github.com/anhgelus/gokord v0.1.6-0.20240415112938-8cc98f5fc515/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.1.6 h1:bBfiYc9BUpAHbE1VPqjJbRZtgVJryMe8KjJRfQ2aLqo=
-github.com/anhgelus/gokord v0.1.6/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
-github.com/anhgelus/gokord v0.2.0 h1:/bVOE/We9scbD5KN3QKrqG7oxQ3R8KD4n7+i7vwfv6o=
-github.com/anhgelus/gokord v0.2.0/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
+github.com/anhgelus/gokord v0.2.1-0.20240415131203-b822009881d2 h1:ADL+XltgbvdBUZ88yxEQIUJ7Eu+jbQw0ZRSVmcp+YZQ=
+github.com/anhgelus/gokord v0.2.1-0.20240415131203-b822009881d2/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
+github.com/anhgelus/gokord v0.2.1 h1:yFn7WM9PJHdMyfGH2GQ2Ubu+qMvfLJ7gUSzfm9zzihY=
+github.com/anhgelus/gokord v0.2.1/go.mod h1:CRyk26IhIZ/0Mkc5/5WOU8C08mGCOqzKzR6eDFfPisI=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
diff --git a/main.go b/main.go
index adc2e1c..ac725e4 100644
--- a/main.go
+++ b/main.go
@@ -64,8 +64,7 @@ func main() {
"Rôle",
).IsRequired()).
SetHandler(commands.ConfigXP),
- ).
- SetHandler(commands.Config)
+ )
bot := gokord.Bot{
Token: token,
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)
}
}