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) } }