From b4408674c901d03da72f9471cf1a19762f03b03a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 30 Jul 2025 21:57:05 +0200 Subject: [PATCH 01/21] refactor(command): use message component to edit config --- commands/config.go | 47 +++++++++++++++++++++++++++++--- main.go | 67 ++++------------------------------------------ updates.json | 10 +++++++ 3 files changed, 59 insertions(+), 65 deletions(-) diff --git a/commands/config.go b/commands/config.go index 48d7ab8..472a4ea 100644 --- a/commands/config.go +++ b/commands/config.go @@ -10,7 +10,15 @@ import ( "strings" ) -func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +const ( + SelectConfigModify = "config_modify" + SelectOptConfigXpRole = "xp_role" + SelectOptConfigDisChannel = "disabled_channel" + SelectOptConfigFallbackChannel = "fallback_channel" + SelectOptConfigTimeReduce = "time_reduce" +) + +func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { cfg := config.GetGuildConfig(i.GuildID) roles := "" l := len(cfg.XpRoles) - 1 @@ -69,13 +77,46 @@ func ConfigShow(s *discordgo.Session, i *discordgo.InteractionCreate, optMap uti Inline: false, }, }, - }).Send() + }).AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ + discordgo.SelectMenu{ + MenuType: discordgo.StringSelectMenu, + CustomID: SelectConfigModify, + Placeholder: "Modifier...", + Options: []discordgo.SelectMenuOption{ + { + Label: "Rôles liés à l'XP", + Value: SelectOptConfigXpRole, + Description: "Gère les rôles liés à l'XP", + Emoji: &discordgo.ComponentEmoji{Name: "🏅"}, + }, + { + Label: "Salons désactivés", + Value: SelectOptConfigDisChannel, + Description: "Gère les salons désactivés", + Emoji: &discordgo.ComponentEmoji{Name: "❌"}, + }, + { + Label: "Salons de repli", // I don't have a better idea for this... + Value: SelectOptConfigFallbackChannel, + Description: "Spécifie le salon de repli", + Emoji: &discordgo.ComponentEmoji{Name: "💾"}, + }, + { + Label: "Temps avec la réduction", + Value: SelectOptConfigTimeReduce, + Description: "Gère le temps avant la réduction d'XP", + Emoji: &discordgo.ComponentEmoji{Name: "⌛"}, + }, + }, + Disabled: false, + }, + }}).IsEphemeral().Send() if err != nil { utils.SendAlert("config/guild.go - Sending config", err.Error()) } } -func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { resp.IsEphemeral() // verify every args t, ok := optMap["type"] diff --git a/main.go b/main.go index 4610bc4..b2def4f 100644 --- a/main.go +++ b/main.go @@ -60,68 +60,8 @@ func main() { SetHandler(commands.Rank) configCmd := gokord.NewCommand("config", "Modifie la config"). - ContainsSub(). - AddSub( - gokord.NewCommand("show", "Affiche la config").SetHandler(commands.ConfigShow), - ). - AddSub( - gokord.NewCommand("xp", "Modifie l'xp"). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionString, - "type", - "Type d'action à effectuer", - ). - AddChoice(gokord.NewChoice("Ajouter", "add")). - AddChoice(gokord.NewChoice("Supprimer", "del")). - AddChoice(gokord.NewChoice("Modifier", "edit")).IsRequired(), - ). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionInteger, - "level", - "Niveau du rôle", - ).IsRequired()). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionRole, - "role", - "Rôle", - ).IsRequired()). - SetHandler(commands.ConfigXP), - ). - AddSub( - gokord.NewCommand("disabled-channels", "Modifie les salons désactivés"). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionString, - "type", - "Type d'action à effectuer", - ). - AddChoice(gokord.NewChoice("Désactiver le salon", "add")). - AddChoice(gokord.NewChoice("Activer le salon", "del")).IsRequired(), - ). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionChannel, - "channel", - "Salon à modifier", - ).IsRequired()). - SetHandler(commands.ConfigChannel), - ). - AddSub( - gokord.NewCommand("period-before-reduce", "Temps avant la perte d'xp (affecte aussi le /top)"). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionInteger, - "days", - "Nombre de jours avant la perte d'xp (doit être égal ou plus grand que 30)", - ).IsRequired()). - SetHandler(commands.ConfigPeriodBeforeReduce), - ). - AddSub( - gokord.NewCommand("fallback-channel", "Modifie le salon textuel par défaut"). - AddOption(gokord.NewOption( - discordgo.ApplicationCommandOptionChannel, - "channel", - "Salon textuel par défaut", - ).IsRequired()). - SetHandler(commands.ConfigFallbackChannel), - ).SetPermission(&adm) + SetPermission(&adm). + SetHandler(commands.Config) topCmd := gokord.NewCommand("top", "Copaings les plus actifs"). SetHandler(commands.Top) @@ -198,4 +138,7 @@ func afterInit(dg *discordgo.Session) { stopPeriodicReducer = utils.NewTimer(24*time.Hour, func(stop chan<- interface{}) { user.PeriodicReducer(dg) }) + + //interaction: /config + dg.AddHandler(commands.ConfigXP) } diff --git a/updates.json b/updates.json index d0d863c..debf5a5 100644 --- a/updates.json +++ b/updates.json @@ -28,5 +28,15 @@ "ping" ] } + }, + { + "version": "3.2.0", + "commands": { + "added": [], + "removed": [], + "updated": [ + "config" + ] + } } ] From 30992e873cc5d68f7e231e5ea920e5fec748836d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 30 Jul 2025 22:39:31 +0200 Subject: [PATCH 02/21] refactor(command): modify xp role with message component --- commands/config.go | 295 ++++++++++++++++++++++++++++++--------------- go.mod | 8 +- go.sum | 6 + main.go | 1 + 4 files changed, 207 insertions(+), 103 deletions(-) diff --git a/commands/config.go b/commands/config.go index 472a4ea..0f9a6d6 100644 --- a/commands/config.go +++ b/commands/config.go @@ -7,15 +7,30 @@ import ( "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" + "strconv" "strings" + "time" ) const ( - SelectConfigModify = "config_modify" - SelectOptConfigXpRole = "xp_role" - SelectOptConfigDisChannel = "disabled_channel" - SelectOptConfigFallbackChannel = "fallback_channel" - SelectOptConfigTimeReduce = "time_reduce" + ConfigModify = "config_modify" + ConfigModifyXpRole = "xp_role" + ConfigModifyDisChannel = "disabled_channel" + ConfigModifyFallbackChannel = "fallback_channel" + ConfigModifyTimeReduce = "time_reduce" + // xp role related + XpRoleAdd = "xp_role_add" + XpRoleAddLevel = "xp_role_add_level" + XpRoleAddRole = "xp_role_add_role" + XpRoleDel = "xp_role_del" + XpRoleDelRole = "xp_role_del_role" + XpRoleEdit = "xp_role_edit" + XpRoleEditLevel = "xp_role_edit_level" + XpRoleEditRole = "xp_role_edit_role" +) + +var ( + configModifyMap = map[string]uint{} ) func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { @@ -80,30 +95,30 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O }).AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ discordgo.SelectMenu{ MenuType: discordgo.StringSelectMenu, - CustomID: SelectConfigModify, + CustomID: ConfigModify, Placeholder: "Modifier...", Options: []discordgo.SelectMenuOption{ { Label: "Rôles liés à l'XP", - Value: SelectOptConfigXpRole, + Value: ConfigModifyXpRole, Description: "Gère les rôles liés à l'XP", Emoji: &discordgo.ComponentEmoji{Name: "🏅"}, }, { Label: "Salons désactivés", - Value: SelectOptConfigDisChannel, + Value: ConfigModifyDisChannel, Description: "Gère les salons désactivés", Emoji: &discordgo.ComponentEmoji{Name: "❌"}, }, { Label: "Salons de repli", // I don't have a better idea for this... - Value: SelectOptConfigFallbackChannel, + Value: ConfigModifyFallbackChannel, Description: "Spécifie le salon de repli", Emoji: &discordgo.ComponentEmoji{Name: "💾"}, }, { Label: "Temps avec la réduction", - Value: SelectOptConfigTimeReduce, + Value: ConfigModifyTimeReduce, Description: "Gère le temps avant la réduction d'XP", Emoji: &discordgo.ComponentEmoji{Name: "⌛"}, }, @@ -117,52 +132,76 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O } func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { - resp.IsEphemeral() - // verify every args - t, ok := optMap["type"] - if !ok { - err := resp.SetMessage("Le type d'action n'a pas été renseigné.").Send() - if err != nil { - utils.SendAlert("commands/config.go - Action type not set", err.Error()) - } + if i.Type != discordgo.InteractionMessageComponent { return } - ts := t.StringValue() - lvl, ok := optMap["level"] - if !ok { - err := resp.SetMessage("Le niveau n'a pas été renseigné.").Send() - if err != nil { - utils.SendAlert("commands/config.go - Level not set", err.Error()) - } - return - } - level := lvl.IntValue() - if level < 1 { - err := resp.SetMessage("Le niveau doit forcément être supérieur à 0.").Send() - if err != nil { - utils.SendAlert("commands/config.go - Invalid level", err.Error()) - } - return - } - xp := exp.LevelXP(uint(level)) - r, ok := optMap["role"] - if !ok { - err := resp.SetMessage("Le rôle n'a pas été renseigné.").Send() - if err != nil { - utils.SendAlert("commands/config.go - Role not set", err.Error()) - } - return - } - role := r.RoleValue(s, i.GuildID) + cfg := config.GetGuildConfig(i.GuildID) - // add or delete or edit - var err error - switch ts { - case "add": + resp := utils.NewResponseBuilder(s, i) + + msgData := i.MessageComponentData() + switch msgData.CustomID { + case ConfigModifyXpRole: + err := resp.IsEphemeral(). + SetMessage("Action à réaliser"). + AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ + discordgo.SelectMenu{ + MenuType: discordgo.StringSelectMenu, + CustomID: ConfigModify, + Placeholder: "Action", + Options: []discordgo.SelectMenuOption{ + { + Label: "Ajouter", + Value: XpRoleAdd, + Description: "Ajouter un rôle à XP", + Emoji: &discordgo.ComponentEmoji{Name: "⬆️"}, + }, + { + Label: "Supprimer", + Value: XpRoleDel, + Description: "Supprimer un rôle à XP", + Emoji: &discordgo.ComponentEmoji{Name: "❌"}, + }, + { + Label: "Modifier", + Value: XpRoleEdit, + Description: "Modifier un rôle à XP", + Emoji: &discordgo.ComponentEmoji{Name: "📝"}, + }, + }, + }, + }}).Send() + if err != nil { + utils.SendAlert("config/guild.go - Sending config", err.Error()) + } + case XpRoleAdd, XpRoleEdit: + cID := XpRoleAddLevel + if msgData.CustomID == XpRoleEdit { + cID = XpRoleEditLevel + } + err := resp.IsModal(). + SetTitle("Role"). + AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ + discordgo.TextInput{ + CustomID: cID, + Label: "Niveau", + Style: discordgo.TextInputShort, + Placeholder: "5", + Required: true, + MinLength: 0, + MaxLength: 5, + }, + }}). + Send() + if err != nil { + utils.SendAlert("config/guild.go - Sending modal to add", err.Error()) + } + case XpRoleAddRole: + roleId := msgData.Values[0] for _, r := range cfg.XpRoles { - if r.RoleID == role.ID { - err = resp.SetMessage("Le rôle est déjà présent dans la config").Send() + if r.RoleID == roleId { + err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() if err != nil { utils.SendAlert("commands/config.go - Role already in config", err.Error()) } @@ -170,82 +209,140 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { } } cfg.XpRoles = append(cfg.XpRoles, config.XpRole{ - XP: xp, - RoleID: role.ID, + XP: configModifyMap[getKeyConfigRole(i)], + RoleID: roleId, }) - err = cfg.Save() + err := cfg.Save() if err != nil { utils.SendAlert( "commands/config.go - Saving config", err.Error(), - "guild_id", - i.GuildID, - "role_id", - role.ID, - "type", - "add", + "guild_id", i.GuildID, + "role_id", roleId, + "type", "add", ) } - case "del": - _, r := cfg.FindXpRole(role.ID) - if r == nil { - err = resp.SetMessage("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()) - } - return + if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { + utils.SendAlert("commands/config.go - Sending success", err.Error()) } - err = gokord.DB.Delete(r).Error - if err != nil { - utils.SendAlert( - "commands/config.go - Deleting entry", - err.Error(), - "guild_id", - i.GuildID, - "role_id", - role.ID, - "type", - "del", - ) - } - case "edit": - _, r := cfg.FindXpRole(role.ID) + case XpRoleEditRole: + roleId := msgData.Values[0] + _, r := cfg.FindXpRole(roleId) if r == nil { - err = resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() + err := resp.SetMessage("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()) } return } - r.XP = xp - err = gokord.DB.Save(r).Error + r.XP = configModifyMap[getKeyConfigRole(i)] + err := gokord.DB.Save(r).Error if err != nil { utils.SendAlert( "commands/config.go - Saving config", err.Error(), - "guild_id", - i.GuildID, - "role_id", - role.ID, - "type", - "edit", + "guild_id", i.GuildID, + "role_id", roleId, + "type", "edit", ) } + if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { + utils.SendAlert("commands/config.go - Sending success", err.Error()) + } + case XpRoleDel: + err := resp.IsEphemeral(). + SetMessage("Rôle à supprimer"). + AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{discordgo.SelectMenu{ + MenuType: discordgo.RoleSelectMenu, + CustomID: XpRoleDelRole, + }}}). + Send() + if err != nil { + utils.SendAlert("config/guild.go - Sending response to del", err.Error()) + } + case XpRoleDelRole: + roleId := msgData.Values[0] + _, r := cfg.FindXpRole(roleId) + if r == nil { + err := resp.SetMessage("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()) + } + return + } + err := gokord.DB.Delete(r).Error + if err != nil { + utils.SendAlert( + "commands/config.go - Deleting entry", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "del", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { + utils.SendAlert("commands/config.go - Sending success", err.Error()) + } default: - err = resp.SetMessage("Le type d'action n'est pas valide.").Send() + err := resp.SetMessage("Le type d'action n'est pas valide.").Send() if err != nil { utils.SendAlert("commands/config.go - Invalid action type", err.Error()) } return } - if err != nil { - err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send() - } else { - err = resp.SetMessage("La configuration a bien été mise à jour.").Send() +} + +func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { + if i.Type != discordgo.InteractionModalSubmit { + return } - if err != nil { - utils.SendAlert("commands/config.go - Config updated message", err.Error()) + resp := utils.NewResponseBuilder(s, i) + + modalData := i.ModalSubmitData() + + if modalData.CustomID != XpRoleAddLevel && modalData.CustomID != XpRoleEditLevel { + return } + + input := modalData.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) + + k := getKeyConfigRole(i) + in, err := strconv.Atoi(input.Value) + if err != nil || in < 0 { + if err = resp.IsEphemeral(). + SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). + Send(); err != nil { + utils.SendAlert("command/config.go - Sending bad number", err.Error()) + } + return + } + configModifyMap[k] = uint(in) + go func(i *discordgo.InteractionCreate, k string) { + time.Sleep(5 * time.Minute) + delete(configModifyMap, k) + }(i, k) + + cID := XpRoleAddRole + resp.SetMessage("Rôle à ajouter") + if modalData.CustomID == XpRoleEditLevel { + cID = XpRoleEditLevel + resp.SetMessage("Rôle à modifier") + } + + err = resp.IsEphemeral(). + SetMessage("Rôle à supprimer"). + AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{discordgo.SelectMenu{ + MenuType: discordgo.RoleSelectMenu, + CustomID: cID, + }}}). + Send() + if err != nil { + utils.SendAlert("config/guild.go - Sending response to add/edit", err.Error()) + } +} + +func getKeyConfigRole(i *discordgo.InteractionCreate) string { + return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) } func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { diff --git a/go.mod b/go.mod index 16d6af9..0c5e711 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,12 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.10.0 + github.com/anhgelus/gokord v0.10.3 github.com/bwmarrin/discordgo v0.29.0 + github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 gorm.io/driver/postgres v1.5.11 - gorm.io/gorm v1.30.0 + gorm.io/gorm v1.30.1 ) require ( @@ -16,11 +17,10 @@ require ( github.com/gorilla/websocket v1.5.3 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.4 // indirect + github.com/jackc/pgx/v5 v5.7.5 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/joho/godotenv v1.5.1 // indirect github.com/redis/go-redis/v9 v9.9.0 // indirect golang.org/x/crypto v0.38.0 // indirect golang.org/x/sync v0.14.0 // indirect diff --git a/go.sum b/go.sum index 0b8314f..3157ad4 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/anhgelus/gokord v0.9.0 h1:vz7jHZ6papdt/xehe+nx4DxOLquPO6QukW8UzH81bGY github.com/anhgelus/gokord v0.9.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= github.com/anhgelus/gokord v0.10.0 h1:FaaMWntaezmSCvarcSMjfWr5OXVVwwzlDMnNX8gXaWE= github.com/anhgelus/gokord v0.10.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= +github.com/anhgelus/gokord v0.10.3 h1:4uKHRXFsRg1wRJQ3Sikz1MpL68cUZxyseRD+5hVe7tE= +github.com/anhgelus/gokord v0.10.3/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= 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= @@ -28,6 +30,8 @@ github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7Ulw github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -73,3 +77,5 @@ gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw= gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= +gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= +gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= diff --git a/main.go b/main.go index b2def4f..1047d16 100644 --- a/main.go +++ b/main.go @@ -141,4 +141,5 @@ func afterInit(dg *discordgo.Session) { //interaction: /config dg.AddHandler(commands.ConfigXP) + dg.AddHandler(commands.ConfigXPModal) } From 5a8da1eaeb9434a18e553a5c50490d06b54a6a1d Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 6 Aug 2025 02:22:06 +0200 Subject: [PATCH 03/21] build(gokord): upgrade to latest version --- commands/config.go | 79 +++++++++++++++++++++++---------------------- commands/credits.go | 9 +++--- commands/rank.go | 17 +++++----- commands/reset.go | 19 +++++------ commands/top.go | 15 +++++---- config/guild.go | 4 +-- events.go | 20 ++++++------ go.mod | 12 +++---- go.sum | 40 +++++++---------------- main.go | 25 +++++++------- user/level.go | 24 +++++++------- user/member.go | 4 +-- user/xp.go | 14 ++++---- 13 files changed, 136 insertions(+), 146 deletions(-) diff --git a/commands/config.go b/commands/config.go index 0f9a6d6..c6eca0d 100644 --- a/commands/config.go +++ b/commands/config.go @@ -3,7 +3,8 @@ package commands import ( "fmt" "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" @@ -33,7 +34,7 @@ var ( configModifyMap = map[string]uint{} ) -func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func Config(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { cfg := config.GetGuildConfig(i.GuildID) roles := "" l := len(cfg.XpRoles) - 1 @@ -69,7 +70,7 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O err := resp.AddEmbed(&discordgo.MessageEmbed{ Type: discordgo.EmbedTypeRich, Title: "Config", - Color: utils.Success, + Color: 0x10E6AD, Fields: []*discordgo.MessageEmbedField{ { Name: "Salon par défaut", @@ -127,7 +128,7 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.O }, }}).IsEphemeral().Send() if err != nil { - utils.SendAlert("config/guild.go - Sending config", err.Error()) + logger.Alert("config/guild.go - Sending config", err.Error()) } } @@ -138,7 +139,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { cfg := config.GetGuildConfig(i.GuildID) - resp := utils.NewResponseBuilder(s, i) + resp := cmd.NewResponseBuilder(s, i) msgData := i.MessageComponentData() switch msgData.CustomID { @@ -173,7 +174,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { }, }}).Send() if err != nil { - utils.SendAlert("config/guild.go - Sending config", err.Error()) + logger.Alert("config/guild.go - Sending config", err.Error()) } case XpRoleAdd, XpRoleEdit: cID := XpRoleAddLevel @@ -195,7 +196,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { }}). Send() if err != nil { - utils.SendAlert("config/guild.go - Sending modal to add", err.Error()) + logger.Alert("config/guild.go - Sending modal to add", err.Error()) } case XpRoleAddRole: roleId := msgData.Values[0] @@ -203,7 +204,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { if r.RoleID == roleId { err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() if err != nil { - utils.SendAlert("commands/config.go - Role already in config", err.Error()) + logger.Alert("commands/config.go - Role already in config", err.Error()) } return } @@ -214,7 +215,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { }) err := cfg.Save() if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Saving config", err.Error(), "guild_id", i.GuildID, @@ -223,7 +224,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { ) } if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { - utils.SendAlert("commands/config.go - Sending success", err.Error()) + logger.Alert("commands/config.go - Sending success", err.Error()) } case XpRoleEditRole: roleId := msgData.Values[0] @@ -231,14 +232,14 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { if r == nil { err := resp.SetMessage("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()) + logger.Alert("commands/config.go - Role not found (edit)", err.Error()) } return } r.XP = configModifyMap[getKeyConfigRole(i)] err := gokord.DB.Save(r).Error if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Saving config", err.Error(), "guild_id", i.GuildID, @@ -247,7 +248,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { ) } if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { - utils.SendAlert("commands/config.go - Sending success", err.Error()) + logger.Alert("commands/config.go - Sending success", err.Error()) } case XpRoleDel: err := resp.IsEphemeral(). @@ -258,7 +259,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { }}}). Send() if err != nil { - utils.SendAlert("config/guild.go - Sending response to del", err.Error()) + logger.Alert("config/guild.go - Sending response to del", err.Error()) } case XpRoleDelRole: roleId := msgData.Values[0] @@ -266,13 +267,13 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { if r == nil { err := resp.SetMessage("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()) + logger.Alert("commands/config.go - Role not found (del)", err.Error()) } return } err := gokord.DB.Delete(r).Error if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Deleting entry", err.Error(), "guild_id", i.GuildID, @@ -281,12 +282,12 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { ) } if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { - utils.SendAlert("commands/config.go - Sending success", err.Error()) + logger.Alert("commands/config.go - Sending success", err.Error()) } default: err := resp.SetMessage("Le type d'action n'est pas valide.").Send() if err != nil { - utils.SendAlert("commands/config.go - Invalid action type", err.Error()) + logger.Alert("commands/config.go - Invalid action type", err.Error()) } return } @@ -296,7 +297,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { if i.Type != discordgo.InteractionModalSubmit { return } - resp := utils.NewResponseBuilder(s, i) + resp := cmd.NewResponseBuilder(s, i) modalData := i.ModalSubmitData() @@ -312,7 +313,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { if err = resp.IsEphemeral(). SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). Send(); err != nil { - utils.SendAlert("command/config.go - Sending bad number", err.Error()) + logger.Alert("command/config.go - Sending bad number", err.Error()) } return } @@ -337,7 +338,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { }}}). Send() if err != nil { - utils.SendAlert("config/guild.go - Sending response to add/edit", err.Error()) + logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) } } @@ -345,14 +346,14 @@ func getKeyConfigRole(i *discordgo.InteractionCreate) string { return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) } -func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() // verify every args t, ok := optMap["type"] if !ok { err := resp.SetMessage("Le type d'action n'a pas été renseigné.").Send() if err != nil { - utils.SendAlert("commands/config.go - Action type not set", err.Error()) + logger.Alert("commands/config.go - Action type not set", err.Error()) } return } @@ -361,7 +362,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap if !ok { err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() if err != nil { - utils.SendAlert("commands/config.go - Channel not set (disabled)", err.Error()) + logger.Alert("commands/config.go - Channel not set (disabled)", err.Error()) } return } @@ -372,7 +373,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap if strings.Contains(cfg.DisabledChannels, channel.ID) { err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send() if err != nil { - utils.SendAlert("commands/config.go - Channel already disabled", err.Error()) + logger.Alert("commands/config.go - Channel already disabled", err.Error()) } return } @@ -381,7 +382,7 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap if !strings.Contains(cfg.DisabledChannels, channel.ID) { err := resp.SetMessage("Le salon n'est pas désactivé").Send() if err != nil { - utils.SendAlert("commands/config.go - Channel not disabled", err.Error()) + logger.Alert("commands/config.go - Channel not disabled", err.Error()) } return } @@ -389,14 +390,14 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap default: err := resp.SetMessage("Le type d'action n'est pas valide.").Send() if err != nil { - utils.SendAlert("commands/config.go - Invalid action type", err.Error()) + logger.Alert("commands/config.go - Invalid action type", err.Error()) } return } // save err := cfg.Save() if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Saving config", err.Error(), "guild_id", @@ -411,18 +412,18 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap err = resp.SetMessage("Modification sauvegardé.").Send() } if err != nil { - utils.SendAlert("commands/config.go - Modification saved message", err.Error()) + logger.Alert("commands/config.go - Modification saved message", err.Error()) } } -func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() // verify every args salon, ok := optMap["channel"] if !ok { err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() if err != nil { - utils.SendAlert("commands/config.go - Channel not set (fallback)", err.Error()) + logger.Alert("commands/config.go - Channel not set (fallback)", err.Error()) } return } @@ -430,7 +431,7 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, if channel.Type != discordgo.ChannelTypeGuildText { err := resp.SetMessage("Le salon n'est pas un salon textuel.").Send() if err != nil { - utils.SendAlert("commands/config.go - Invalid channel type", err.Error()) + logger.Alert("commands/config.go - Invalid channel type", err.Error()) } return } @@ -439,7 +440,7 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, // save err := cfg.Save() if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Saving config", err.Error(), "guild_id", @@ -452,18 +453,18 @@ func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, err = resp.SetMessage("Salon enregistré.").Send() } if err != nil { - utils.SendAlert("commands/config.go - Channel saved message", err.Error()) + logger.Alert("commands/config.go - Channel saved message", err.Error()) } } -func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() // verify every args days, ok := optMap["days"] if !ok { err := resp.SetMessage("Le nombre de jours n'a pas été renseigné.").Send() if err != nil { - utils.SendAlert("commands/config.go - Days not set (fallback)", err.Error()) + logger.Alert("commands/config.go - Days not set (fallback)", err.Error()) } return } @@ -471,7 +472,7 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea if d < 30 { err := resp.SetMessage("Le nombre de jours est inférieur à 30.").Send() if err != nil { - utils.SendAlert("commands/config.go - Days < 30 (fallback)", err.Error()) + logger.Alert("commands/config.go - Days < 30 (fallback)", err.Error()) } return } @@ -480,7 +481,7 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea cfg.DaysXPRemains = uint(d) err := cfg.Save() if err != nil { - utils.SendAlert( + logger.Alert( "commands/config.go - Saving config", err.Error(), "guild_id", @@ -493,6 +494,6 @@ func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCrea err = resp.SetMessage("Nombre de jours enregistré.").Send() } if err != nil { - utils.SendAlert("commands/config.go - Days saved message", err.Error()) + logger.Alert("commands/config.go - Days saved message", err.Error()) } } diff --git a/commands/credits.go b/commands/credits.go index 0943761..cdcfe6e 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -1,17 +1,18 @@ package commands import ( - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" ) -func Credits(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { err := resp.AddEmbed(&discordgo.MessageEmbed{ Type: discordgo.EmbedTypeRich, Title: "Crédits", Description: "Auteur du bot : @anhgelus (https://github.com/anhgelus)\nLangage : Go 1.24\nLicence : AGPLv3", - Color: utils.Success, + Color: 0x10E6AD, Fields: []*discordgo.MessageEmbedField{ { Name: "anhgelus/gokord", @@ -31,6 +32,6 @@ func Credits(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils. }, }).Send() if err != nil { - utils.SendAlert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID) + logger.Alert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID) } } diff --git a/commands/rank.go b/commands/rank.go index dd5859a..9673089 100644 --- a/commands/rank.go +++ b/commands/rank.go @@ -2,13 +2,14 @@ package commands import ( "fmt" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/user" "github.com/bwmarrin/discordgo" ) -func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { c := user.GetCopaing(i.Member.User.ID, i.GuildID) // current user = member who used /rank msg := "Votre niveau" m := i.Member @@ -18,12 +19,12 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt if u.Bot { err = resp.SetMessage("Imagine si les bots avaient un niveau :rolling_eyes:").IsEphemeral().Send() if err != nil { - utils.SendAlert("commands/rank.go - Reply error user is a bot", err.Error()) + logger.Alert("commands/rank.go - Reply error user is a bot", err.Error()) } } m, err = s.GuildMember(i.GuildID, u.ID) if err != nil { - utils.SendAlert( + logger.Alert( "commands/rank.go - Fetching guild member", err.Error(), "discord_id", @@ -33,7 +34,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt ) err = resp.SetMessage("Erreur : impossible de récupérer le membre").IsEphemeral().Send() if err != nil { - utils.SendAlert("commands/rank.go - Reply error fetching guild member", err.Error()) + logger.Alert("commands/rank.go - Reply error fetching guild member", err.Error()) } return } @@ -42,7 +43,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt } xp, err := c.GetXP() if err != nil { - utils.SendAlert( + logger.Alert( "commands/rank.go - Fetching xp", err.Error(), "discord_id", @@ -52,7 +53,7 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt ) err = resp.SetMessage("Erreur : impossible de récupérer l'XP").IsEphemeral().Send() if err != nil { - utils.SendAlert("commands/rank.go - Reply error fetching xp", err.Error()) + logger.Alert("commands/rank.go - Reply error fetching xp", err.Error()) } return } @@ -66,6 +67,6 @@ func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opt nxtLvlXP-xp, )).Send() if err != nil { - utils.SendAlert("commands/rank.go - Sending rank", err.Error()) + logger.Alert("commands/rank.go - Sending rank", err.Error()) } } diff --git a/commands/reset.go b/commands/reset.go index c4275a0..653a1d9 100644 --- a/commands/reset.go +++ b/commands/reset.go @@ -2,44 +2,45 @@ package commands import ( "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/user" "github.com/bwmarrin/discordgo" ) -func Reset(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func Reset(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { var copaings []*user.Copaing gokord.DB.Where("guild_id = ?", i.GuildID).Delete(&copaings) if err := resp.IsEphemeral().SetMessage("L'XP a été reset.").Send(); err != nil { - utils.SendAlert("commands/reset.go - Sending success (all)", err.Error()) + logger.Alert("commands/reset.go - Sending success (all)", err.Error()) } } -func ResetUser(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func ResetUser(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() v, ok := optMap["user"] if !ok { if err := resp.SetMessage("Le user n'a pas été renseigné.").Send(); err != nil { - utils.SendAlert("commands/reset.go - Copaing not set", err.Error()) + logger.Alert("commands/reset.go - Copaing not set", err.Error()) } return } m := v.UserValue(s) if m.Bot { if err := resp.SetMessage("Les bots n'ont pas de niveau :upside_down:").Send(); err != nil { - utils.SendAlert("commands/reset.go - Copaing not set", err.Error()) + logger.Alert("commands/reset.go - Copaing not set", err.Error()) } return } err := user.GetCopaing(m.ID, i.GuildID).Delete() if err != nil { - utils.SendAlert("commands/reset.go - Copaing not deleted", err.Error(), "discord_id", m.ID, "guild_id", i.GuildID) + logger.Alert("commands/reset.go - Copaing not deleted", err.Error(), "discord_id", m.ID, "guild_id", i.GuildID) err = resp.SetMessage("Erreur : impossible de reset l'utilisateur").Send() if err != nil { - utils.SendAlert("commands/reset.go - Error deleting", err.Error()) + logger.Alert("commands/reset.go - Error deleting", err.Error()) } } if err = resp.SetMessage("Le user bien été reset.").Send(); err != nil { - utils.SendAlert("commands/reset.go - Sending success (user)", err.Error()) + logger.Alert("commands/reset.go - Sending success (user)", err.Error()) } } diff --git a/commands/top.go b/commands/top.go index daa1ccb..09fa91f 100644 --- a/commands/top.go +++ b/commands/top.go @@ -2,7 +2,8 @@ package commands import ( "fmt" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/user" @@ -10,10 +11,10 @@ import ( "sync" ) -func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.OptionMap, resp *utils.ResponseBuilder) { +func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { err := resp.IsDeferred().Send() if err != nil { - utils.SendAlert("commands/top.go - Sending deferred", err.Error()) + logger.Alert("commands/top.go - Sending deferred", err.Error()) return } embeds := make([]*discordgo.MessageEmbed, 3) @@ -23,18 +24,18 @@ func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opti defer wg.Done() tops, err := user.GetBestXP(i.GuildID, n, d) if err != nil { - utils.SendAlert("commands/top.go - Fetching best xp", err.Error(), "n", n, "d", d, "id", id, "guild_id", i.GuildID) + logger.Alert("commands/top.go - Fetching best xp", err.Error(), "n", n, "d", d, "id", id, "guild_id", i.GuildID) embeds[id] = &discordgo.MessageEmbed{ Title: s, Description: "Erreur : impossible de récupérer la liste", - Color: utils.Error, + Color: 0x831010, } return } embeds[id] = &discordgo.MessageEmbed{ Title: s, Description: genTopsMessage(tops), - Color: utils.Success, + Color: 0x10E6AD, } } cfg := config.GetGuildConfig(i.GuildID) @@ -57,7 +58,7 @@ func Top(s *discordgo.Session, i *discordgo.InteractionCreate, optMap utils.Opti } err = resp.Send() if err != nil { - utils.SendAlert("commands/top.go - Sending response top", err.Error()) + logger.Alert("commands/top.go - Sending response top", err.Error()) } }() } diff --git a/config/guild.go b/config/guild.go index fb7eaef..0606ed0 100644 --- a/config/guild.go +++ b/config/guild.go @@ -2,7 +2,7 @@ package config import ( "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/logger" "strings" ) @@ -25,7 +25,7 @@ type XpRole struct { func GetGuildConfig(guildID string) *GuildConfig { cfg := GuildConfig{GuildID: guildID} if err := cfg.Load(); err != nil { - utils.SendAlert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID) + logger.Alert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID) return nil } return &cfg diff --git a/events.go b/events.go index e5fd37a..4821e38 100644 --- a/events.go +++ b/events.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/les-copaings-bot/user" @@ -37,7 +37,7 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { xp := min(exp.MessageXP(uint(len(trimmed)), exp.CalcDiversity(trimmed)), MaxXpPerMessage) c.AddXP(s, m.Member, xp, func(_ uint, _ uint) { if err := s.MessageReactionAdd(m.ChannelID, m.Message.ID, "⬆"); err != nil { - utils.SendAlert( + logger.Alert( "events.go - add reaction for new level", err.Error(), "channel id", m.ChannelID, "message id", m.Message.ID, @@ -69,7 +69,7 @@ func genMapKey(guildID string, userID string) string { } func onConnection(_ *discordgo.Session, e *discordgo.VoiceStateUpdate) { - utils.SendDebug("User connected", "username", e.Member.DisplayName()) + logger.Debug("User connected", "username", e.Member.DisplayName()) connectedSince[genMapKey(e.GuildID, e.UserID)] = time.Now().Unix() } @@ -79,17 +79,17 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { // check the validity of user con, ok := connectedSince[genMapKey(e.GuildID, e.UserID)] if !ok || con == NotConnected { - utils.SendWarn(fmt.Sprintf( + logger.Warn(fmt.Sprintf( "User %s diconnect from a vocal but was registered as not connected", e.Member.DisplayName(), )) return } timeInVocal := now - con - utils.SendDebug("User disconnected", "username", e.Member.DisplayName(), "time in vocal", timeInVocal) + logger.Debug("User disconnected", "username", e.Member.DisplayName(), "time in vocal", timeInVocal) connectedSince[genMapKey(e.GuildID, e.UserID)] = NotConnected // add exp if timeInVocal < 0 { - utils.SendAlert( + logger.Alert( "events.go - Calculating time spent in vocal", "the time is negative", "discord_id", e.UserID, "guild_id", e.GuildID, @@ -97,7 +97,7 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { return } if timeInVocal > MaxTimeInVocal { - utils.SendWarn(fmt.Sprintf("User %s spent more than 6 hours in vocal", e.Member.DisplayName())) + logger.Warn(fmt.Sprintf("User %s spent more than 6 hours in vocal", e.Member.DisplayName())) timeInVocal = MaxTimeInVocal } e.Member.GuildID = e.GuildID @@ -110,19 +110,19 @@ func onDisconnect(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { "%s est maintenant niveau %d", e.Member.Mention(), newLevel, )) if err != nil { - utils.SendAlert("events.go - Sending new level in fallback channel", err.Error()) + logger.Alert("events.go - Sending new level in fallback channel", err.Error()) } }) } func OnLeave(_ *discordgo.Session, e *discordgo.GuildMemberRemove) { - utils.SendDebug("Leave event", "user_id", e.User.ID) + logger.Debug("Leave event", "user_id", e.User.ID) if e.User.Bot { return } c := user.GetCopaing(e.User.ID, e.GuildID) if err := c.Delete(); err != nil { - utils.SendAlert( + logger.Alert( "events.go - deleting user from db", err.Error(), "user_id", e.User.ID, "guild_id", e.GuildID, diff --git a/go.mod b/go.mod index 0c5e711..d3fae23 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.10.3 + github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1 github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 @@ -21,9 +21,9 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/redis/go-redis/v9 v9.9.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.25.0 // indirect + github.com/redis/go-redis/v9 v9.12.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect ) diff --git a/go.sum b/go.sum index 3157ad4..e083c17 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,9 @@ -github.com/anhgelus/gokord v0.7.0 h1:G9GrxD3/xEreXsiz3etKxbeHsNHrwT5I/VEKSWpyrj4= -github.com/anhgelus/gokord v0.7.0/go.mod h1:SfGKyMMGjNS9F9ehiEb5Cc58P+uoDdLDGGYqXSiMCus= -github.com/anhgelus/gokord v0.9.0 h1:vz7jHZ6papdt/xehe+nx4DxOLquPO6QukW8UzH81bGY= -github.com/anhgelus/gokord v0.9.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= -github.com/anhgelus/gokord v0.10.0 h1:FaaMWntaezmSCvarcSMjfWr5OXVVwwzlDMnNX8gXaWE= -github.com/anhgelus/gokord v0.10.0/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= -github.com/anhgelus/gokord v0.10.3 h1:4uKHRXFsRg1wRJQ3Sikz1MpL68cUZxyseRD+5hVe7tE= -github.com/anhgelus/gokord v0.10.3/go.mod h1:NSepHjTV61LUnuyGgHxEhZNMnWREErGFyOtRYPgdx/E= +github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1 h1:irHDC/xUm65yLFx5HnVeCbM0qQRpm0i1vQHsyLXeEbo= +github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/bwmarrin/discordgo v0.28.1 h1:gXsuo2GBO7NbR6uqmrrBDplPUx2T3nzu775q/Rd1aG4= -github.com/bwmarrin/discordgo v0.28.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno= github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -28,8 +20,6 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= @@ -44,28 +34,26 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0 github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI= -github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= -github.com/redis/go-redis/v9 v9.9.0 h1:URbPQ4xVQSQhZ27WMQVmZSo3uT3pL+4IdHVcYq2nVfM= -github.com/redis/go-redis/v9 v9.9.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/redis/go-redis/v9 v9.12.0 h1:XlVPGlflh4nxfhsNXPA8Qp6EmEfTo0rp8oaBzPipXnU= +github.com/redis/go-redis/v9 v9.12.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -73,9 +61,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= -gorm.io/gorm v1.26.1 h1:ghB2gUI9FkS46luZtn6DLZ0f6ooBJ5IbVej2ENFDjRw= -gorm.io/gorm v1.26.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= -gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs= -gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= diff --git a/main.go b/main.go index 1047d16..0f70810 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,8 @@ import ( "errors" "flag" "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + cmd "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/commands" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/user" @@ -31,7 +32,7 @@ var ( func init() { err := godotenv.Load() if err != nil && !errors.Is(err, os.ErrNotExist) { - utils.SendWarn("Error while loading .env file", "error", err.Error()) + logger.Warn("Error while loading .env file", "error", err.Error()) } flag.StringVar(&token, "token", os.Getenv("TOKEN"), "token of the bot") } @@ -51,27 +52,27 @@ func main() { adm := gokord.AdminPermission - rankCmd := gokord.NewCommand("rank", "Affiche le niveau d'un copaing"). - AddOption(gokord.NewOption( + rankCmd := cmd.New("rank", "Affiche le niveau d'un copaing"). + AddOption(cmd.NewOption( discordgo.ApplicationCommandOptionUser, "copaing", "Le niveau du Copaing que vous souhaitez obtenir", )). SetHandler(commands.Rank) - configCmd := gokord.NewCommand("config", "Modifie la config"). + configCmd := cmd.New("config", "Modifie la config"). SetPermission(&adm). SetHandler(commands.Config) - topCmd := gokord.NewCommand("top", "Copaings les plus actifs"). + topCmd := cmd.New("top", "Copaings les plus actifs"). SetHandler(commands.Top) - resetCmd := gokord.NewCommand("reset", "Reset l'xp"). + resetCmd := cmd.New("reset", "Reset l'xp"). SetHandler(commands.Reset). SetPermission(&adm) - resetUserCmd := gokord.NewCommand("reset-user", "Reset l'xp d'un utilisation"). - AddOption(gokord.NewOption( + resetUserCmd := cmd.New("reset-user", "Reset l'xp d'un utilisation"). + AddOption(cmd.NewOption( discordgo.ApplicationCommandOptionUser, "user", "Copaing a reset", @@ -79,7 +80,7 @@ func main() { SetHandler(commands.ResetUser). SetPermission(&adm) - creditsCmd := gokord.NewCommand("credits", "Crédits"). + creditsCmd := cmd.New("credits", "Crédits"). SetHandler(commands.Credits) innovations, err := gokord.LoadInnovationFromJson(updatesData) @@ -107,7 +108,7 @@ func main() { Content: "Les Copaings Bot " + Version.String(), }, }, - Commands: []gokord.CommandBuilder{ + Commands: []cmd.CommandBuilder{ rankCmd, configCmd, topCmd, @@ -135,7 +136,7 @@ func afterInit(dg *discordgo.Session) { dg.AddHandler(OnVoiceUpdate) dg.AddHandler(OnLeave) - stopPeriodicReducer = utils.NewTimer(24*time.Hour, func(stop chan<- interface{}) { + stopPeriodicReducer = gokord.NewTimer(24*time.Hour, func(stop chan<- interface{}) { user.PeriodicReducer(dg) }) diff --git a/user/level.go b/user/level.go index 6d9b674..82ae608 100644 --- a/user/level.go +++ b/user/level.go @@ -2,7 +2,7 @@ package user import ( "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" @@ -16,7 +16,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { xpForLevel := exp.LevelXP(level) for _, role := range cfg.XpRoles { if role.XP <= xpForLevel && !slices.Contains(m.Roles, role.RoleID) { - utils.SendDebug( + logger.Debug( "Add role", "role_id", role.RoleID, "user_id", m.User.ID, @@ -24,10 +24,10 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { ) err := dg.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.RoleID) if err != nil { - utils.SendAlert("user/level.go - Adding role", err.Error(), "role_id", role.RoleID) + logger.Alert("user/level.go - Adding role", err.Error(), "role_id", role.RoleID) } } else if role.XP > xpForLevel && slices.Contains(m.Roles, role.RoleID) { - utils.SendDebug( + logger.Debug( "Remove role", "role_id", role.RoleID, "user_id", m.User.ID, @@ -35,7 +35,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { ) err := dg.GuildMemberRoleRemove(m.GuildID, m.User.ID, role.RoleID) if err != nil { - utils.SendAlert("user/level.go - Removing role", err.Error(), "role_id", role.RoleID) + logger.Alert("user/level.go - Removing role", err.Error(), "role_id", role.RoleID) } } } @@ -44,7 +44,7 @@ func onNewLevel(dg *discordgo.Session, m *discordgo.Member, level uint) { func (c *Copaing) OnNewLevel(dg *discordgo.Session, level uint) { m, err := dg.GuildMember(c.GuildID, c.DiscordID) if err != nil { - utils.SendAlert( + logger.Alert( "user/level.go - Getting member for new level", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID, @@ -58,7 +58,7 @@ func PeriodicReducer(dg *discordgo.Session) { wg := &sync.WaitGroup{} var cs []*Copaing if err := gokord.DB.Find(&cs).Error; err != nil { - utils.SendAlert("user/level.go - Fetching all copaings", err.Error()) + logger.Alert("user/level.go - Fetching all copaings", err.Error()) return } cxps := make([]*cXP, len(cs)) @@ -71,7 +71,7 @@ func PeriodicReducer(dg *discordgo.Session) { defer wg.Done() xp, err := c.GetXP() if err != nil { - utils.SendAlert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) + logger.Alert("user/level.go - Getting XP", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) xp = 0 } cxps[i] = &cXP{ @@ -92,25 +92,25 @@ func PeriodicReducer(dg *discordgo.Session) { Delete(&CopaingXP{}). Error if err != nil { - utils.SendAlert("user/level.go - Removing old XP", err.Error(), "guild_id", g.ID) + logger.Alert("user/level.go - Removing old XP", err.Error(), "guild_id", g.ID) } }() } wg.Wait() for i, c := range cxps { if i%50 == 49 { - utils.SendDebug("Sleeping...") + logger.Debug("Sleeping...") time.Sleep(15 * time.Second) // prevents spamming the API } oldXp := c.GetXP() xp, err := c.ToCopaing().GetXP() if err != nil { - utils.SendAlert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID) + logger.Alert("user/level.go - Getting XP", err.Error(), "guild_id", c.ID, "discord_id", c.DiscordID) continue } if exp.Level(oldXp) != exp.Level(xp) { c.OnNewLevel(dg, exp.Level(xp)) } } - utils.SendDebug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds)) + logger.Debug("Periodic reduce finished", "len(guilds)", len(dg.State.Guilds)) } diff --git a/user/member.go b/user/member.go index 77ceb2e..a0e50fc 100644 --- a/user/member.go +++ b/user/member.go @@ -2,7 +2,7 @@ package user import ( "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/logger" "time" ) @@ -34,7 +34,7 @@ const ( func GetCopaing(discordID string, guildID string) *Copaing { c := Copaing{DiscordID: discordID, GuildID: guildID} if err := c.Load(); err != nil { - utils.SendAlert( + logger.Alert( "user/member.go - Loading user", err.Error(), "discord_id", diff --git a/user/xp.go b/user/xp.go index 71a1ced..c446977 100644 --- a/user/xp.go +++ b/user/xp.go @@ -2,7 +2,7 @@ package user import ( "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/utils" + "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" @@ -26,14 +26,14 @@ func (c *cXP) GetXP() uint { func (c *Copaing) AddXP(s *discordgo.Session, m *discordgo.Member, xp uint, fn func(uint, uint)) { old, err := c.GetXP() if err != nil { - utils.SendAlert("user/xp.go - Getting xp", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID) + logger.Alert("user/xp.go - Getting xp", err.Error(), "discord_id", c.DiscordID, "guild_id", c.GuildID) return } pastLevel := exp.Level(old) - utils.SendDebug("Adding xp", "member", m.DisplayName(), "old xp", old, "xp to add", xp, "old level", pastLevel) + 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}) if err = c.Save(); err != nil { - utils.SendAlert( + logger.Alert( "user/xp.go - Saving user", err.Error(), "xp", @@ -76,7 +76,7 @@ func (c *Copaing) GetXPForDays(n uint) (uint, error) { var cxp CopaingXP err = gokord.DB.ScanRows(rows, &cxp) if err != nil { - utils.SendAlert("user/xp.go - Scanning rows", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) + logger.Alert("user/xp.go - Scanning rows", err.Error(), "copaing_id", c.ID, "guild_id", c.GuildID) continue } xp += cxp.XP @@ -103,7 +103,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) { var c Copaing err = gokord.DB.ScanRows(rows, &c) if err != nil { - utils.SendAlert("user/xp.go - Scanning rows", err.Error(), "guild_id", guildId) + logger.Alert("user/xp.go - Scanning rows", err.Error(), "guild_id", guildId) continue } wg.Add(1) @@ -111,7 +111,7 @@ func GetBestXP(guildId string, n uint, d int) ([]CopaingAccess, error) { defer wg.Done() xp, err := c.GetXPForDays(uint(d)) if err != nil { - utils.SendAlert("user/xp.go - Fetching xp", err.Error(), "discord_id", c.DiscordID, "guild_id", guildId) + logger.Alert("user/xp.go - Fetching xp", err.Error(), "discord_id", c.DiscordID, "guild_id", guildId) return } l = append(l, &cXP{Cxp: xp, Copaing: &c}) From 0cd725108c998aedcf647ce39cd80a325b33cfa0 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 6 Aug 2025 02:47:41 +0200 Subject: [PATCH 04/21] feat(gokord): use new component lib --- commands/config.go | 148 ++++++++++++++++++++------------------------- go.mod | 2 +- go.sum | 6 ++ 3 files changed, 74 insertions(+), 82 deletions(-) diff --git a/commands/config.go b/commands/config.go index c6eca0d..3084056 100644 --- a/commands/config.go +++ b/commands/config.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" @@ -34,7 +35,7 @@ var ( configModifyMap = map[string]uint{} ) -func Config(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { +func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { cfg := config.GetGuildConfig(i.GuildID) roles := "" l := len(cfg.XpRoles) - 1 @@ -93,40 +94,30 @@ func Config(s *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa Inline: false, }, }, - }).AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ - discordgo.SelectMenu{ - MenuType: discordgo.StringSelectMenu, - CustomID: ConfigModify, - Placeholder: "Modifier...", - Options: []discordgo.SelectMenuOption{ - { - Label: "Rôles liés à l'XP", - Value: ConfigModifyXpRole, - Description: "Gère les rôles liés à l'XP", - Emoji: &discordgo.ComponentEmoji{Name: "🏅"}, - }, - { - Label: "Salons désactivés", - Value: ConfigModifyDisChannel, - Description: "Gère les salons désactivés", - Emoji: &discordgo.ComponentEmoji{Name: "❌"}, - }, - { - Label: "Salons de repli", // I don't have a better idea for this... - Value: ConfigModifyFallbackChannel, - Description: "Spécifie le salon de repli", - Emoji: &discordgo.ComponentEmoji{Name: "💾"}, - }, - { - Label: "Temps avec la réduction", - Value: ConfigModifyTimeReduce, - Description: "Gère le temps avant la réduction d'XP", - Emoji: &discordgo.ComponentEmoji{Name: "⌛"}, - }, - }, - Disabled: false, - }, - }}).IsEphemeral().Send() + }).SetComponents(component.New().Add(new(component.ActionRow).Add( + new(component.StringSelect).SetPlaceholder("Modifier..."). + AddOption( + component.NewSelectOption("Rôles liés à l'XP", ConfigModifyXpRole). + SetDescription("Gère les rôles liés à l'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), + ). + AddOption( + component.NewSelectOption("Salons désactivés", ConfigModifyDisChannel). + SetDescription("Gère les salons désactivés"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ). + AddOption( + component.NewSelectOption("Salons de repli", ConfigModifyFallbackChannel). // I don't have a better idea for this... + SetDescription("Spécifie le salon de repli"). + SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), + ). + AddOption( + component.NewSelectOption("Temps avec la réduction", ConfigModifyTimeReduce). + SetDescription("Gère le temps avant la réduction d'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), + ). + SetCustomID(ConfigModify), + ))).IsEphemeral().Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) } @@ -146,33 +137,25 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case ConfigModifyXpRole: err := resp.IsEphemeral(). SetMessage("Action à réaliser"). - AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ - discordgo.SelectMenu{ - MenuType: discordgo.StringSelectMenu, - CustomID: ConfigModify, - Placeholder: "Action", - Options: []discordgo.SelectMenuOption{ - { - Label: "Ajouter", - Value: XpRoleAdd, - Description: "Ajouter un rôle à XP", - Emoji: &discordgo.ComponentEmoji{Name: "⬆️"}, - }, - { - Label: "Supprimer", - Value: XpRoleDel, - Description: "Supprimer un rôle à XP", - Emoji: &discordgo.ComponentEmoji{Name: "❌"}, - }, - { - Label: "Modifier", - Value: XpRoleEdit, - Description: "Modifier un rôle à XP", - Emoji: &discordgo.ComponentEmoji{Name: "📝"}, - }, - }, - }, - }}).Send() + SetComponents(component.New().Add(new(component.ActionRow).Add( + new(component.StringSelect).SetPlaceholder("Action"). + AddOption( + component.NewSelectOption("Ajouter", XpRoleAdd). + SetDescription("Ajouter un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), + ). + AddOption( + component.NewSelectOption("Modifier", XpRoleEdit). + SetDescription("Modifier un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), + ). + AddOption( + component.NewSelectOption("Supprimer", XpRoleDel). + SetDescription("Supprimer un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ). + SetCustomID(ConfigModify), + ))).Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) } @@ -181,19 +164,28 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { if msgData.CustomID == XpRoleEdit { cID = XpRoleEditLevel } + component.New().ForModal().Add(new(component.ActionRow).Add( + new(component.TextInput). + SetLabel("Niveau"). + SetPlaceholder("5"). + IsRequired(). + SetMinLength(0). + SetMaxLength(5). + SetStyle(discordgo.TextInputShort). + SetCustomID(cID), + )) err := resp.IsModal(). SetTitle("Role"). - AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{ - discordgo.TextInput{ - CustomID: cID, - Label: "Niveau", - Style: discordgo.TextInputShort, - Placeholder: "5", - Required: true, - MinLength: 0, - MaxLength: 5, - }, - }}). + SetComponents(component.New().ForModal().Add(new(component.ActionRow).Add( + new(component.TextInput). + SetLabel("Niveau"). + SetPlaceholder("5"). + IsRequired(). + SetMinLength(0). + SetMaxLength(5). + SetStyle(discordgo.TextInputShort). + SetCustomID(cID), + ))). Send() if err != nil { logger.Alert("config/guild.go - Sending modal to add", err.Error()) @@ -253,10 +245,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case XpRoleDel: err := resp.IsEphemeral(). SetMessage("Rôle à supprimer"). - AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{discordgo.SelectMenu{ - MenuType: discordgo.RoleSelectMenu, - CustomID: XpRoleDelRole, - }}}). + SetComponents(component.New().Add(new(component.ActionRow).Add(new(component.RoleSelect).SetCustomID(XpRoleDelRole)))). Send() if err != nil { logger.Alert("config/guild.go - Sending response to del", err.Error()) @@ -332,10 +321,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { err = resp.IsEphemeral(). SetMessage("Rôle à supprimer"). - AddComponent(discordgo.ActionsRow{Components: []discordgo.MessageComponent{discordgo.SelectMenu{ - MenuType: discordgo.RoleSelectMenu, - CustomID: cID, - }}}). + SetComponents(component.New().Add(new(component.ActionRow).Add(new(component.RoleSelect).SetCustomID(cID)))). Send() if err != nil { logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) diff --git a/go.mod b/go.mod index d3fae23..8b4222f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1 + github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index e083c17..21beeff 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,11 @@ github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1 h1:irHDC/xUm65yLFx5HnVeCbM0qQRpm0i1vQHsyLXeEbo= github.com/anhgelus/gokord v0.11.1-0.20250806000243-ddfebe2ca6f1/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250806003339-90cf89cde031 h1:56vqHQzCHCcMeBBhAWUyC466BETAhaIl1Qiq93WdrYI= +github.com/anhgelus/gokord v0.11.1-0.20250806003339-90cf89cde031/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250806003704-21a4238c64a0 h1:Jj4ja4bshyEHOd+stqqB4e0iuggtDx/hzZ8K69+rtsE= +github.com/anhgelus/gokord v0.11.1-0.20250806003704-21a4238c64a0/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f h1:OSTlmWDVRGw3bt4uHOBFyUWNNl5VV3zaB6Xj0TWlY0s= +github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= From 376b3ec29600c9661cea4899ddf94f8515fc7bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 14:39:36 +0200 Subject: [PATCH 05/21] feat(command): use gokord function to create components --- commands/config.go | 40 +++++++++++++--------------------------- go.mod | 2 +- go.sum | 2 ++ 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/commands/config.go b/commands/config.go index 3084056..deb006c 100644 --- a/commands/config.go +++ b/commands/config.go @@ -94,8 +94,8 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa Inline: false, }, }, - }).SetComponents(component.New().Add(new(component.ActionRow).Add( - new(component.StringSelect).SetPlaceholder("Modifier..."). + }).SetComponents(component.New().Add(component.NewActionRow().Add( + component.NewStringSelect(ConfigModify).SetPlaceholder("Modifier..."). AddOption( component.NewSelectOption("Rôles liés à l'XP", ConfigModifyXpRole). SetDescription("Gère les rôles liés à l'XP"). @@ -107,7 +107,8 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), ). AddOption( - component.NewSelectOption("Salons de repli", ConfigModifyFallbackChannel). // I don't have a better idea for this... + // I don't have a better idea for this... + component.NewSelectOption("Salons de repli", ConfigModifyFallbackChannel). SetDescription("Spécifie le salon de repli"). SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), ). @@ -115,8 +116,7 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa component.NewSelectOption("Temps avec la réduction", ConfigModifyTimeReduce). SetDescription("Gère le temps avant la réduction d'XP"). SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), - ). - SetCustomID(ConfigModify), + ), ))).IsEphemeral().Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) @@ -137,8 +137,8 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case ConfigModifyXpRole: err := resp.IsEphemeral(). SetMessage("Action à réaliser"). - SetComponents(component.New().Add(new(component.ActionRow).Add( - new(component.StringSelect).SetPlaceholder("Action"). + SetComponents(component.New().Add(component.NewActionRow().Add( + component.NewStringSelect(ConfigModify).SetPlaceholder("Action"). AddOption( component.NewSelectOption("Ajouter", XpRoleAdd). SetDescription("Ajouter un rôle à XP"). @@ -153,8 +153,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { component.NewSelectOption("Supprimer", XpRoleDel). SetDescription("Supprimer un rôle à XP"). SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ). - SetCustomID(ConfigModify), + ), ))).Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) @@ -164,27 +163,14 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { if msgData.CustomID == XpRoleEdit { cID = XpRoleEditLevel } - component.New().ForModal().Add(new(component.ActionRow).Add( - new(component.TextInput). - SetLabel("Niveau"). - SetPlaceholder("5"). - IsRequired(). - SetMinLength(0). - SetMaxLength(5). - SetStyle(discordgo.TextInputShort). - SetCustomID(cID), - )) err := resp.IsModal(). SetTitle("Role"). - SetComponents(component.New().ForModal().Add(new(component.ActionRow).Add( - new(component.TextInput). - SetLabel("Niveau"). + SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( + component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). SetPlaceholder("5"). IsRequired(). SetMinLength(0). - SetMaxLength(5). - SetStyle(discordgo.TextInputShort). - SetCustomID(cID), + SetMaxLength(5), ))). Send() if err != nil { @@ -245,7 +231,7 @@ func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { case XpRoleDel: err := resp.IsEphemeral(). SetMessage("Rôle à supprimer"). - SetComponents(component.New().Add(new(component.ActionRow).Add(new(component.RoleSelect).SetCustomID(XpRoleDelRole)))). + SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). Send() if err != nil { logger.Alert("config/guild.go - Sending response to del", err.Error()) @@ -321,7 +307,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { err = resp.IsEphemeral(). SetMessage("Rôle à supprimer"). - SetComponents(component.New().Add(new(component.ActionRow).Add(new(component.RoleSelect).SetCustomID(cID)))). + SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))). Send() if err != nil { logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) diff --git a/go.mod b/go.mod index 8b4222f..854bc8a 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f + github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index 21beeff..3a682b4 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/anhgelus/gokord v0.11.1-0.20250806003704-21a4238c64a0 h1:Jj4ja4bshyEH github.com/anhgelus/gokord v0.11.1-0.20250806003704-21a4238c64a0/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f h1:OSTlmWDVRGw3bt4uHOBFyUWNNl5VV3zaB6Xj0TWlY0s= github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d h1:cbhaSdjjipiF5yFijgewtkjE0HyHZ6tJR7zHBpCkkBI= +github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= From 3d89f9c3543b8898ae5c29281e9007fbdb003c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 14:54:47 +0200 Subject: [PATCH 06/21] feat(command): use gokord new handle for config --- commands/config.go | 282 +++++++++++++++++++++------------------------ main.go | 38 +++--- 2 files changed, 155 insertions(+), 165 deletions(-) diff --git a/commands/config.go b/commands/config.go index deb006c..b29cfdd 100644 --- a/commands/config.go +++ b/commands/config.go @@ -123,164 +123,148 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa } } -func ConfigXP(s *discordgo.Session, i *discordgo.InteractionCreate) { - if i.Type != discordgo.InteractionMessageComponent { - return - } - - cfg := config.GetGuildConfig(i.GuildID) - - resp := cmd.NewResponseBuilder(s, i) - - msgData := i.MessageComponentData() - switch msgData.CustomID { - case ConfigModifyXpRole: - err := resp.IsEphemeral(). - SetMessage("Action à réaliser"). - SetComponents(component.New().Add(component.NewActionRow().Add( - component.NewStringSelect(ConfigModify).SetPlaceholder("Action"). - AddOption( - component.NewSelectOption("Ajouter", XpRoleAdd). - SetDescription("Ajouter un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), - ). - AddOption( - component.NewSelectOption("Modifier", XpRoleEdit). - SetDescription("Modifier un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), - ). - AddOption( - component.NewSelectOption("Supprimer", XpRoleDel). - SetDescription("Supprimer un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ), - ))).Send() - if err != nil { - logger.Alert("config/guild.go - Sending config", err.Error()) - } - case XpRoleAdd, XpRoleEdit: - cID := XpRoleAddLevel - if msgData.CustomID == XpRoleEdit { - cID = XpRoleEditLevel - } - err := resp.IsModal(). - SetTitle("Role"). - SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( - component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). - SetPlaceholder("5"). - IsRequired(). - SetMinLength(0). - SetMaxLength(5), - ))). - Send() - if err != nil { - logger.Alert("config/guild.go - Sending modal to add", err.Error()) - } - case XpRoleAddRole: - roleId := msgData.Values[0] - for _, r := range cfg.XpRoles { - if r.RoleID == roleId { - err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() - if err != nil { - logger.Alert("commands/config.go - Role already in config", err.Error()) - } - return - } - } - cfg.XpRoles = append(cfg.XpRoles, config.XpRole{ - XP: configModifyMap[getKeyConfigRole(i)], - RoleID: roleId, - }) - err := cfg.Save() - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "add", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } - case XpRoleEditRole: - roleId := msgData.Values[0] - _, r := cfg.FindXpRole(roleId) - if r == nil { - err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() - if err != nil { - logger.Alert("commands/config.go - Role not found (edit)", err.Error()) - } - return - } - r.XP = configModifyMap[getKeyConfigRole(i)] - err := gokord.DB.Save(r).Error - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "edit", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } - case XpRoleDel: - err := resp.IsEphemeral(). - SetMessage("Rôle à supprimer"). - SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). - Send() - if err != nil { - logger.Alert("config/guild.go - Sending response to del", err.Error()) - } - case XpRoleDelRole: - roleId := msgData.Values[0] - _, r := cfg.FindXpRole(roleId) - if r == nil { - err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() - if err != nil { - logger.Alert("commands/config.go - Role not found (del)", err.Error()) - } - return - } - err := gokord.DB.Delete(r).Error - if err != nil { - logger.Alert( - "commands/config.go - Deleting entry", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "del", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } - default: - err := resp.SetMessage("Le type d'action n'est pas valide.").Send() - if err != nil { - logger.Alert("commands/config.go - Invalid action type", err.Error()) - } - return +func ConfigModifyXPRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.IsEphemeral(). + SetMessage("Action à réaliser"). + SetComponents(component.New().Add(component.NewActionRow().Add( + component.NewStringSelect(ConfigModify).SetPlaceholder("Action"). + AddOption( + component.NewSelectOption("Ajouter", XpRoleAdd). + SetDescription("Ajouter un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), + ). + AddOption( + component.NewSelectOption("Modifier", XpRoleEdit). + SetDescription("Modifier un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), + ). + AddOption( + component.NewSelectOption("Supprimer", XpRoleDel). + SetDescription("Supprimer un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ), + ))).Send() + if err != nil { + logger.Alert("config/guild.go - Sending config", err.Error()) } } -func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { - if i.Type != discordgo.InteractionModalSubmit { +func ConfigXPRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cID := XpRoleAddLevel + if data.CustomID == XpRoleEdit { + cID = XpRoleEditLevel + } + err := resp.IsModal(). + SetTitle("Role"). + SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( + component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). + SetPlaceholder("5"). + IsRequired(). + SetMinLength(0). + SetMaxLength(5), + ))). + Send() + if err != nil { + logger.Alert("config/guild.go - Sending modal to add/edit", err.Error()) + } +} + +func ConfigXPRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := config.GetGuildConfig(i.GuildID) + roleId := data.Values[0] + for _, r := range cfg.XpRoles { + if r.RoleID == roleId { + err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() + if err != nil { + logger.Alert("commands/config.go - Role already in config", err.Error()) + } + return + } + } + cfg.XpRoles = append(cfg.XpRoles, config.XpRole{ + XP: configModifyMap[getKeyConfigRole(i)], + RoleID: roleId, + }) + err := cfg.Save() + if err != nil { + logger.Alert( + "commands/config.go - Saving config", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "add", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} + +func ConfigXPRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := config.GetGuildConfig(i.GuildID) + roleId := data.Values[0] + _, r := cfg.FindXpRole(roleId) + if r == nil { + err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() + if err != nil { + logger.Alert("commands/config.go - Role not found (edit)", err.Error()) + } return } - resp := cmd.NewResponseBuilder(s, i) + r.XP = configModifyMap[getKeyConfigRole(i)] + err := gokord.DB.Save(r).Error + if err != nil { + logger.Alert( + "commands/config.go - Saving config", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "edit", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} - modalData := i.ModalSubmitData() +func ConfigXPRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.IsEphemeral(). + SetMessage("Rôle à supprimer"). + SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). + Send() + if err != nil { + logger.Alert("config/guild.go - Sending response to del", err.Error()) + } +} - if modalData.CustomID != XpRoleAddLevel && modalData.CustomID != XpRoleEditLevel { +func ConfigXPRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := config.GetGuildConfig(i.GuildID) + roleId := data.Values[0] + _, r := cfg.FindXpRole(roleId) + if r == nil { + err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() + if err != nil { + logger.Alert("commands/config.go - Sending role not found (del)", err.Error()) + } return } + err := gokord.DB.Delete(r).Error + if err != nil { + logger.Alert( + "commands/config.go - Deleting entry", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "del", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} - input := modalData.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) +func ConfigXPRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) { + input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) k := getKeyConfigRole(i) in, err := strconv.Atoi(input.Value) @@ -300,7 +284,7 @@ func ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { cID := XpRoleAddRole resp.SetMessage("Rôle à ajouter") - if modalData.CustomID == XpRoleEditLevel { + if data.CustomID == XpRoleEditLevel { cID = XpRoleEditLevel resp.SetMessage("Rôle à modifier") } diff --git a/main.go b/main.go index 0f70810..79ec452 100644 --- a/main.go +++ b/main.go @@ -116,31 +116,37 @@ func main() { resetUserCmd, creditsCmd, }, - AfterInit: afterInit, + AfterInit: func(dg *discordgo.Session) { + stopPeriodicReducer = gokord.NewTimer(24*time.Hour, func(stop chan<- interface{}) { + user.PeriodicReducer(dg) + }) + }, Innovations: innovations, Version: &Version, Intents: discordgo.IntentsAllWithoutPrivileged | discordgo.IntentsMessageContent | discordgo.IntentGuildMembers, } + + // interaction: /config + bot.HandleMessageComponent(commands.ConfigModifyXPRole, commands.ConfigModifyXpRole) + bot.HandleMessageComponent(commands.ConfigXPRoleAddEdit, commands.XpRoleAdd) + bot.HandleMessageComponent(commands.ConfigXPRoleAddEdit, commands.XpRoleEdit) + bot.HandleMessageComponent(commands.ConfigXPRoleAddRole, commands.XpRoleAddRole) + bot.HandleMessageComponent(commands.ConfigXPRoleEditRole, commands.XpRoleEditRole) + bot.HandleMessageComponent(commands.ConfigXPRoleDel, commands.XpRoleDel) + bot.HandleMessageComponent(commands.ConfigXPRoleDelRole, commands.XpRoleDelRole) + bot.HandleModal(commands.ConfigXPRoleLevel, commands.XpRoleAddLevel) + bot.HandleModal(commands.ConfigXPRoleLevel, commands.XpRoleEditLevel) + + // xp handlers + bot.AddHandler(OnMessage) + bot.AddHandler(OnVoiceUpdate) + bot.AddHandler(OnLeave) + bot.Start() if stopPeriodicReducer != nil { stopPeriodicReducer <- true } } - -func afterInit(dg *discordgo.Session) { - // handlers - dg.AddHandler(OnMessage) - dg.AddHandler(OnVoiceUpdate) - dg.AddHandler(OnLeave) - - stopPeriodicReducer = gokord.NewTimer(24*time.Hour, func(stop chan<- interface{}) { - user.PeriodicReducer(dg) - }) - - //interaction: /config - dg.AddHandler(commands.ConfigXP) - dg.AddHandler(commands.ConfigXPModal) -} From 0968c18b15c5fe58c0220fa20ef6a87000bd1a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:02:51 +0200 Subject: [PATCH 07/21] style(config): move everything related to modify xp role in package config --- commands/config.go | 198 +---------------------------------------- config/guild.go | 7 -- config/xp_role.go | 214 +++++++++++++++++++++++++++++++++++++++++++++ main.go | 18 ++-- 4 files changed, 224 insertions(+), 213 deletions(-) create mode 100644 config/xp_role.go diff --git a/commands/config.go b/commands/config.go index b29cfdd..9aa4682 100644 --- a/commands/config.go +++ b/commands/config.go @@ -2,37 +2,20 @@ package commands import ( "fmt" - "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" - "strconv" "strings" - "time" ) const ( ConfigModify = "config_modify" - ConfigModifyXpRole = "xp_role" ConfigModifyDisChannel = "disabled_channel" ConfigModifyFallbackChannel = "fallback_channel" ConfigModifyTimeReduce = "time_reduce" - // xp role related - XpRoleAdd = "xp_role_add" - XpRoleAddLevel = "xp_role_add_level" - XpRoleAddRole = "xp_role_add_role" - XpRoleDel = "xp_role_del" - XpRoleDelRole = "xp_role_del_role" - XpRoleEdit = "xp_role_edit" - XpRoleEditLevel = "xp_role_edit_level" - XpRoleEditRole = "xp_role_edit_role" -) - -var ( - configModifyMap = map[string]uint{} ) func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { @@ -97,7 +80,7 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa }).SetComponents(component.New().Add(component.NewActionRow().Add( component.NewStringSelect(ConfigModify).SetPlaceholder("Modifier..."). AddOption( - component.NewSelectOption("Rôles liés à l'XP", ConfigModifyXpRole). + component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). SetDescription("Gère les rôles liés à l'XP"). SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), ). @@ -123,185 +106,6 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa } } -func ConfigModifyXPRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - err := resp.IsEphemeral(). - SetMessage("Action à réaliser"). - SetComponents(component.New().Add(component.NewActionRow().Add( - component.NewStringSelect(ConfigModify).SetPlaceholder("Action"). - AddOption( - component.NewSelectOption("Ajouter", XpRoleAdd). - SetDescription("Ajouter un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), - ). - AddOption( - component.NewSelectOption("Modifier", XpRoleEdit). - SetDescription("Modifier un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), - ). - AddOption( - component.NewSelectOption("Supprimer", XpRoleDel). - SetDescription("Supprimer un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ), - ))).Send() - if err != nil { - logger.Alert("config/guild.go - Sending config", err.Error()) - } -} - -func ConfigXPRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - cID := XpRoleAddLevel - if data.CustomID == XpRoleEdit { - cID = XpRoleEditLevel - } - err := resp.IsModal(). - SetTitle("Role"). - SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( - component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). - SetPlaceholder("5"). - IsRequired(). - SetMinLength(0). - SetMaxLength(5), - ))). - Send() - if err != nil { - logger.Alert("config/guild.go - Sending modal to add/edit", err.Error()) - } -} - -func ConfigXPRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - cfg := config.GetGuildConfig(i.GuildID) - roleId := data.Values[0] - for _, r := range cfg.XpRoles { - if r.RoleID == roleId { - err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() - if err != nil { - logger.Alert("commands/config.go - Role already in config", err.Error()) - } - return - } - } - cfg.XpRoles = append(cfg.XpRoles, config.XpRole{ - XP: configModifyMap[getKeyConfigRole(i)], - RoleID: roleId, - }) - err := cfg.Save() - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "add", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } -} - -func ConfigXPRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - cfg := config.GetGuildConfig(i.GuildID) - roleId := data.Values[0] - _, r := cfg.FindXpRole(roleId) - if r == nil { - err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() - if err != nil { - logger.Alert("commands/config.go - Role not found (edit)", err.Error()) - } - return - } - r.XP = configModifyMap[getKeyConfigRole(i)] - err := gokord.DB.Save(r).Error - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "edit", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } -} - -func ConfigXPRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - err := resp.IsEphemeral(). - SetMessage("Rôle à supprimer"). - SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). - Send() - if err != nil { - logger.Alert("config/guild.go - Sending response to del", err.Error()) - } -} - -func ConfigXPRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - cfg := config.GetGuildConfig(i.GuildID) - roleId := data.Values[0] - _, r := cfg.FindXpRole(roleId) - if r == nil { - err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() - if err != nil { - logger.Alert("commands/config.go - Sending role not found (del)", err.Error()) - } - return - } - err := gokord.DB.Delete(r).Error - if err != nil { - logger.Alert( - "commands/config.go - Deleting entry", - err.Error(), - "guild_id", i.GuildID, - "role_id", roleId, - "type", "del", - ) - } - if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) - } -} - -func ConfigXPRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) { - input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) - - k := getKeyConfigRole(i) - in, err := strconv.Atoi(input.Value) - if err != nil || in < 0 { - if err = resp.IsEphemeral(). - SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). - Send(); err != nil { - logger.Alert("command/config.go - Sending bad number", err.Error()) - } - return - } - configModifyMap[k] = uint(in) - go func(i *discordgo.InteractionCreate, k string) { - time.Sleep(5 * time.Minute) - delete(configModifyMap, k) - }(i, k) - - cID := XpRoleAddRole - resp.SetMessage("Rôle à ajouter") - if data.CustomID == XpRoleEditLevel { - cID = XpRoleEditLevel - resp.SetMessage("Rôle à modifier") - } - - err = resp.IsEphemeral(). - SetMessage("Rôle à supprimer"). - SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))). - Send() - if err != nil { - logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) - } -} - -func getKeyConfigRole(i *discordgo.InteractionCreate) string { - return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) -} - func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() // verify every args diff --git a/config/guild.go b/config/guild.go index 0606ed0..3071d95 100644 --- a/config/guild.go +++ b/config/guild.go @@ -15,13 +15,6 @@ type GuildConfig struct { DaysXPRemains uint `gorm:"default:90"` // 30 * 3 = 90 (three months) } -type XpRole struct { - ID uint `gorm:"primarykey"` - XP uint - RoleID string - GuildConfigID uint -} - func GetGuildConfig(guildID string) *GuildConfig { cfg := GuildConfig{GuildID: guildID} if err := cfg.Load(); err != nil { diff --git a/config/xp_role.go b/config/xp_role.go new file mode 100644 index 0000000..bed5c57 --- /dev/null +++ b/config/xp_role.go @@ -0,0 +1,214 @@ +package config + +import ( + "fmt" + "github.com/anhgelus/gokord" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/component" + "github.com/anhgelus/gokord/logger" + "github.com/bwmarrin/discordgo" + "strconv" + "time" +) + +type XpRole struct { + ID uint `gorm:"primarykey"` + XP uint + RoleID string + GuildConfigID uint +} + +const ( + ModifyXpRole = "xp_role" + XpRoleAdd = "xp_role_add" + XpRoleAddLevel = "xp_role_add_level" + XpRoleAddRole = "xp_role_add_role" + XpRoleDel = "xp_role_del" + XpRoleDelRole = "xp_role_del_role" + XpRoleEdit = "xp_role_edit" + XpRoleEditLevel = "xp_role_edit_level" + XpRoleEditRole = "xp_role_edit_role" +) + +var ( + configModifyMap = map[string]uint{} +) + +func HandleModifyXpRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.IsEphemeral(). + SetMessage("Action à réaliser"). + SetComponents(component.New().Add(component.NewActionRow().Add( + component.NewStringSelect(ModifyXpRole).SetPlaceholder("Action"). + AddOption( + component.NewSelectOption("Ajouter", XpRoleAdd). + SetDescription("Ajouter un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), + ). + AddOption( + component.NewSelectOption("Modifier", XpRoleEdit). + SetDescription("Modifier un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), + ). + AddOption( + component.NewSelectOption("Supprimer", XpRoleDel). + SetDescription("Supprimer un rôle à XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ), + ))).Send() + if err != nil { + logger.Alert("config/guild.go - Sending config", err.Error()) + } +} + +func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cID := XpRoleAddLevel + if data.CustomID == XpRoleEdit { + cID = XpRoleEditLevel + } + err := resp.IsModal(). + SetTitle("Role"). + SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( + component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). + SetPlaceholder("5"). + IsRequired(). + SetMinLength(0). + SetMaxLength(5), + ))). + Send() + if err != nil { + logger.Alert("config/guild.go - Sending modal to add/edit", err.Error()) + } +} + +func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + roleId := data.Values[0] + for _, r := range cfg.XpRoles { + if r.RoleID == roleId { + err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() + if err != nil { + logger.Alert("commands/config.go - Role already in config", err.Error()) + } + return + } + } + cfg.XpRoles = append(cfg.XpRoles, XpRole{ + XP: configModifyMap[getKeyConfigRole(i)], + RoleID: roleId, + }) + err := cfg.Save() + if err != nil { + logger.Alert( + "commands/config.go - Saving config", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "add", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} + +func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + roleId := data.Values[0] + _, r := cfg.FindXpRole(roleId) + if r == nil { + err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() + if err != nil { + logger.Alert("commands/config.go - Role not found (edit)", err.Error()) + } + return + } + r.XP = configModifyMap[getKeyConfigRole(i)] + err := gokord.DB.Save(r).Error + if err != nil { + logger.Alert( + "commands/config.go - Saving config", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "edit", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} + +func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.IsEphemeral(). + SetMessage("Rôle à supprimer"). + SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). + Send() + if err != nil { + logger.Alert("config/guild.go - Sending response to del", err.Error()) + } +} + +func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + roleId := data.Values[0] + _, r := cfg.FindXpRole(roleId) + if r == nil { + err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() + if err != nil { + logger.Alert("commands/config.go - Sending role not found (del)", err.Error()) + } + return + } + err := gokord.DB.Delete(r).Error + if err != nil { + logger.Alert( + "commands/config.go - Deleting entry", + err.Error(), + "guild_id", i.GuildID, + "role_id", roleId, + "type", "del", + ) + } + if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { + logger.Alert("commands/config.go - Sending success", err.Error()) + } +} + +func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) { + input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) + + k := getKeyConfigRole(i) + in, err := strconv.Atoi(input.Value) + if err != nil || in < 0 { + if err = resp.IsEphemeral(). + SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). + Send(); err != nil { + logger.Alert("command/config.go - Sending bad number", err.Error()) + } + return + } + configModifyMap[k] = uint(in) + go func(i *discordgo.InteractionCreate, k string) { + time.Sleep(5 * time.Minute) + delete(configModifyMap, k) + }(i, k) + + cID := XpRoleAddRole + resp.SetMessage("Rôle à ajouter") + if data.CustomID == XpRoleEditLevel { + cID = XpRoleEditLevel + resp.SetMessage("Rôle à modifier") + } + + err = resp.IsEphemeral(). + SetMessage("Rôle à supprimer"). + SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))). + Send() + if err != nil { + logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) + } +} + +func getKeyConfigRole(i *discordgo.InteractionCreate) string { + return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) +} diff --git a/main.go b/main.go index 79ec452..b57fcb5 100644 --- a/main.go +++ b/main.go @@ -129,15 +129,15 @@ func main() { } // interaction: /config - bot.HandleMessageComponent(commands.ConfigModifyXPRole, commands.ConfigModifyXpRole) - bot.HandleMessageComponent(commands.ConfigXPRoleAddEdit, commands.XpRoleAdd) - bot.HandleMessageComponent(commands.ConfigXPRoleAddEdit, commands.XpRoleEdit) - bot.HandleMessageComponent(commands.ConfigXPRoleAddRole, commands.XpRoleAddRole) - bot.HandleMessageComponent(commands.ConfigXPRoleEditRole, commands.XpRoleEditRole) - bot.HandleMessageComponent(commands.ConfigXPRoleDel, commands.XpRoleDel) - bot.HandleMessageComponent(commands.ConfigXPRoleDelRole, commands.XpRoleDelRole) - bot.HandleModal(commands.ConfigXPRoleLevel, commands.XpRoleAddLevel) - bot.HandleModal(commands.ConfigXPRoleLevel, commands.XpRoleEditLevel) + bot.HandleMessageComponent(config.HandleModifyXpRole, config.ModifyXpRole) + bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleAdd) + bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleEdit) + bot.HandleMessageComponent(config.HandleXpRoleAddRole, config.XpRoleAddRole) + bot.HandleMessageComponent(config.HandleXpRoleEditRole, config.XpRoleEditRole) + bot.HandleMessageComponent(config.HandleXpRoleDel, config.XpRoleDel) + bot.HandleMessageComponent(config.HandleXpRoleDelRole, config.XpRoleDelRole) + bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleAddLevel) + bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleEditLevel) // xp handlers bot.AddHandler(OnMessage) From 6d19ef42c4135dac57c23bf6d00041423255598d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:13:19 +0200 Subject: [PATCH 08/21] refactor(config): handle fallback channel --- commands/config.go | 51 ++++------------------------------------------ config/channel.go | 43 ++++++++++++++++++++++++++++++++++++++ config/xp_role.go | 18 ++++++++-------- main.go | 4 ++++ 4 files changed, 60 insertions(+), 56 deletions(-) create mode 100644 config/channel.go diff --git a/commands/config.go b/commands/config.go index 9aa4682..18c5aa9 100644 --- a/commands/config.go +++ b/commands/config.go @@ -12,10 +12,8 @@ import ( ) const ( - ConfigModify = "config_modify" - ConfigModifyDisChannel = "disabled_channel" - ConfigModifyFallbackChannel = "fallback_channel" - ConfigModifyTimeReduce = "time_reduce" + ConfigModify = "config_modify" + ConfigModifyTimeReduce = "time_reduce" ) func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { @@ -85,13 +83,13 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), ). AddOption( - component.NewSelectOption("Salons désactivés", ConfigModifyDisChannel). + component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). SetDescription("Gère les salons désactivés"). SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), ). AddOption( // I don't have a better idea for this... - component.NewSelectOption("Salons de repli", ConfigModifyFallbackChannel). + component.NewSelectOption("Salons de repli", config.ModifyFallbackChannel). SetDescription("Spécifie le salon de repli"). SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), ). @@ -176,47 +174,6 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap } } -func ConfigFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() - // verify every args - salon, ok := optMap["channel"] - if !ok { - err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() - if err != nil { - logger.Alert("commands/config.go - Channel not set (fallback)", err.Error()) - } - return - } - channel := salon.ChannelValue(s) - if channel.Type != discordgo.ChannelTypeGuildText { - err := resp.SetMessage("Le salon n'est pas un salon textuel.").Send() - if err != nil { - logger.Alert("commands/config.go - Invalid channel type", err.Error()) - } - return - } - cfg := config.GetGuildConfig(i.GuildID) - cfg.FallbackChannel = channel.ID - // save - err := cfg.Save() - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", - i.GuildID, - "channel_id", - channel.ID, - ) - err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send() - } else { - err = resp.SetMessage("Salon enregistré.").Send() - } - if err != nil { - logger.Alert("commands/config.go - Channel saved message", err.Error()) - } -} - func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { resp.IsEphemeral() // verify every args diff --git a/config/channel.go b/config/channel.go new file mode 100644 index 0000000..2ef8b48 --- /dev/null +++ b/config/channel.go @@ -0,0 +1,43 @@ +package config + +import ( + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/component" + "github.com/anhgelus/gokord/logger" + "github.com/bwmarrin/discordgo" +) + +const ( + ModifyDisChannel = "disabled_channel" + ModifyFallbackChannel = "fallback_channel" + FallbackChannelSet = "fallback_channel_set" +) + +func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.SetMessage("Salon de repli...").SetComponents(component.New().Add(component.NewActionRow().Add( + component.NewChannelSelect(FallbackChannelSet).AddChannelType(discordgo.ChannelTypeGuildText), + ))).Send() + if err != nil { + logger.Alert("config/channel.go - Sending channel list", err.Error()) + } +} + +func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() + + cfg := GetGuildConfig(i.GuildID) + channelID := data.Values[0] + + cfg.FallbackChannel = channelID + err := cfg.Save() + if err != nil { + logger.Alert("config/channel.go - Saving fallback channel", err.Error()) + if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil { + logger.Alert("config/channel.go - Sending error while saving channel", err.Error()) + } + return + } + if err = resp.SetMessage("Salon sauvegardé.").Send(); err != nil { + logger.Alert("config/channel.go - Sending channel saved", err.Error()) + } +} diff --git a/config/xp_role.go b/config/xp_role.go index bed5c57..8f98265 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -87,7 +87,7 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d if r.RoleID == roleId { err := resp.SetMessage("Le rôle est déjà présent dans la config").Send() if err != nil { - logger.Alert("commands/config.go - Role already in config", err.Error()) + logger.Alert("config/xp_role.go - Role already in config", err.Error()) } return } @@ -99,7 +99,7 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d err := cfg.Save() if err != nil { logger.Alert( - "commands/config.go - Saving config", + "config/xp_role.go - Saving config", err.Error(), "guild_id", i.GuildID, "role_id", roleId, @@ -107,7 +107,7 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d ) } if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) + logger.Alert("config/xp_role.go - Sending success", err.Error()) } } @@ -118,7 +118,7 @@ func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, if r == nil { err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() if err != nil { - logger.Alert("commands/config.go - Role not found (edit)", err.Error()) + logger.Alert("config/xp_role.go - Role not found (edit)", err.Error()) } return } @@ -126,7 +126,7 @@ func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, err := gokord.DB.Save(r).Error if err != nil { logger.Alert( - "commands/config.go - Saving config", + "config/xp_role.go - Saving config", err.Error(), "guild_id", i.GuildID, "role_id", roleId, @@ -134,7 +134,7 @@ func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, ) } if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) + logger.Alert("config/xp_role.go - Sending success", err.Error()) } } @@ -155,14 +155,14 @@ func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d if r == nil { err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send() if err != nil { - logger.Alert("commands/config.go - Sending role not found (del)", err.Error()) + logger.Alert("config/xp_role.go - Sending role not found (del)", err.Error()) } return } err := gokord.DB.Delete(r).Error if err != nil { logger.Alert( - "commands/config.go - Deleting entry", + "config/xp_role.go - Deleting entry", err.Error(), "guild_id", i.GuildID, "role_id", roleId, @@ -170,7 +170,7 @@ func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d ) } if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { - logger.Alert("commands/config.go - Sending success", err.Error()) + logger.Alert("config/xp_role.go - Sending success", err.Error()) } } diff --git a/main.go b/main.go index b57fcb5..d03283a 100644 --- a/main.go +++ b/main.go @@ -129,6 +129,7 @@ func main() { } // interaction: /config + // xp related bot.HandleMessageComponent(config.HandleModifyXpRole, config.ModifyXpRole) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleAdd) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleEdit) @@ -138,6 +139,9 @@ func main() { bot.HandleMessageComponent(config.HandleXpRoleDelRole, config.XpRoleDelRole) bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleAddLevel) bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleEditLevel) + // channel related + bot.HandleMessageComponent(config.HandleModifyFallbackChannel, config.ModifyFallbackChannel) + bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) // xp handlers bot.AddHandler(OnMessage) From 51a412b32d2ab690bb2bb571f9337a69aae41ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:19:31 +0200 Subject: [PATCH 09/21] refactor(config): use button to select action for xp role --- config/xp_role.go | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/config/xp_role.go b/config/xp_role.go index 8f98265..4a99b30 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -37,24 +37,20 @@ var ( func HandleModifyXpRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { err := resp.IsEphemeral(). SetMessage("Action à réaliser"). - SetComponents(component.New().Add(component.NewActionRow().Add( - component.NewStringSelect(ModifyXpRole).SetPlaceholder("Action"). - AddOption( - component.NewSelectOption("Ajouter", XpRoleAdd). - SetDescription("Ajouter un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), - ). - AddOption( - component.NewSelectOption("Modifier", XpRoleEdit). - SetDescription("Modifier un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), - ). - AddOption( - component.NewSelectOption("Supprimer", XpRoleDel). - SetDescription("Supprimer un rôle à XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ), - ))).Send() + SetComponents(component.New().Add(component.NewActionRow(). + Add(component.NewButton(XpRoleAdd, discordgo.PrimaryButton). + SetLabel("Ajouter"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), + ). + Add(component.NewButton(XpRoleEdit, discordgo.SecondaryButton). + SetLabel("Modifier"). + SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}), + ). + Add(component.NewButton(XpRoleDel, discordgo.DangerButton). + SetLabel("Supprimer"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ), + )).Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) } From 0b93ea5daaee317a45291df188af13a6fab0c481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:35:10 +0200 Subject: [PATCH 10/21] refactor(config): handle xp reduce --- commands/config.go | 46 ++---------------------------------- config/xp_reduce.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ config/xp_role.go | 2 +- main.go | 5 +++- 4 files changed, 64 insertions(+), 46 deletions(-) create mode 100644 config/xp_reduce.go diff --git a/commands/config.go b/commands/config.go index 18c5aa9..14e4691 100644 --- a/commands/config.go +++ b/commands/config.go @@ -12,8 +12,7 @@ import ( ) const ( - ConfigModify = "config_modify" - ConfigModifyTimeReduce = "time_reduce" + ConfigModify = "config_modify" ) func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { @@ -94,7 +93,7 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), ). AddOption( - component.NewSelectOption("Temps avec la réduction", ConfigModifyTimeReduce). + component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). SetDescription("Gère le temps avant la réduction d'XP"). SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), ), @@ -173,44 +172,3 @@ func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap logger.Alert("commands/config.go - Modification saved message", err.Error()) } } - -func ConfigPeriodBeforeReduce(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() - // verify every args - days, ok := optMap["days"] - if !ok { - err := resp.SetMessage("Le nombre de jours n'a pas été renseigné.").Send() - if err != nil { - logger.Alert("commands/config.go - Days not set (fallback)", err.Error()) - } - return - } - d := days.IntValue() - if d < 30 { - err := resp.SetMessage("Le nombre de jours est inférieur à 30.").Send() - if err != nil { - logger.Alert("commands/config.go - Days < 30 (fallback)", err.Error()) - } - return - } - // save - cfg := config.GetGuildConfig(i.GuildID) - cfg.DaysXPRemains = uint(d) - err := cfg.Save() - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", - i.GuildID, - "days", - d, - ) - err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send() - } else { - err = resp.SetMessage("Nombre de jours enregistré.").Send() - } - if err != nil { - logger.Alert("commands/config.go - Days saved message", err.Error()) - } -} diff --git a/config/xp_reduce.go b/config/xp_reduce.go new file mode 100644 index 0000000..8e97c26 --- /dev/null +++ b/config/xp_reduce.go @@ -0,0 +1,57 @@ +package config + +import ( + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/component" + "github.com/anhgelus/gokord/logger" + "github.com/bwmarrin/discordgo" + "strconv" +) + +const ( + ModifyTimeReduce = "time_reduce" + TimeReduceSet = "time_reduce_set" +) + +func HandleModifyPeriodicReduce(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.IsModal().SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( + component.NewTextInput(TimeReduceSet, "Jours avant la réduction", discordgo.TextInputShort). + SetMinLength(1). + SetMaxLength(3), + ))).Send() + if err != nil { + logger.Alert("config/xp_reduce.go - Sending modal for periodic reduce", err.Error()) + } +} + +func HandleTimeReduceSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() + v := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput).Value + days, err := strconv.Atoi(v) + if err != nil { + logger.Debug(err.Error()) + if err = resp.SetMessage("Nombres de jours invalides. Merci de mettre un entier.").Send(); err != nil { + logger.Alert("config/channel.go - Sending bad input", err.Error()) + } + return + } + if days < 30 { + err = resp.SetMessage("Le nombre de jours est inférieur à 30.").Send() + if err != nil { + logger.Alert("commands/config.go - Days < 30 (fallback)", err.Error()) + } + return + } + cfg := GetGuildConfig(i.GuildID) + cfg.DaysXPRemains = uint(days) + if err = cfg.Save(); err != nil { + logger.Alert("config/channel.go - Saving days xp remains", err.Error()) + if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil { + logger.Alert("config/channel.go - Sending error while saving days xp remains", err.Error()) + } + return + } + if err = resp.SetMessage("Modification sauvegardée.").Send(); err != nil { + logger.Alert("config/channel.go - Sending days saved", err.Error()) + } +} diff --git a/config/xp_role.go b/config/xp_role.go index 4a99b30..b01da27 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -192,7 +192,7 @@ func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, dat cID := XpRoleAddRole resp.SetMessage("Rôle à ajouter") if data.CustomID == XpRoleEditLevel { - cID = XpRoleEditLevel + cID = XpRoleEditRole resp.SetMessage("Rôle à modifier") } diff --git a/main.go b/main.go index d03283a..5efb9b9 100644 --- a/main.go +++ b/main.go @@ -129,7 +129,7 @@ func main() { } // interaction: /config - // xp related + // xp role related bot.HandleMessageComponent(config.HandleModifyXpRole, config.ModifyXpRole) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleAdd) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleEdit) @@ -142,6 +142,9 @@ func main() { // channel related bot.HandleMessageComponent(config.HandleModifyFallbackChannel, config.ModifyFallbackChannel) bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) + // reduce related + bot.HandleMessageComponent(config.HandleModifyPeriodicReduce, config.ModifyTimeReduce) + bot.HandleModal(config.HandleTimeReduceSet, config.TimeReduceSet) // xp handlers bot.AddHandler(OnMessage) From b9466f812284bb6feb793de6229cf7266dc24361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:51:17 +0200 Subject: [PATCH 11/21] refactor(config): handle disabled channels --- commands/config.go | 70 -------------------------------------- config/channel.go | 85 ++++++++++++++++++++++++++++++++++++++++++++-- main.go | 5 +++ 3 files changed, 88 insertions(+), 72 deletions(-) diff --git a/commands/config.go b/commands/config.go index 14e4691..23a0add 100644 --- a/commands/config.go +++ b/commands/config.go @@ -102,73 +102,3 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa logger.Alert("config/guild.go - Sending config", err.Error()) } } - -func ConfigChannel(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() - // verify every args - t, ok := optMap["type"] - if !ok { - err := resp.SetMessage("Le type d'action n'a pas été renseigné.").Send() - if err != nil { - logger.Alert("commands/config.go - Action type not set", err.Error()) - } - return - } - ts := t.StringValue() - salon, ok := optMap["channel"] - if !ok { - err := resp.SetMessage("Le salon n'a pas été renseigné.").Send() - if err != nil { - logger.Alert("commands/config.go - Channel not set (disabled)", err.Error()) - } - return - } - channel := salon.ChannelValue(s) - cfg := config.GetGuildConfig(i.GuildID) - switch ts { - case "add": - if strings.Contains(cfg.DisabledChannels, channel.ID) { - err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send() - if err != nil { - logger.Alert("commands/config.go - Channel already disabled", err.Error()) - } - return - } - cfg.DisabledChannels += channel.ID + ";" - case "del": - if !strings.Contains(cfg.DisabledChannels, channel.ID) { - err := resp.SetMessage("Le salon n'est pas désactivé").Send() - if err != nil { - logger.Alert("commands/config.go - Channel not disabled", err.Error()) - } - return - } - cfg.DisabledChannels = strings.ReplaceAll(cfg.DisabledChannels, channel.ID+";", "") - default: - err := resp.SetMessage("Le type d'action n'est pas valide.").Send() - if err != nil { - logger.Alert("commands/config.go - Invalid action type", err.Error()) - } - return - } - // save - err := cfg.Save() - if err != nil { - logger.Alert( - "commands/config.go - Saving config", - err.Error(), - "guild_id", - i.GuildID, - "type", - ts, - "channel_id", - channel.ID, - ) - err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send() - } else { - err = resp.SetMessage("Modification sauvegardé.").Send() - } - if err != nil { - logger.Alert("commands/config.go - Modification saved message", err.Error()) - } -} diff --git a/config/channel.go b/config/channel.go index 2ef8b48..7b74169 100644 --- a/config/channel.go +++ b/config/channel.go @@ -5,12 +5,18 @@ import ( "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" + "strings" ) const ( - ModifyDisChannel = "disabled_channel" ModifyFallbackChannel = "fallback_channel" FallbackChannelSet = "fallback_channel_set" + + ModifyDisChannel = "disabled_channel" + DisChannelAdd = "disabled_channel_add" + DisChannelAddSet = "disabled_channel_add_set" + DisChannelDel = "disabled_channel_del" + DisChannelDelSet = "disabled_channel_del_set" ) func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { @@ -18,7 +24,7 @@ func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionC component.NewChannelSelect(FallbackChannelSet).AddChannelType(discordgo.ChannelTypeGuildText), ))).Send() if err != nil { - logger.Alert("config/channel.go - Sending channel list", err.Error()) + logger.Alert("config/channel.go - Sending channel list for fallback", err.Error()) } } @@ -41,3 +47,78 @@ func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCrea logger.Alert("config/channel.go - Sending channel saved", err.Error()) } } + +func HandleModifyDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + err := resp.SetMessage("Salon de repli...").SetComponents(component.New().Add(component.NewActionRow(). + Add( + component.NewButton(DisChannelAdd, discordgo.PrimaryButton). + SetLabel("Désactiver un salon"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬇️"}), + ). + Add( + component.NewButton(DisChannelDel, discordgo.DangerButton). + SetLabel("Réactiver un salon"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}), + ), + )).Send() + if err != nil { + logger.Alert("config/channel.go - Sending action type", err.Error()) + } +} + +func HandleDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.SetMessage("Salon à désactiver...") + cID := DisChannelAddSet + if data.CustomID == DisChannelDel { + resp.SetMessage("Salon à réactiver...") + cID = DisChannelDelSet + } + err := resp.SetComponents(component.New().Add(component.NewActionRow().Add(component.NewChannelSelect(cID)))).Send() + if err != nil { + logger.Alert("config/channel.go - Sending channel list for disable", err.Error()) + } +} + +func HandleDisChannelAddSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + id := data.Values[0] + if strings.Contains(cfg.DisabledChannels, id) { + err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send() + if err != nil { + logger.Alert("commands/config.go - Channel already disabled", err.Error()) + } + return + } + cfg.DisabledChannels += id + ";" + if err := cfg.Save(); err != nil { + logger.Alert("commands/config.go - Saving config disable add", err.Error()) + if err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send(); err != nil { + logger.Alert("config/channel.go - Sending error while saving config", err.Error()) + } + } + if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil { + logger.Alert("commands/config.go - Modification saved message disable add", err.Error()) + } +} + +func HandleDisChannelDelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + id := data.Values[0] + if !strings.Contains(cfg.DisabledChannels, id) { + err := resp.SetMessage("Le salon n'est pas désactivé").Send() + if err != nil { + logger.Alert("commands/config.go - Channel not disabled", err.Error()) + } + return + } + cfg.DisabledChannels = strings.ReplaceAll(cfg.DisabledChannels, id+";", "") + if err := cfg.Save(); err != nil { + logger.Alert("commands/config.go - Saving config disable del", err.Error()) + if err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send(); err != nil { + logger.Alert("config/channel.go - Sending error while saving config", err.Error()) + } + } + if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil { + logger.Alert("commands/config.go - Modification saved message disable del", err.Error()) + } +} diff --git a/main.go b/main.go index 5efb9b9..505489d 100644 --- a/main.go +++ b/main.go @@ -142,6 +142,11 @@ func main() { // channel related bot.HandleMessageComponent(config.HandleModifyFallbackChannel, config.ModifyFallbackChannel) bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) + bot.HandleMessageComponent(config.HandleModifyDisChannel, config.ModifyDisChannel) + bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelAdd) + bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelDel) + bot.HandleMessageComponent(config.HandleDisChannelAddSet, config.DisChannelAddSet) + bot.HandleMessageComponent(config.HandleDisChannelDelSet, config.DisChannelDelSet) // reduce related bot.HandleMessageComponent(config.HandleModifyPeriodicReduce, config.ModifyTimeReduce) bot.HandleModal(config.HandleTimeReduceSet, config.TimeReduceSet) From 4aa8b9ec67501a4580a402f60c9ec1a35ae2de29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 15:52:50 +0200 Subject: [PATCH 12/21] build(gokord): bump bot version --- main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 505489d..b785259 100644 --- a/main.go +++ b/main.go @@ -22,8 +22,8 @@ var ( updatesData []byte Version = gokord.Version{ Major: 3, - Minor: 1, - Patch: 3, + Minor: 2, + Patch: 0, } stopPeriodicReducer chan<- interface{} From caa3b338a39d8b682d84ea3a3b5e12a04bd82fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 16:06:56 +0200 Subject: [PATCH 13/21] refactor(config): use component to show config --- commands/config.go | 88 ++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/commands/config.go b/commands/config.go index 23a0add..d6cbfc2 100644 --- a/commands/config.go +++ b/commands/config.go @@ -48,56 +48,44 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa } else { defaultChan = fmt.Sprintf("<#%s>", cfg.FallbackChannel) } - err := resp.AddEmbed(&discordgo.MessageEmbed{ - Type: discordgo.EmbedTypeRich, - Title: "Config", - Color: 0x10E6AD, - Fields: []*discordgo.MessageEmbedField{ - { - Name: "Salon par défaut", - Value: defaultChan, - Inline: false, - }, - { - Name: "Rôles liés aux niveaux", - Value: roles, - Inline: false, - }, - { - Name: "Salons désactivés", - Value: chans, - Inline: false, - }, - { - Name: "Jours avant la réduction", - Value: fmt.Sprintf("%d", cfg.DaysXPRemains), - Inline: false, - }, - }, - }).SetComponents(component.New().Add(component.NewActionRow().Add( - component.NewStringSelect(ConfigModify).SetPlaceholder("Modifier..."). - AddOption( - component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). - SetDescription("Gère les rôles liés à l'XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), - ). - AddOption( - component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). - SetDescription("Gère les salons désactivés"). - SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ). - AddOption( - // I don't have a better idea for this... - component.NewSelectOption("Salons de repli", config.ModifyFallbackChannel). - SetDescription("Spécifie le salon de repli"). - SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), - ). - AddOption( - component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). - SetDescription("Gère le temps avant la réduction d'XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), - ), - ))).IsEphemeral().Send() + comp := component.New().Add(component.NewSection(). + Add(component.NewTextDisplay("# Config")). + Add(component.NewTextDisplay("**Salon par défaut**")). + Add(component.NewTextDisplay(defaultChan)), + ).Add(component.NewSeparator()).Add(component.NewSection(). + Add(component.NewTextDisplay("**Rôles liés aux niveaux**")). + Add(component.NewTextDisplay(roles)), + ).Add(component.NewSeparator()).Add(component.NewSection(). + Add(component.NewTextDisplay("**Salons désactivés**")). + Add(component.NewTextDisplay(chans)), + ).Add(component.NewSeparator()).Add(component.NewSection(). + Add(component.NewTextDisplay("**Jours avant la réduction**")). + Add(component.NewTextDisplay(fmt.Sprintf("%d", cfg.DaysXPRemains))), + ).Add(component.NewActionRow().Add(component.NewStringSelect(ConfigModify). + SetPlaceholder("Modifier..."). + AddOption( + component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). + SetDescription("Gère les rôles liés à l'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), + ). + AddOption( + component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). + SetDescription("Gère les salons désactivés"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ). + AddOption( + // I don't have a better idea for this... + component.NewSelectOption("Salons de repli", config.ModifyFallbackChannel). + SetDescription("Spécifie le salon de repli"). + SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), + ). + AddOption( + component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). + SetDescription("Gère le temps avant la réduction d'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), + ), + )) + err := resp.SetComponents(comp).IsEphemeral().Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) } From 7c9d6571fd6179837ca9fb9d30bf2ea82dc81197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 16:14:30 +0200 Subject: [PATCH 14/21] fix(config): not all interaction were ephemeral --- commands/config.go | 4 ++-- config/channel.go | 8 +++++--- config/xp_role.go | 15 +++++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/commands/config.go b/commands/config.go index d6cbfc2..f0c17eb 100644 --- a/commands/config.go +++ b/commands/config.go @@ -75,8 +75,8 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa ). AddOption( // I don't have a better idea for this... - component.NewSelectOption("Salons de repli", config.ModifyFallbackChannel). - SetDescription("Spécifie le salon de repli"). + component.NewSelectOption("Salons par défaut", config.ModifyFallbackChannel). + SetDescription("Spécifie le salon par défaut"). SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), ). AddOption( diff --git a/config/channel.go b/config/channel.go index 7b74169..355b0e1 100644 --- a/config/channel.go +++ b/config/channel.go @@ -20,7 +20,7 @@ const ( ) func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - err := resp.SetMessage("Salon de repli...").SetComponents(component.New().Add(component.NewActionRow().Add( + err := resp.IsEphemeral().SetComponents(component.New().Add(component.NewActionRow().Add( component.NewChannelSelect(FallbackChannelSet).AddChannelType(discordgo.ChannelTypeGuildText), ))).Send() if err != nil { @@ -49,7 +49,7 @@ func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCrea } func HandleModifyDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - err := resp.SetMessage("Salon de repli...").SetComponents(component.New().Add(component.NewActionRow(). + err := resp.IsEphemeral().SetComponents(component.New().Add(component.NewActionRow(). Add( component.NewButton(DisChannelAdd, discordgo.PrimaryButton). SetLabel("Désactiver un salon"). @@ -67,7 +67,7 @@ func HandleModifyDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate } func HandleDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - resp.SetMessage("Salon à désactiver...") + resp.IsEphemeral().SetMessage("Salon à désactiver...") cID := DisChannelAddSet if data.CustomID == DisChannelDel { resp.SetMessage("Salon à réactiver...") @@ -80,6 +80,7 @@ func HandleDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, data } func HandleDisChannelAddSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() cfg := GetGuildConfig(i.GuildID) id := data.Values[0] if strings.Contains(cfg.DisabledChannels, id) { @@ -102,6 +103,7 @@ func HandleDisChannelAddSet(_ *discordgo.Session, i *discordgo.InteractionCreate } func HandleDisChannelDelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() cfg := GetGuildConfig(i.GuildID) id := data.Values[0] if !strings.Contains(cfg.DisabledChannels, id) { diff --git a/config/xp_role.go b/config/xp_role.go index b01da27..27981c0 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -77,6 +77,7 @@ func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, d } func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() cfg := GetGuildConfig(i.GuildID) roleId := data.Values[0] for _, r := range cfg.XpRoles { @@ -102,12 +103,13 @@ func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d "type", "add", ) } - if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { + if err = resp.SetMessage("Rôle ajouté.").Send(); err != nil { logger.Alert("config/xp_role.go - Sending success", err.Error()) } } func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() cfg := GetGuildConfig(i.GuildID) roleId := data.Values[0] _, r := cfg.FindXpRole(roleId) @@ -129,7 +131,7 @@ func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, "type", "edit", ) } - if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil { + if err = resp.SetMessage("Rôle modifié.").Send(); err != nil { logger.Alert("config/xp_role.go - Sending success", err.Error()) } } @@ -145,6 +147,7 @@ func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ dis } func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() cfg := GetGuildConfig(i.GuildID) roleId := data.Values[0] _, r := cfg.FindXpRole(roleId) @@ -165,18 +168,19 @@ func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, d "type", "del", ) } - if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil { + if err = resp.SetMessage("Rôle supprimé.").Send(); err != nil { logger.Alert("config/xp_role.go - Sending success", err.Error()) } } func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) { + resp.IsEphemeral() input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput) k := getKeyConfigRole(i) in, err := strconv.Atoi(input.Value) if err != nil || in < 0 { - if err = resp.IsEphemeral(). + if err = resp. SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif."). Send(); err != nil { logger.Alert("command/config.go - Sending bad number", err.Error()) @@ -196,8 +200,7 @@ func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, dat resp.SetMessage("Rôle à modifier") } - err = resp.IsEphemeral(). - SetMessage("Rôle à supprimer"). + err = resp. SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))). Send() if err != nil { From 6819a19316090d14c7dec48746af07694be0dcf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Wed, 6 Aug 2025 16:42:36 +0200 Subject: [PATCH 15/21] build(gokord): use latest snapshot --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 854bc8a..76e2ee0 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d + github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688 github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index 3a682b4..cdae0a5 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f h1:OSTlmWDVRGw3 github.com/anhgelus/gokord v0.11.1-0.20250806004311-9988b375047f/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d h1:cbhaSdjjipiF5yFijgewtkjE0HyHZ6tJR7zHBpCkkBI= github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688 h1:0ngeLQxHr80Xup9UnPSjpdRH3ZpIH1mpf0ig3sEFVJk= +github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= From bda9a5fa8f4af9218bd59364ad6dda2ca26ffc58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Thu, 7 Aug 2025 12:52:31 +0200 Subject: [PATCH 16/21] feat(command): remove section in /config --- commands/config.go | 68 ++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/commands/config.go b/commands/config.go index f0c17eb..b6e6854 100644 --- a/commands/config.go +++ b/commands/config.go @@ -48,43 +48,39 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa } else { defaultChan = fmt.Sprintf("<#%s>", cfg.FallbackChannel) } - comp := component.New().Add(component.NewSection(). + comp := component.New(). Add(component.NewTextDisplay("# Config")). - Add(component.NewTextDisplay("**Salon par défaut**")). - Add(component.NewTextDisplay(defaultChan)), - ).Add(component.NewSeparator()).Add(component.NewSection(). - Add(component.NewTextDisplay("**Rôles liés aux niveaux**")). - Add(component.NewTextDisplay(roles)), - ).Add(component.NewSeparator()).Add(component.NewSection(). - Add(component.NewTextDisplay("**Salons désactivés**")). - Add(component.NewTextDisplay(chans)), - ).Add(component.NewSeparator()).Add(component.NewSection(). - Add(component.NewTextDisplay("**Jours avant la réduction**")). - Add(component.NewTextDisplay(fmt.Sprintf("%d", cfg.DaysXPRemains))), - ).Add(component.NewActionRow().Add(component.NewStringSelect(ConfigModify). - SetPlaceholder("Modifier..."). - AddOption( - component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). - SetDescription("Gère les rôles liés à l'XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), - ). - AddOption( - component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). - SetDescription("Gère les salons désactivés"). - SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), - ). - AddOption( - // I don't have a better idea for this... - component.NewSelectOption("Salons par défaut", config.ModifyFallbackChannel). - SetDescription("Spécifie le salon par défaut"). - SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), - ). - AddOption( - component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). - SetDescription("Gère le temps avant la réduction d'XP"). - SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), - ), - )) + Add(component.NewTextDisplay("**Salon par défaut**\n" + defaultChan)). + Add(component.NewSeparator()). + Add(component.NewTextDisplay("**Rôles liés aux niveaux**\n" + roles)). + Add(component.NewSeparator()). + Add(component.NewTextDisplay("**Salons désactivés**\n" + chans)). + Add(component.NewSeparator()). + Add(component.NewTextDisplay(fmt.Sprintf("**%s**\n%d", "Jours avant la réduction", cfg.DaysXPRemains))). + Add(component.NewActionRow().Add(component.NewStringSelect(ConfigModify). + SetPlaceholder("Modifier..."). + AddOption( + component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). + SetDescription("Gère les rôles liés à l'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), + ). + AddOption( + component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). + SetDescription("Gère les salons désactivés"). + SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + ). + AddOption( + // I don't have a better idea for this... + component.NewSelectOption("Salons par défaut", config.ModifyFallbackChannel). + SetDescription("Spécifie le salon par défaut"). + SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), + ). + AddOption( + component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). + SetDescription("Gère le temps avant la réduction d'XP"). + SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), + ), + )) err := resp.SetComponents(comp).IsEphemeral().Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) From ebab5cd09f73cd68089f59a68431bbc283fba30b Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 13:33:17 +0200 Subject: [PATCH 17/21] feat(command): do not use new components --- commands/config.go | 53 +++++++++++++++++++++++++++++++++++++--------- config/guild.go | 7 +++--- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/commands/config.go b/commands/config.go index b6e6854..b62d413 100644 --- a/commands/config.go +++ b/commands/config.go @@ -2,13 +2,14 @@ package commands import ( "fmt" + "strings" + "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/anhgelus/les-copaings-bot/config" "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" - "strings" ) const ( @@ -48,15 +49,40 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa } else { defaultChan = fmt.Sprintf("<#%s>", cfg.FallbackChannel) } + //comp := component.New(). + // Add(component.NewTextDisplay("# Config")). + // Add(component.NewTextDisplay("**Salon par défaut**\n" + defaultChan)). + // Add(component.NewSeparator()). + // Add(component.NewTextDisplay("**Rôles liés aux niveaux**\n" + roles)). + // Add(component.NewSeparator()). + // Add(component.NewTextDisplay("**Salons désactivés**\n" + chans)). + // Add(component.NewSeparator()). + // Add(component.NewTextDisplay(fmt.Sprintf("**%s**\n%d", "Jours avant la réduction", cfg.DaysXPRemains))). + // Add(component.NewActionRow().Add(component.NewStringSelect(ConfigModify). + // SetPlaceholder("Modifier..."). + // AddOption( + // component.NewSelectOption("Rôles liés à l'XP", config.ModifyXpRole). + // SetDescription("Gère les rôles liés à l'XP"). + // SetEmoji(&discordgo.ComponentEmoji{Name: "🏅"}), + // ). + // AddOption( + // component.NewSelectOption("Salons désactivés", config.ModifyDisChannel). + // SetDescription("Gère les salons désactivés"). + // SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}), + // ). + // AddOption( + // // I don't have a better idea for this... + // component.NewSelectOption("Salons par défaut", config.ModifyFallbackChannel). + // SetDescription("Spécifie le salon par défaut"). + // SetEmoji(&discordgo.ComponentEmoji{Name: "💾"}), + // ). + // AddOption( + // component.NewSelectOption("Temps avec la réduction", config.ModifyTimeReduce). + // SetDescription("Gère le temps avant la réduction d'XP"). + // SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), + // ), + // )) comp := component.New(). - Add(component.NewTextDisplay("# Config")). - Add(component.NewTextDisplay("**Salon par défaut**\n" + defaultChan)). - Add(component.NewSeparator()). - Add(component.NewTextDisplay("**Rôles liés aux niveaux**\n" + roles)). - Add(component.NewSeparator()). - Add(component.NewTextDisplay("**Salons désactivés**\n" + chans)). - Add(component.NewSeparator()). - Add(component.NewTextDisplay(fmt.Sprintf("**%s**\n%d", "Jours avant la réduction", cfg.DaysXPRemains))). Add(component.NewActionRow().Add(component.NewStringSelect(ConfigModify). SetPlaceholder("Modifier..."). AddOption( @@ -81,7 +107,14 @@ func Config(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMa SetEmoji(&discordgo.ComponentEmoji{Name: "⌛"}), ), )) - err := resp.SetComponents(comp).IsEphemeral().Send() + msg := fmt.Sprintf( + "# Config\n**Salon par défaut**\n%s\n\n**Rôles liés aux niveaux**\n%s\n\n**Salons désactivés**\n%s\n\n**Jours avant la réduction**\n%d", + defaultChan, + roles, + chans, + cfg.DaysXPRemains, + ) + err := resp.SetComponents(comp).SetMessage(msg).IsEphemeral().Send() if err != nil { logger.Alert("config/guild.go - Sending config", err.Error()) } diff --git a/config/guild.go b/config/guild.go index 3071d95..8384d5b 100644 --- a/config/guild.go +++ b/config/guild.go @@ -1,9 +1,9 @@ package config import ( - "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/logger" "strings" + + "github.com/anhgelus/gokord" ) type GuildConfig struct { @@ -18,8 +18,7 @@ type GuildConfig struct { func GetGuildConfig(guildID string) *GuildConfig { cfg := GuildConfig{GuildID: guildID} if err := cfg.Load(); err != nil { - logger.Alert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID) - return nil + panic(err) } return &cfg } From 1975321016e56a3cdf5b3ce27602501d922c3b73 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 13:47:30 +0200 Subject: [PATCH 18/21] build(dev): run db in podman --- create_db.sh | 5 +++++ go.mod | 12 ++++++------ go.sum | 12 ++++++++++++ restart.sh | 3 --- 4 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 create_db.sh delete mode 100644 restart.sh diff --git a/create_db.sh b/create_db.sh new file mode 100644 index 0000000..b098405 --- /dev/null +++ b/create_db.sh @@ -0,0 +1,5 @@ +#!/usr/bin/bash + +podman network create db +podman run -p 5432:5432 --rm --network db --name postgres --env-file .env -v ./data:/var/lib/postgres/data -d postgres:alpine +podman run -p 8080:8080 --rm --network db --name adminer -d adminer \ No newline at end of file diff --git a/go.mod b/go.mod index 76e2ee0..2a9e497 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,11 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688 + github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524 github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 - gorm.io/driver/postgres v1.5.11 + gorm.io/driver/postgres v1.6.0 gorm.io/gorm v1.30.1 ) @@ -21,9 +21,9 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/redis/go-redis/v9 v9.12.0 // indirect - golang.org/x/crypto v0.40.0 // indirect + github.com/redis/go-redis/v9 v9.12.1 // indirect + golang.org/x/crypto v0.41.0 // indirect golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.34.0 // indirect - golang.org/x/text v0.27.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.28.0 // indirect ) diff --git a/go.sum b/go.sum index cdae0a5..df19706 100644 --- a/go.sum +++ b/go.sum @@ -10,6 +10,8 @@ github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d h1:cbhaSdjjipiF github.com/anhgelus/gokord v0.11.1-0.20250806122118-84c56722e29d/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688 h1:0ngeLQxHr80Xup9UnPSjpdRH3ZpIH1mpf0ig3sEFVJk= github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524 h1:mK7UtqJPNYhStRVeZ2N4c89tjlhlRZX0LcLs7TAB34I= +github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= @@ -46,6 +48,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.12.0 h1:XlVPGlflh4nxfhsNXPA8Qp6EmEfTo0rp8oaBzPipXnU= github.com/redis/go-redis/v9 v9.12.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/redis/go-redis/v9 v9.12.1 h1:k5iquqv27aBtnTm2tIkROUDp8JBXhXZIVu1InSgvovg= +github.com/redis/go-redis/v9 v9.12.1/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -54,16 +58,22 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -71,5 +81,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/postgres v1.6.0 h1:2dxzU8xJ+ivvqTRph34QX+WrRaJlmfyPqXmoGVjMBa4= +gorm.io/driver/postgres v1.6.0/go.mod h1:vUw0mrGgrTK+uPHEhAdV4sfFELrByKVGnaVRkXDhtWo= gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= diff --git a/restart.sh b/restart.sh deleted file mode 100644 index ddb9128..0000000 --- a/restart.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/bash - -podman compose down && podman compose build && podman compose up -d \ No newline at end of file From 9a58e3db845de57ea5c102e59eeb4bb4cc2dc3cd Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 14:12:07 +0200 Subject: [PATCH 19/21] fix(command): not handling config interaction --- go.mod | 2 +- go.sum | 2 ++ main.go | 23 +++++++++++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 2a9e497..abd4668 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524 + github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717 github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index df19706..288f1ba 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688 h1:0ngeLQxHr80X github.com/anhgelus/gokord v0.11.1-0.20250806143823-567c33f63688/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524 h1:mK7UtqJPNYhStRVeZ2N4c89tjlhlRZX0LcLs7TAB34I= github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717 h1:KfcBHUpwbffRO6aIITq7iN7cP7KcKmUnIE+eWiwsYYw= +github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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 0c45e6a..684ff6e 100644 --- a/main.go +++ b/main.go @@ -138,8 +138,26 @@ func main() { } // interaction: /config + bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { + if len(data.Values) != 1 { + logger.Alert("main.go - Handle config modify", "invalid data values", "values", data.Values) + return + } + switch data.Values[0] { + case config.ModifyXpRole: + config.HandleModifyXpRole(s, i, data, resp) + case config.ModifyFallbackChannel: + config.HandleModifyFallbackChannel(s, i, data, resp) + case config.ModifyDisChannel: + config.HandleModifyDisChannel(s, i, data, resp) + case config.ModifyTimeReduce: + config.HandleModifyPeriodicReduce(s, i, data, resp) + default: + logger.Alert("main.go - Detecting value", "unkown value", "value", data.Values[0]) + return + } + }, commands.ConfigModify) // xp role related - bot.HandleMessageComponent(config.HandleModifyXpRole, config.ModifyXpRole) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleAdd) bot.HandleMessageComponent(config.HandleXpRoleAddEdit, config.XpRoleEdit) bot.HandleMessageComponent(config.HandleXpRoleAddRole, config.XpRoleAddRole) @@ -149,15 +167,12 @@ func main() { bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleAddLevel) bot.HandleModal(config.HandleXpRoleLevel, config.XpRoleEditLevel) // channel related - bot.HandleMessageComponent(config.HandleModifyFallbackChannel, config.ModifyFallbackChannel) bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) - bot.HandleMessageComponent(config.HandleModifyDisChannel, config.ModifyDisChannel) bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelAdd) bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelDel) bot.HandleMessageComponent(config.HandleDisChannelAddSet, config.DisChannelAddSet) bot.HandleMessageComponent(config.HandleDisChannelDelSet, config.DisChannelDelSet) // reduce related - bot.HandleMessageComponent(config.HandleModifyPeriodicReduce, config.ModifyTimeReduce) bot.HandleModal(config.HandleTimeReduceSet, config.TimeReduceSet) // xp handlers From ecf41adc3c2b8746867a16c8d3c5a09ca89bc534 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 14:38:59 +0200 Subject: [PATCH 20/21] fix(command): missing custom id for modal --- config/xp_reduce.go | 23 +++++++++++++---------- config/xp_role.go | 18 ++++++++++-------- exp/functions.go | 2 +- go.mod | 2 +- go.sum | 2 ++ 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/config/xp_reduce.go b/config/xp_reduce.go index 8e97c26..ce5f23c 100644 --- a/config/xp_reduce.go +++ b/config/xp_reduce.go @@ -1,11 +1,12 @@ package config import ( + "strconv" + "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" - "strconv" ) const ( @@ -14,11 +15,13 @@ const ( ) func HandleModifyPeriodicReduce(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) { - err := resp.IsModal().SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( - component.NewTextInput(TimeReduceSet, "Jours avant la réduction", discordgo.TextInputShort). - SetMinLength(1). - SetMaxLength(3), - ))).Send() + err := resp.IsModal(). + SetCustomID(TimeReduceSet). + SetComponents(component.New().ForModal().Add(component.NewActionRow().ForModal().Add( + component.NewTextInput(TimeReduceSet, "Jours avant la réduction", discordgo.TextInputShort). + SetMinLength(1). + SetMaxLength(3), + ))).Send() if err != nil { logger.Alert("config/xp_reduce.go - Sending modal for periodic reduce", err.Error()) } @@ -31,14 +34,14 @@ func HandleTimeReduceSet(_ *discordgo.Session, i *discordgo.InteractionCreate, d if err != nil { logger.Debug(err.Error()) if err = resp.SetMessage("Nombres de jours invalides. Merci de mettre un entier.").Send(); err != nil { - logger.Alert("config/channel.go - Sending bad input", err.Error()) + logger.Alert("config/xp_reduce.go - Sending bad input", err.Error()) } return } if days < 30 { err = resp.SetMessage("Le nombre de jours est inférieur à 30.").Send() if err != nil { - logger.Alert("commands/config.go - Days < 30 (fallback)", err.Error()) + logger.Alert("config/xp_reduce.go - Days < 30 (fallback)", err.Error()) } return } @@ -47,11 +50,11 @@ func HandleTimeReduceSet(_ *discordgo.Session, i *discordgo.InteractionCreate, d if err = cfg.Save(); err != nil { logger.Alert("config/channel.go - Saving days xp remains", err.Error()) if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil { - logger.Alert("config/channel.go - Sending error while saving days xp remains", err.Error()) + logger.Alert("config/xp_reduce.go - Sending error while saving days xp remains", err.Error()) } return } if err = resp.SetMessage("Modification sauvegardée.").Send(); err != nil { - logger.Alert("config/channel.go - Sending days saved", err.Error()) + logger.Alert("config/xp_reduce.go - Sending days saved", err.Error()) } } diff --git a/config/xp_role.go b/config/xp_role.go index 27981c0..dac980c 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -2,13 +2,14 @@ package config import ( "fmt" + "strconv" + "time" + "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" - "strconv" - "time" ) type XpRole struct { @@ -52,7 +53,7 @@ func HandleModifyXpRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ ), )).Send() if err != nil { - logger.Alert("config/guild.go - Sending config", err.Error()) + logger.Alert("config/xp_reduce.go - Sending config", err.Error()) } } @@ -63,7 +64,8 @@ func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, d } err := resp.IsModal(). SetTitle("Role"). - SetComponents(component.New().ForModal().Add(component.NewActionRow().Add( + SetCustomID(cID). + SetComponents(component.New().ForModal().Add(component.NewActionRow().ForModal().Add( component.NewTextInput(cID, "Niveau", discordgo.TextInputShort). SetPlaceholder("5"). IsRequired(). @@ -72,7 +74,7 @@ func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, d ))). Send() if err != nil { - logger.Alert("config/guild.go - Sending modal to add/edit", err.Error()) + logger.Alert("config/xp_reduce.go - Sending modal to add/edit", err.Error()) } } @@ -142,7 +144,7 @@ func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ dis SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))). Send() if err != nil { - logger.Alert("config/guild.go - Sending response to del", err.Error()) + logger.Alert("config/xp_reduce.go - Sending response to del", err.Error()) } } @@ -204,10 +206,10 @@ func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, dat SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))). Send() if err != nil { - logger.Alert("config/guild.go - Sending response to add/edit", err.Error()) + logger.Alert("config/xp_reduce.go - Sending response to add/edit", err.Error()) } } func getKeyConfigRole(i *discordgo.InteractionCreate) string { - return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID) + return fmt.Sprintf("r:%s:%s", i.GuildID, i.Member.User.ID) } diff --git a/exp/functions.go b/exp/functions.go index 2608094..a8b0350 100644 --- a/exp/functions.go +++ b/exp/functions.go @@ -53,7 +53,7 @@ func LevelXP(level uint) uint { func TimeStampNDaysBefore(n uint) string { var unix time.Time if gokord.Debug { - unix = time.Unix(time.Now().Unix()-int64(n), 0) // reduce time for debug + unix = time.Unix(time.Now().Unix()-int64(n)*6, 0) // reduce time for debug } else { unix = time.Unix(time.Now().Unix()-int64(n*24*60*60), 0) } diff --git a/go.mod b/go.mod index abd4668..df8f3bb 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/anhgelus/les-copaings-bot go 1.24 require ( - github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717 + github.com/anhgelus/gokord v0.11.1-0.20250821122244-0aee6c37eef6 github.com/bwmarrin/discordgo v0.29.0 github.com/joho/godotenv v1.5.1 github.com/pelletier/go-toml/v2 v2.2.4 diff --git a/go.sum b/go.sum index 288f1ba..c011b86 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524 h1:mK7UtqJPNYhS github.com/anhgelus/gokord v0.11.1-0.20250807111049-5de23912c524/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717 h1:KfcBHUpwbffRO6aIITq7iN7cP7KcKmUnIE+eWiwsYYw= github.com/anhgelus/gokord v0.11.1-0.20250821115246-50e5f7d17717/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= +github.com/anhgelus/gokord v0.11.1-0.20250821122244-0aee6c37eef6 h1:4eO/9UqTPfrKyss2CeLafeKeR06bgoFihudKOdLpWpI= +github.com/anhgelus/gokord v0.11.1-0.20250821122244-0aee6c37eef6/go.mod h1:4xpwLzIG34/XG9QZiPsnYScQhckiCpQMAI0CjP0Nc2k= 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= From 15448aa0014e1473582227e2ea301df7ccfb9560 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 14:53:18 +0200 Subject: [PATCH 21/21] fix(config): saving level and not xp for role --- config/xp_role.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/xp_role.go b/config/xp_role.go index dac980c..f815cc2 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -9,6 +9,7 @@ import ( "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" + "github.com/anhgelus/les-copaings-bot/exp" "github.com/bwmarrin/discordgo" ) @@ -189,7 +190,7 @@ func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, dat } return } - configModifyMap[k] = uint(in) + configModifyMap[k] = exp.LevelXP(uint(in)) go func(i *discordgo.InteractionCreate, k string) { time.Sleep(5 * time.Minute) delete(configModifyMap, k)