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: refactor(command): use message component to edit config --- commands/config.go | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) (limited to 'commands') 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"] -- cgit v1.2.3 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: refactor(command): modify xp role with message component --- commands/config.go | 273 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 185 insertions(+), 88 deletions(-) (limited to 'commands') 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() + + cfg := config.GetGuildConfig(i.GuildID) + + 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("commands/config.go - Level not set", err.Error()) + utils.SendAlert("config/guild.go - Sending config", 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()) + case XpRoleAdd, XpRoleEdit: + cID := XpRoleAddLevel + if msgData.CustomID == XpRoleEdit { + cID = XpRoleEditLevel } - return - } - xp := exp.LevelXP(uint(level)) - r, ok := optMap["role"] - if !ok { - err := resp.SetMessage("Le rôle n'a pas été renseigné.").Send() + 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("commands/config.go - Role not set", err.Error()) + utils.SendAlert("config/guild.go - Sending modal to add", 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": + 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,84 +209,142 @@ 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 err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil { + utils.SendAlert("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() + 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()) + utils.SendAlert("commands/config.go - Role not found (edit)", err.Error()) } return } - err = gokord.DB.Delete(r).Error + r.XP = configModifyMap[getKeyConfigRole(i)] + err := gokord.DB.Save(r).Error if err != nil { utils.SendAlert( - "commands/config.go - Deleting entry", + "commands/config.go - Saving config", err.Error(), - "guild_id", - i.GuildID, - "role_id", - role.ID, - "type", - "del", + "guild_id", i.GuildID, + "role_id", roleId, + "type", "edit", ) } - case "edit": - _, r := cfg.FindXpRole(role.ID) + 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() + 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()) + utils.SendAlert("commands/config.go - Role not found (del)", err.Error()) } return } - r.XP = xp - err = gokord.DB.Save(r).Error + err := gokord.DB.Delete(r).Error if err != nil { utils.SendAlert( - "commands/config.go - Saving config", + "commands/config.go - Deleting entry", err.Error(), - "guild_id", - i.GuildID, - "role_id", - role.ID, - "type", - "edit", + "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 + } + 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("commands/config.go - Config updated message", err.Error()) + 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) { resp.IsEphemeral() // verify every args -- cgit v1.2.3 From 5a8da1eaeb9434a18e553a5c50490d06b54a6a1d Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 6 Aug 2025 02:22:06 +0200 Subject: 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 +++++----- 5 files changed, 72 insertions(+), 67 deletions(-) (limited to 'commands') 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()) } }() } -- cgit v1.2.3 From 0cd725108c998aedcf647ce39cd80a325b33cfa0 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Wed, 6 Aug 2025 02:47:41 +0200 Subject: feat(gokord): use new component lib --- commands/config.go | 148 ++++++++++++++++++++++++----------------------------- 1 file changed, 67 insertions(+), 81 deletions(-) (limited to 'commands') 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()) -- cgit v1.2.3 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: feat(command): use gokord function to create components --- commands/config.go | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) (limited to 'commands') 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()) -- cgit v1.2.3 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: feat(command): use gokord new handle for config --- commands/config.go | 266 +++++++++++++++++++++++++---------------------------- 1 file changed, 125 insertions(+), 141 deletions(-) (limited to 'commands') 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 +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()) } +} - cfg := config.GetGuildConfig(i.GuildID) - - resp := cmd.NewResponseBuilder(s, i) +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()) + } +} - 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() +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 not found (del)", err.Error()) + logger.Alert("commands/config.go - Role already in config", 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() + } + 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 - Invalid action type", 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 { + 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 ConfigXPModal(s *discordgo.Session, i *discordgo.InteractionCreate) { - if i.Type != discordgo.InteractionModalSubmit { - return +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()) } - resp := cmd.NewResponseBuilder(s, i) - - modalData := i.ModalSubmitData() +} - 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") } -- cgit v1.2.3 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: style(config): move everything related to modify xp role in package config --- commands/config.go | 198 +---------------------------------------------------- 1 file changed, 1 insertion(+), 197 deletions(-) (limited to 'commands') 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 -- cgit v1.2.3 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: refactor(config): handle fallback channel --- commands/config.go | 51 ++++----------------------------------------------- 1 file changed, 4 insertions(+), 47 deletions(-) (limited to 'commands') 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 -- cgit v1.2.3 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: refactor(config): handle xp reduce --- commands/config.go | 46 ++-------------------------------------------- 1 file changed, 2 insertions(+), 44 deletions(-) (limited to 'commands') 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()) - } -} -- cgit v1.2.3 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: refactor(config): handle disabled channels --- commands/config.go | 70 ------------------------------------------------------ 1 file changed, 70 deletions(-) (limited to 'commands') 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()) - } -} -- cgit v1.2.3 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: refactor(config): use component to show config --- commands/config.go | 88 +++++++++++++++++++++++------------------------------- 1 file changed, 38 insertions(+), 50 deletions(-) (limited to 'commands') 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()) } -- cgit v1.2.3 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: fix(config): not all interaction were ephemeral --- commands/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'commands') 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( -- cgit v1.2.3 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: feat(command): remove section in /config --- commands/config.go | 68 +++++++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) (limited to 'commands') 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()) -- cgit v1.2.3 From ebab5cd09f73cd68089f59a68431bbc283fba30b Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 13:33:17 +0200 Subject: feat(command): do not use new components --- commands/config.go | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) (limited to 'commands') 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()) } -- cgit v1.2.3 From c04f4d9fff2e753f0477a07a9f8f43fbcba8969e Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 14:59:23 +0200 Subject: build(go): rename module to use git.anhgelus.world instead of github --- commands/config.go | 4 ++-- commands/rank.go | 5 +++-- commands/reset.go | 2 +- commands/top.go | 9 +++++---- 4 files changed, 11 insertions(+), 9 deletions(-) (limited to 'commands') diff --git a/commands/config.go b/commands/config.go index b62d413..41fb60e 100644 --- a/commands/config.go +++ b/commands/config.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" + "git.anhgelus.world/anhgelus/les-copaings-bot/config" + "git.anhgelus.world/anhgelus/les-copaings-bot/exp" "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" ) diff --git a/commands/rank.go b/commands/rank.go index 9673089..48a893f 100644 --- a/commands/rank.go +++ b/commands/rank.go @@ -2,10 +2,11 @@ package commands import ( "fmt" + + "git.anhgelus.world/anhgelus/les-copaings-bot/exp" + "git.anhgelus.world/anhgelus/les-copaings-bot/user" "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" ) diff --git a/commands/reset.go b/commands/reset.go index 653a1d9..128354f 100644 --- a/commands/reset.go +++ b/commands/reset.go @@ -1,10 +1,10 @@ package commands import ( + "git.anhgelus.world/anhgelus/les-copaings-bot/user" "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/anhgelus/les-copaings-bot/user" "github.com/bwmarrin/discordgo" ) diff --git a/commands/top.go b/commands/top.go index 09fa91f..fedea45 100644 --- a/commands/top.go +++ b/commands/top.go @@ -2,13 +2,14 @@ package commands import ( "fmt" + "sync" + + "git.anhgelus.world/anhgelus/les-copaings-bot/config" + "git.anhgelus.world/anhgelus/les-copaings-bot/exp" + "git.anhgelus.world/anhgelus/les-copaings-bot/user" "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" "github.com/bwmarrin/discordgo" - "sync" ) func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { -- cgit v1.2.3 From d98e5704f9a3d4fd98800bbc4bd48e1b0a442d3f Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 15:07:18 +0200 Subject: feat(credits): better message --- commands/credits.go | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) (limited to 'commands') diff --git a/commands/credits.go b/commands/credits.go index cdcfe6e..9682d0e 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -1,36 +1,18 @@ package commands import ( + "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" ) 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: 0x10E6AD, - Fields: []*discordgo.MessageEmbedField{ - { - Name: "anhgelus/gokord", - Value: "v0.10.0 - MPL 2.0", - Inline: true, - }, - { - Name: "bwmarrin/discordgo", - Value: "v0.29.0 - BSD-3-Clause", - Inline: true, - }, - { - Name: "gorm", - Value: "v1.30.0 - MIT", - Inline: true, - }, - }, - }).Send() + msg := "**Les Copaings**, le bot gérant les serveurs privés de [anhgelus]().\n" + msg += "Code source : \n\n" + msg += "Host du bot : " + gokord.BaseCfg.GetAuthor() + "\n\n" + msg += "Utilise :\n- [anhgelus/gokord]()" + err := resp.SetMessage(msg).Send() if err != nil { logger.Alert("commands/credits.go - Sending credits", err.Error(), "guild_id", i.GuildID) } -- cgit v1.2.3 From e00f05d7c636f9a1b7a10930402cfeb9331f6631 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 15:41:40 +0200 Subject: feat(command): fetch stats --- commands/credits.go | 2 +- commands/stats.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 commands/stats.go (limited to 'commands') diff --git a/commands/credits.go b/commands/credits.go index 9682d0e..5c3c4bd 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -10,7 +10,7 @@ import ( func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { msg := "**Les Copaings**, le bot gérant les serveurs privés de [anhgelus]().\n" msg += "Code source : \n\n" - msg += "Host du bot : " + gokord.BaseCfg.GetAuthor() + "\n\n" + msg += "Host du bot : " + gokord.BaseCfg.GetAuthor() + ".\n\n" msg += "Utilise :\n- [anhgelus/gokord]()" err := resp.SetMessage(msg).Send() if err != nil { diff --git a/commands/stats.go b/commands/stats.go new file mode 100644 index 0000000..80a9b1b --- /dev/null +++ b/commands/stats.go @@ -0,0 +1,62 @@ +package commands + +import ( + "time" + + "git.anhgelus.world/anhgelus/les-copaings-bot/config" + "git.anhgelus.world/anhgelus/les-copaings-bot/exp" + "git.anhgelus.world/anhgelus/les-copaings-bot/user" + "github.com/anhgelus/gokord" + "github.com/anhgelus/gokord/cmd" + "github.com/anhgelus/gokord/logger" + "github.com/bwmarrin/discordgo" +) + +type data struct { + CreatedAt time.Time + XP int + CopaingID int + copaing *user.Copaing +} + +func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { + cfg := config.GetGuildConfig(i.GuildID) + days := cfg.DaysXPRemains + if v, ok := opt["days"]; ok { + in := v.IntValue() + if in < 0 || uint(in) > days { + if err := resp.SetMessage("Nombre de jours invalide").IsEphemeral().Send(); err != nil { + logger.Alert("commands/stats.go - Sending invalid days", err.Error()) + } + return + } + days = uint(in) + } + var stats []*data + res := gokord.DB.Raw( + `SELECT "created_at"::date::text, sum(xp) as xp, copaing_id FROM copaing_xps GROUP BY "created_at"::date `+ + ` WHERE guild_id = ? and created_at < ?`, + i.GuildID, exp.TimeStampNDaysBefore(days), + ) + if res.Error != nil { + logger.Alert("commands/stats.go - Fetching XP data", res.Error.Error(), "guild_id", i.GuildID) + return + } + if err := res.Scan(&stats).Error; err != nil { + logger.Alert("commands/stats.go - Scanning result", err.Error(), "res") + return + } + copaings := map[int]*user.Copaing{} + for _, s := range stats { + c, ok := copaings[s.CopaingID] + if ok { + s.copaing = c + } else { + if err := gokord.DB.First(s.copaing, s.CopaingID).Error; err != nil { + logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", s.CopaingID) + return + } + copaings[s.CopaingID] = s.copaing + } + } +} -- cgit v1.2.3 From a795e62723a2eb04dab421f171881597be139374 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 16:50:04 +0200 Subject: feat(command): generate plot and send --- commands/stats.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 4 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 80a9b1b..6900051 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -1,6 +1,7 @@ package commands import ( + "bytes" "time" "git.anhgelus.world/anhgelus/les-copaings-bot/config" @@ -10,6 +11,10 @@ import ( "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" + "gonum.org/v1/plot" + "gonum.org/v1/plot/plotter" + "gonum.org/v1/plot/plotutil" + "gonum.org/v1/plot/vg" ) type data struct { @@ -19,7 +24,7 @@ type data struct { copaing *user.Copaing } -func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { +func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { cfg := config.GetGuildConfig(i.GuildID) days := cfg.DaysXPRemains if v, ok := opt["days"]; ok { @@ -32,7 +37,7 @@ func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } days = uint(in) } - var stats []*data + var rawData []*data res := gokord.DB.Raw( `SELECT "created_at"::date::text, sum(xp) as xp, copaing_id FROM copaing_xps GROUP BY "created_at"::date `+ ` WHERE guild_id = ? and created_at < ?`, @@ -42,12 +47,15 @@ func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM logger.Alert("commands/stats.go - Fetching XP data", res.Error.Error(), "guild_id", i.GuildID) return } - if err := res.Scan(&stats).Error; err != nil { + if err := res.Scan(&rawData).Error; err != nil { logger.Alert("commands/stats.go - Scanning result", err.Error(), "res") return } + copaings := map[int]*user.Copaing{} - for _, s := range stats { + stats := map[int]*[]*plotter.XY{} + + for _, s := range rawData { c, ok := copaings[s.CopaingID] if ok { s.copaing = c @@ -58,5 +66,51 @@ func Stats(_ *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } copaings[s.CopaingID] = s.copaing } + pts, ok := stats[s.CopaingID] + if !ok { + pts = &[]*plotter.XY{} + stats[s.CopaingID] = pts + } + t := float64(s.CreatedAt.Unix()-time.Now().Unix()) / (24 * 60 * 60) + *pts = append(*pts, &plotter.XY{ + X: t, + Y: float64(s.XP), + }) + } + + p := plot.New() + p.Title.Text = "XP" + p.X.Label.Text = "Jours" + p.Y.Label.Text = "XP" + + for in, c := range copaings { + m, err := s.GuildMember(i.GuildID, c.DiscordID) + if err != nil { + logger.Alert("commands/stats.go - Fetching guild member", err.Error()) + return + } + err = plotutil.AddLinePoints(p, m.DisplayName(), stats[in]) + if err != nil { + logger.Alert("commands/stats.go - Adding line points", err.Error()) + return + } + } + w, err := p.WriterTo(4*vg.Inch, 4*vg.Inch, "png") + if err != nil { + logger.Alert("commands/stats.go - Generating png", err.Error()) + return + } + b := new(bytes.Buffer) + _, err = w.WriteTo(b) + if err != nil { + logger.Alert("commands/stats.go - Writing png", err.Error()) + } + err = resp.AddFile(&discordgo.File{ + Name: "plot.png", + ContentType: "image/png", + Reader: b, + }).Send() + if err != nil { + logger.Alert("commands/stats.go - Sending response", err.Error()) } } -- cgit v1.2.3 From cf4e7a6efd08e50885cf85d3e198e8ca59105589 Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 17:35:26 +0200 Subject: fix(command): wrong sql and weird gorm behaviors --- commands/stats.go | 46 ++++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 6900051..116e89f 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -11,6 +11,7 @@ import ( "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" "github.com/bwmarrin/discordgo" + "github.com/jackc/pgx/v5/pgtype" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/plotutil" @@ -18,10 +19,9 @@ import ( ) type data struct { - CreatedAt time.Time + CreatedAt *pgtype.Date XP int CopaingID int - copaing *user.Copaing } func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionMap, resp *cmd.ResponseBuilder) { @@ -39,47 +39,41 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } var rawData []*data res := gokord.DB.Raw( - `SELECT "created_at"::date::text, sum(xp) as xp, copaing_id FROM copaing_xps GROUP BY "created_at"::date `+ - ` WHERE guild_id = ? and created_at < ?`, + `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? GROUP BY "created_at"::date, "copaing_id"`, i.GuildID, exp.TimeStampNDaysBefore(days), ) - if res.Error != nil { - logger.Alert("commands/stats.go - Fetching XP data", res.Error.Error(), "guild_id", i.GuildID) - return - } if err := res.Scan(&rawData).Error; err != nil { - logger.Alert("commands/stats.go - Scanning result", err.Error(), "res") + logger.Alert("commands/stats.go - Fetching result", err.Error()) return } copaings := map[int]*user.Copaing{} - stats := map[int]*[]*plotter.XY{} + stats := map[int]*[]plotter.XY{} - for _, s := range rawData { - c, ok := copaings[s.CopaingID] - if ok { - s.copaing = c - } else { - if err := gokord.DB.First(s.copaing, s.CopaingID).Error; err != nil { - logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", s.CopaingID) + for _, raw := range rawData { + _, ok := copaings[raw.CopaingID] + if !ok { + var cp user.Copaing + if err := gokord.DB.First(&cp, raw.CopaingID).Error; err != nil { + logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", raw.CopaingID) return } - copaings[s.CopaingID] = s.copaing + copaings[raw.CopaingID] = &cp } - pts, ok := stats[s.CopaingID] + pts, ok := stats[raw.CopaingID] if !ok { - pts = &[]*plotter.XY{} - stats[s.CopaingID] = pts + pts = &[]plotter.XY{} + stats[raw.CopaingID] = pts } - t := float64(s.CreatedAt.Unix()-time.Now().Unix()) / (24 * 60 * 60) - *pts = append(*pts, &plotter.XY{ + t := float64(raw.CreatedAt.Time.Unix()-time.Now().Unix()) / (24 * 60 * 60) + *pts = append(*pts, plotter.XY{ X: t, - Y: float64(s.XP), + Y: float64(raw.XP), }) } p := plot.New() - p.Title.Text = "XP" + p.Title.Text = "Évolution de l'XP" p.X.Label.Text = "Jours" p.Y.Label.Text = "XP" @@ -89,7 +83,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM logger.Alert("commands/stats.go - Fetching guild member", err.Error()) return } - err = plotutil.AddLinePoints(p, m.DisplayName(), stats[in]) + err = plotutil.AddLinePoints(p, m.DisplayName(), plotter.XYs(*stats[in])) if err != nil { logger.Alert("commands/stats.go - Adding line points", err.Error()) return -- cgit v1.2.3 From adf1e6008e5166232c24b1de09640f9c9fb6ffba Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 18:41:13 +0200 Subject: feat(command): better plot for stats --- commands/stats.go | 90 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 11 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 116e89f..e464890 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -2,6 +2,10 @@ package commands import ( "bytes" + "image/color" + "math" + "math/rand/v2" + "slices" "time" "git.anhgelus.world/anhgelus/les-copaings-bot/config" @@ -14,11 +18,16 @@ import ( "github.com/jackc/pgx/v5/pgtype" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" - "gonum.org/v1/plot/plotutil" "gonum.org/v1/plot/vg" ) type data struct { + CreatedAt time.Time + XP int + CopaingID int +} + +type dbData struct { CreatedAt *pgtype.Date XP int CopaingID int @@ -38,13 +47,40 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM days = uint(in) } var rawData []*data - res := gokord.DB.Raw( - `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? GROUP BY "created_at"::date, "copaing_id"`, - i.GuildID, exp.TimeStampNDaysBefore(days), - ) - if err := res.Scan(&rawData).Error; err != nil { - logger.Alert("commands/stats.go - Fetching result", err.Error()) - return + if gokord.Debug { + var rawCopaingData []*user.CopaingXP + err := gokord.DB. + Where("guild_id = ? and created_at > ?", i.GuildID, exp.TimeStampNDaysBefore(days)). + Find(&rawCopaingData). + Error + if err != nil { + logger.Alert("commands/stats.go - Fetching result", err.Error()) + return + } + rawData = make([]*data, len(rawCopaingData)) + for in, d := range rawCopaingData { + rawData[in] = &data{ + CreatedAt: d.CreatedAt, + XP: int(d.XP), + CopaingID: int(d.CopaingID), + } + } + } else { + sql := `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? GROUP BY "created_at"::date, "copaing_id"` + var rawDbData []dbData + res := gokord.DB.Raw(sql, i.GuildID, exp.TimeStampNDaysBefore(days)) + if err := res.Scan(&rawDbData).Error; err != nil { + logger.Alert("commands/stats.go - Fetching result", err.Error()) + return + } + rawData = make([]*data, len(rawDbData)) + for in, d := range rawDbData { + rawData[in] = &data{ + CreatedAt: d.CreatedAt.Time, + XP: d.XP, + CopaingID: d.CopaingID, + } + } } copaings := map[int]*user.Copaing{} @@ -65,7 +101,10 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM pts = &[]plotter.XY{} stats[raw.CopaingID] = pts } - t := float64(raw.CreatedAt.Time.Unix()-time.Now().Unix()) / (24 * 60 * 60) + t := float64(raw.CreatedAt.Unix() - time.Now().Unix()) + if !gokord.Debug { + t = math.Ceil(t / (24 * 60 * 60)) + } *pts = append(*pts, plotter.XY{ X: t, Y: float64(raw.XP), @@ -77,19 +116,48 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM p.X.Label.Text = "Jours" p.Y.Label.Text = "XP" + p.Add(plotter.NewGrid()) + + r := rand.New(rand.NewPCG(uint64(time.Now().Unix()), uint64(time.Now().Unix()))) for in, c := range copaings { m, err := s.GuildMember(i.GuildID, c.DiscordID) if err != nil { logger.Alert("commands/stats.go - Fetching guild member", err.Error()) return } - err = plotutil.AddLinePoints(p, m.DisplayName(), plotter.XYs(*stats[in])) + slices.SortFunc(*stats[in], func(a, b plotter.XY) int { + if a.X < b.X { + return -1 + } + if a.X > b.X { + return 1 + } + return 0 + }) + first := (*stats[in])[0] + if first.X > float64(-days) { + *stats[in] = append([]plotter.XY{{ + X: first.X - 1, Y: 0, + }}, *stats[in]...) + } + last := (*stats[in])[len(*stats[in])-1] + if last.X <= -1 { + *stats[in] = append(*stats[in], plotter.XY{ + X: last.X + 1, Y: 0, + }) + } + l, err := plotter.NewLine(plotter.XYs(*stats[in])) if err != nil { logger.Alert("commands/stats.go - Adding line points", err.Error()) return } + l.LineStyle.Width = vg.Points(1) + l.LineStyle.Dashes = []vg.Length{vg.Points(5), vg.Points(5)} + l.LineStyle.Color = color.RGBA{R: uint8(r.UintN(255)), G: uint8(r.UintN(255)), B: uint8(r.UintN(255)), A: 255} + p.Add(l) + p.Legend.Add(m.DisplayName(), l) } - w, err := p.WriterTo(4*vg.Inch, 4*vg.Inch, "png") + w, err := p.WriterTo(8*vg.Inch, 6*vg.Inch, "png") if err != nil { logger.Alert("commands/stats.go - Generating png", err.Error()) return -- cgit v1.2.3 From 236f57fb1525400bd4b7b6304b9d04f44cd021cc Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 18:51:54 +0200 Subject: feat(command): days option for stats --- commands/stats.go | 54 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 19 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index e464890..345f3ba 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -3,6 +3,7 @@ package commands import ( "bytes" "image/color" + "io" "math" "math/rand/v2" "slices" @@ -46,6 +47,29 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } days = uint(in) } + w, err := statsAll(s, i, days) + if err != nil { + if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil { + logger.Alert("commands/stats.go - Sending error occurred", err.Error()) + } + return + } + b := new(bytes.Buffer) + _, err = w.WriteTo(b) + if err != nil { + logger.Alert("commands/stats.go - Writing png", err.Error()) + } + err = resp.AddFile(&discordgo.File{ + Name: "plot.png", + ContentType: "image/png", + Reader: b, + }).Send() + if err != nil { + logger.Alert("commands/stats.go - Sending response", err.Error()) + } +} + +func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) (io.WriterTo, error) { var rawData []*data if gokord.Debug { var rawCopaingData []*user.CopaingXP @@ -55,7 +79,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM Error if err != nil { logger.Alert("commands/stats.go - Fetching result", err.Error()) - return + return nil, err } rawData = make([]*data, len(rawCopaingData)) for in, d := range rawCopaingData { @@ -71,7 +95,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM res := gokord.DB.Raw(sql, i.GuildID, exp.TimeStampNDaysBefore(days)) if err := res.Scan(&rawDbData).Error; err != nil { logger.Alert("commands/stats.go - Fetching result", err.Error()) - return + return nil, err } rawData = make([]*data, len(rawDbData)) for in, d := range rawDbData { @@ -92,7 +116,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM var cp user.Copaing if err := gokord.DB.First(&cp, raw.CopaingID).Error; err != nil { logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", raw.CopaingID) - return + return nil, err } copaings[raw.CopaingID] = &cp } @@ -111,6 +135,10 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM }) } + return generatePlot(s, i, days, copaings, stats) +} + +func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, copaings map[int]*user.Copaing, stats map[int]*[]plotter.XY) (io.WriterTo, error) { p := plot.New() p.Title.Text = "Évolution de l'XP" p.X.Label.Text = "Jours" @@ -123,7 +151,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM m, err := s.GuildMember(i.GuildID, c.DiscordID) if err != nil { logger.Alert("commands/stats.go - Fetching guild member", err.Error()) - return + return nil, err } slices.SortFunc(*stats[in], func(a, b plotter.XY) int { if a.X < b.X { @@ -149,7 +177,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM l, err := plotter.NewLine(plotter.XYs(*stats[in])) if err != nil { logger.Alert("commands/stats.go - Adding line points", err.Error()) - return + return nil, err } l.LineStyle.Width = vg.Points(1) l.LineStyle.Dashes = []vg.Length{vg.Points(5), vg.Points(5)} @@ -160,19 +188,7 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM w, err := p.WriterTo(8*vg.Inch, 6*vg.Inch, "png") if err != nil { logger.Alert("commands/stats.go - Generating png", err.Error()) - return - } - b := new(bytes.Buffer) - _, err = w.WriteTo(b) - if err != nil { - logger.Alert("commands/stats.go - Writing png", err.Error()) - } - err = resp.AddFile(&discordgo.File{ - Name: "plot.png", - ContentType: "image/png", - Reader: b, - }).Send() - if err != nil { - logger.Alert("commands/stats.go - Sending response", err.Error()) + return nil, err } + return w, nil } -- cgit v1.2.3 From 26643cd271b7efeaab9a00d829e182297082555c Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Thu, 21 Aug 2025 19:00:54 +0200 Subject: feat(command): user option for stats --- commands/stats.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 345f3ba..ccc5857 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -47,7 +47,13 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } days = uint(in) } - w, err := statsAll(s, i, days) + var w io.WriterTo + var err error + if v, ok := opt["user"]; ok { + w, err = statsMember(s, i, days, v.UserValue(s).ID) + } else { + w, err = statsAll(s, i, days) + } if err != nil { if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil { logger.Alert("commands/stats.go - Sending error occurred", err.Error()) @@ -138,6 +144,72 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( return generatePlot(s, i, days, copaings, stats) } +func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, discordID string) (io.WriterTo, error) { + cp := user.GetCopaing(discordID, i.GuildID) + var rawData []*data + if gokord.Debug { + var rawCopaingData []*user.CopaingXP + err := gokord.DB. + Where( + "guild_id = ? and created_at > ? and copaing_id = ?", + i.GuildID, exp.TimeStampNDaysBefore(days), discordID, + ). + Find(&rawCopaingData). + Error + if err != nil { + logger.Alert("commands/stats.go - Fetching result", err.Error()) + return nil, err + } + rawData = make([]*data, len(rawCopaingData)) + for in, d := range rawCopaingData { + rawData[in] = &data{ + CreatedAt: d.CreatedAt, + XP: int(d.XP), + CopaingID: int(d.CopaingID), + } + } + } else { + sql := `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? and "copaing_id" = ? GROUP BY "created_at"::date, "copaing_id"` + var rawDbData []dbData + res := gokord.DB.Raw(sql, i.GuildID, exp.TimeStampNDaysBefore(days), discordID) + if err := res.Scan(&rawDbData).Error; err != nil { + logger.Alert("commands/stats.go - Fetching result", err.Error()) + return nil, err + } + rawData = make([]*data, len(rawDbData)) + for in, d := range rawDbData { + rawData[in] = &data{ + CreatedAt: d.CreatedAt.Time, + XP: d.XP, + CopaingID: d.CopaingID, + } + } + } + + copaings := map[int]*user.Copaing{ + int(cp.ID): cp, + } + stats := map[int]*[]plotter.XY{} + + for _, raw := range rawData { + pts, ok := stats[raw.CopaingID] + if !ok { + pts = &[]plotter.XY{} + stats[raw.CopaingID] = pts + } + t := float64(raw.CreatedAt.Unix() - time.Now().Unix()) + if !gokord.Debug { + t = math.Ceil(t / (24 * 60 * 60)) + } + *pts = append(*pts, plotter.XY{ + X: t, + Y: float64(raw.XP), + }) + } + + return generatePlot(s, i, days, copaings, stats) +} + func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, copaings map[int]*user.Copaing, stats map[int]*[]plotter.XY) (io.WriterTo, error) { p := plot.New() p.Title.Text = "Évolution de l'XP" -- cgit v1.2.3 From d63203709f421c2b0f093d8ee0045f0854f77dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 14:30:14 +0200 Subject: refactor(stats): rewrite data creation --- commands/stats.go | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index ccc5857..5d22483 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -128,17 +128,20 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( } pts, ok := stats[raw.CopaingID] if !ok { - pts = &[]plotter.XY{} + t := make([]plotter.XY, days) + pts = &t stats[raw.CopaingID] = pts } - t := float64(raw.CreatedAt.Unix() - time.Now().Unix()) + t := raw.CreatedAt.Unix() - time.Now().Unix() if !gokord.Debug { - t = math.Ceil(t / (24 * 60 * 60)) + t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) + } else { + t = int64(math.Ceil(float64(t) / 6)) } - *pts = append(*pts, plotter.XY{ - X: t, + (*pts)[t] = plotter.XY{ + X: float64(t), Y: float64(raw.XP), - }) + } } return generatePlot(s, i, days, copaings, stats) @@ -194,17 +197,20 @@ func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint for _, raw := range rawData { pts, ok := stats[raw.CopaingID] if !ok { - pts = &[]plotter.XY{} + t := make([]plotter.XY, days) + pts = &t stats[raw.CopaingID] = pts } - t := float64(raw.CreatedAt.Unix() - time.Now().Unix()) + t := raw.CreatedAt.Unix() - time.Now().Unix() if !gokord.Debug { - t = math.Ceil(t / (24 * 60 * 60)) + t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) + } else { + t = int64(math.Ceil(float64(t) / 6)) } - *pts = append(*pts, plotter.XY{ - X: t, + (*pts)[t] = plotter.XY{ + X: float64(t), Y: float64(raw.XP), - }) + } } return generatePlot(s, i, days, copaings, stats) -- cgit v1.2.3 From 103bc0358fff171c949475406cec8161819a5a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 14:53:16 +0200 Subject: refactor(stats): unify all and one member --- commands/stats.go | 136 ++++++++++++++++-------------------------------------- 1 file changed, 39 insertions(+), 97 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 5d22483..1e55ddd 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -2,6 +2,7 @@ package commands import ( "bytes" + "gorm.io/gorm" "image/color" "io" "math" @@ -76,14 +77,26 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) (io.WriterTo, error) { + return stats(s, i, days, func(before, after string) *gorm.DB { + return gokord.DB.Raw(before+"WHERE guild_id = ? and created_at > ?"+after, i.GuildID, exp.TimeStampNDaysBefore(days)) + }) +} + +func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, discordID string) (io.WriterTo, error) { + _, err := s.GuildMember(i.GuildID, i.Member.User.ID) + if err != nil { + return nil, err + } + return stats(s, i, days, func(before, after string) *gorm.DB { + return gokord.DB.Raw(before+"WHERE guild_id = ? and created_at > ? and copaing_id = ?"+after, i.GuildID, exp.TimeStampNDaysBefore(days), discordID) + }) +} + +func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, execSql func(before, after string) *gorm.DB) (io.WriterTo, error) { var rawData []*data if gokord.Debug { var rawCopaingData []*user.CopaingXP - err := gokord.DB. - Where("guild_id = ? and created_at > ?", i.GuildID, exp.TimeStampNDaysBefore(days)). - Find(&rawCopaingData). - Error - if err != nil { + if err := execSql("SELECT * FROM copaings_xps ", "").Scan(&rawCopaingData).Error; err != nil { logger.Alert("commands/stats.go - Fetching result", err.Error()) return nil, err } @@ -96,10 +109,10 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( } } } else { - sql := `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? GROUP BY "created_at"::date, "copaing_id"` var rawDbData []dbData - res := gokord.DB.Raw(sql, i.GuildID, exp.TimeStampNDaysBefore(days)) - if err := res.Scan(&rawDbData).Error; err != nil { + if err := execSql( + `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps `, ` GROUP BY "created_at"::date, "copaing_id"`, + ).Scan(&rawDbData).Error; err != nil { logger.Alert("commands/stats.go - Fetching result", err.Error()) return nil, err } @@ -114,7 +127,7 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( } copaings := map[int]*user.Copaing{} - stats := map[int]*[]plotter.XY{} + stats := map[int][]plotter.XY{} for _, raw := range rawData { _, ok := copaings[raw.CopaingID] @@ -128,77 +141,7 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( } pts, ok := stats[raw.CopaingID] if !ok { - t := make([]plotter.XY, days) - pts = &t - stats[raw.CopaingID] = pts - } - t := raw.CreatedAt.Unix() - time.Now().Unix() - if !gokord.Debug { - t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) - } else { - t = int64(math.Ceil(float64(t) / 6)) - } - (*pts)[t] = plotter.XY{ - X: float64(t), - Y: float64(raw.XP), - } - } - - return generatePlot(s, i, days, copaings, stats) -} - -func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, discordID string) (io.WriterTo, error) { - cp := user.GetCopaing(discordID, i.GuildID) - var rawData []*data - if gokord.Debug { - var rawCopaingData []*user.CopaingXP - err := gokord.DB. - Where( - "guild_id = ? and created_at > ? and copaing_id = ?", - i.GuildID, exp.TimeStampNDaysBefore(days), discordID, - ). - Find(&rawCopaingData). - Error - if err != nil { - logger.Alert("commands/stats.go - Fetching result", err.Error()) - return nil, err - } - rawData = make([]*data, len(rawCopaingData)) - for in, d := range rawCopaingData { - rawData[in] = &data{ - CreatedAt: d.CreatedAt, - XP: int(d.XP), - CopaingID: int(d.CopaingID), - } - } - } else { - sql := `SELECT "created_at"::date::text, sum("xp") as xp, "copaing_id" FROM copaing_xps WHERE "guild_id" = ? and "created_at" > ? and "copaing_id" = ? GROUP BY "created_at"::date, "copaing_id"` - var rawDbData []dbData - res := gokord.DB.Raw(sql, i.GuildID, exp.TimeStampNDaysBefore(days), discordID) - if err := res.Scan(&rawDbData).Error; err != nil { - logger.Alert("commands/stats.go - Fetching result", err.Error()) - return nil, err - } - rawData = make([]*data, len(rawDbData)) - for in, d := range rawDbData { - rawData[in] = &data{ - CreatedAt: d.CreatedAt.Time, - XP: d.XP, - CopaingID: d.CopaingID, - } - } - } - - copaings := map[int]*user.Copaing{ - int(cp.ID): cp, - } - stats := map[int]*[]plotter.XY{} - - for _, raw := range rawData { - pts, ok := stats[raw.CopaingID] - if !ok { - t := make([]plotter.XY, days) - pts = &t + pts = make([]plotter.XY, days) stats[raw.CopaingID] = pts } t := raw.CreatedAt.Unix() - time.Now().Unix() @@ -207,16 +150,15 @@ func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint } else { t = int64(math.Ceil(float64(t) / 6)) } - (*pts)[t] = plotter.XY{ + pts[t] = plotter.XY{ X: float64(t), Y: float64(raw.XP), } } - return generatePlot(s, i, days, copaings, stats) } -func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, copaings map[int]*user.Copaing, stats map[int]*[]plotter.XY) (io.WriterTo, error) { +func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, copaings map[int]*user.Copaing, stats map[int][]plotter.XY) (io.WriterTo, error) { p := plot.New() p.Title.Text = "Évolution de l'XP" p.X.Label.Text = "Jours" @@ -231,7 +173,7 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uin logger.Alert("commands/stats.go - Fetching guild member", err.Error()) return nil, err } - slices.SortFunc(*stats[in], func(a, b plotter.XY) int { + slices.SortFunc(stats[in], func(a, b plotter.XY) int { if a.X < b.X { return -1 } @@ -240,19 +182,19 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uin } return 0 }) - first := (*stats[in])[0] - if first.X > float64(-days) { - *stats[in] = append([]plotter.XY{{ - X: first.X - 1, Y: 0, - }}, *stats[in]...) - } - last := (*stats[in])[len(*stats[in])-1] - if last.X <= -1 { - *stats[in] = append(*stats[in], plotter.XY{ - X: last.X + 1, Y: 0, - }) - } - l, err := plotter.NewLine(plotter.XYs(*stats[in])) + //first := stats[in][0] + //if first.X > float64(-days) { + // stats[in] = append([]plotter.XY{{ + // X: first.X - 1, Y: 0, + // }}, stats[in]...) + //} + //last := stats[in][len(stats[in])-1] + //if last.X <= -1 { + // stats[in] = append(stats[in], plotter.XY{ + // X: last.X + 1, Y: 0, + // }) + //} + l, err := plotter.NewLine(plotter.XYs(stats[in])) if err != nil { logger.Alert("commands/stats.go - Adding line points", err.Error()) return nil, err -- cgit v1.2.3 From 49e4fc5971e44305d99952438cf087b0b42d6592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 14:57:29 +0200 Subject: perf(stats): send deferred before creating plot --- commands/stats.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 1e55ddd..7a0da6b 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -48,8 +48,12 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM } days = uint(in) } + err := resp.IsDeferred().Send() + if err != nil { + logger.Alert("commands/stats.go - Sending deferred", err.Error()) + return + } var w io.WriterTo - var err error if v, ok := opt["user"]; ok { w, err = statsMember(s, i, days, v.UserValue(s).ID) } else { -- cgit v1.2.3 From 3f6b0717e2d1e954e0db324bc3a389d2f34e2a4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 15:27:23 +0200 Subject: fix(stats): bad table name in debug --- commands/stats.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 7a0da6b..26719dc 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -100,7 +100,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec var rawData []*data if gokord.Debug { var rawCopaingData []*user.CopaingXP - if err := execSql("SELECT * FROM copaings_xps ", "").Scan(&rawCopaingData).Error; err != nil { + if err := execSql("SELECT * FROM copaing_xps ", "").Scan(&rawCopaingData).Error; err != nil { logger.Alert("commands/stats.go - Fetching result", err.Error()) return nil, err } -- cgit v1.2.3 From 05941e243f9bef6c8f461bafae9dbd12a88362b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 15:35:55 +0200 Subject: fix(stats): index out of range and not showing no value --- commands/stats.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 26719dc..06b10bd 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -144,17 +144,24 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec copaings[raw.CopaingID] = &cp } pts, ok := stats[raw.CopaingID] + now := time.Now().Unix() if !ok { pts = make([]plotter.XY, days) + for i := 0; i < int(days); i++ { + pts[i] = plotter.XY{ + X: float64(i - int(days)), + Y: 0, + } + } stats[raw.CopaingID] = pts } - t := raw.CreatedAt.Unix() - time.Now().Unix() + t := raw.CreatedAt.Unix() - now if !gokord.Debug { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) } else { t = int64(math.Ceil(float64(t) / 6)) } - pts[t] = plotter.XY{ + pts[int64(days)-t] = plotter.XY{ X: float64(t), Y: float64(raw.XP), } -- cgit v1.2.3 From 6ec3cf37300c1faf92c62640d1d5fe2638749c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:16:36 +0200 Subject: feat(debug): decrease reduce time --- commands/stats.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 06b10bd..3422e2a 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -158,8 +158,6 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec t := raw.CreatedAt.Unix() - now if !gokord.Debug { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) - } else { - t = int64(math.Ceil(float64(t) / 6)) } pts[int64(days)-t] = plotter.XY{ X: float64(t), -- cgit v1.2.3 From 6ac00e89615838154607319bdff428f778bdd432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:19:57 +0200 Subject: fix(stats): another index out of range --- commands/stats.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 3422e2a..3d487d3 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -159,7 +159,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec if !gokord.Debug { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) } - pts[int64(days)-t] = plotter.XY{ + pts[int64(days)+t] = plotter.XY{ // because t <= 0 X: float64(t), Y: float64(raw.XP), } -- cgit v1.2.3 From 0fe0cf1c148316d667018d3f5b3e9d91f0f6c797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:26:59 +0200 Subject: fix(stats): bad where condition for member --- commands/stats.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 3d487d3..351090f 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -87,12 +87,15 @@ func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) ( } func statsMember(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, discordID string) (io.WriterTo, error) { - _, err := s.GuildMember(i.GuildID, i.Member.User.ID) + _, err := s.GuildMember(i.GuildID, discordID) if err != nil { return nil, err } return stats(s, i, days, func(before, after string) *gorm.DB { - return gokord.DB.Raw(before+"WHERE guild_id = ? and created_at > ? and copaing_id = ?"+after, i.GuildID, exp.TimeStampNDaysBefore(days), discordID) + return gokord.DB.Raw( + before+"WHERE guild_id = ? and created_at > ? and copaing_id = ?"+after, + i.GuildID, exp.TimeStampNDaysBefore(days), user.GetCopaing(discordID, i.GuildID).ID, + ) }) } @@ -171,6 +174,9 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uin p := plot.New() p.Title.Text = "Évolution de l'XP" p.X.Label.Text = "Jours" + if gokord.Debug { + p.X.Label.Text = "Secondes" + } p.Y.Label.Text = "XP" p.Add(plotter.NewGrid()) -- cgit v1.2.3 From a23130addc0a8e988a5b360b97d72d2917253831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:34:41 +0200 Subject: perf(stats): create goroutine for plot generation --- commands/stats.go | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 351090f..ccd9412 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -53,31 +53,33 @@ func Stats(s *discordgo.Session, i *discordgo.InteractionCreate, opt cmd.OptionM logger.Alert("commands/stats.go - Sending deferred", err.Error()) return } - var w io.WriterTo - if v, ok := opt["user"]; ok { - w, err = statsMember(s, i, days, v.UserValue(s).ID) - } else { - w, err = statsAll(s, i, days) - } - if err != nil { - if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil { - logger.Alert("commands/stats.go - Sending error occurred", err.Error()) + go func() { + var w io.WriterTo + if v, ok := opt["user"]; ok { + w, err = statsMember(s, i, days, v.UserValue(s).ID) + } else { + w, err = statsAll(s, i, days) } - return - } - b := new(bytes.Buffer) - _, err = w.WriteTo(b) - if err != nil { - logger.Alert("commands/stats.go - Writing png", err.Error()) - } - err = resp.AddFile(&discordgo.File{ - Name: "plot.png", - ContentType: "image/png", - Reader: b, - }).Send() - if err != nil { - logger.Alert("commands/stats.go - Sending response", err.Error()) - } + if err != nil { + if err = resp.IsEphemeral().SetMessage("Il y a eu une erreur...").Send(); err != nil { + logger.Alert("commands/stats.go - Sending error occurred", err.Error()) + } + return + } + b := new(bytes.Buffer) + _, err = w.WriteTo(b) + if err != nil { + logger.Alert("commands/stats.go - Writing png", err.Error()) + } + err = resp.AddFile(&discordgo.File{ + Name: "plot.png", + ContentType: "image/png", + Reader: b, + }).Send() + if err != nil { + logger.Alert("commands/stats.go - Sending response", err.Error()) + } + }() } func statsAll(s *discordgo.Session, i *discordgo.InteractionCreate, days uint) (io.WriterTo, error) { -- cgit v1.2.3 From 355db490b72f51e312d599bd38c7e412cbb94691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:47:01 +0200 Subject: fix(stats): index out of range again cannot be tested in debug mode --- commands/stats.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index ccd9412..263d80c 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -164,7 +164,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec if !gokord.Debug { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) } - pts[int64(days)+t] = plotter.XY{ // because t <= 0 + pts[int64(days)+t-1] = plotter.XY{ // because t <= 0 X: float64(t), Y: float64(raw.XP), } -- cgit v1.2.3 From 59ba978ba78b56e9195946b5bb12011a7a936294 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 16:56:02 +0200 Subject: fix(stats): index out of range another time I think I have fixed every out out of range could be tested in debug mode, but is very hard to reproduce --- commands/stats.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 263d80c..34734b0 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -151,8 +151,8 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec pts, ok := stats[raw.CopaingID] now := time.Now().Unix() if !ok { - pts = make([]plotter.XY, days) - for i := 0; i < int(days); i++ { + pts = make([]plotter.XY, days+1) + for i := 0; i < len(pts); i++ { pts[i] = plotter.XY{ X: float64(i - int(days)), Y: 0, @@ -164,7 +164,7 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec if !gokord.Debug { t = int64(math.Ceil(float64(t) / (24 * 60 * 60))) } - pts[int64(days)+t-1] = plotter.XY{ // because t <= 0 + pts[int64(days)+t] = plotter.XY{ // because t <= 0 X: float64(t), Y: float64(raw.XP), } -- cgit v1.2.3 From 22ebfcf0c9b309a1b14ea9b8fa39f15b610eb0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 17:27:14 +0200 Subject: style(stats): remove useless parts --- commands/stats.go | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index 34734b0..cde49a1 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -169,10 +169,10 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec Y: float64(raw.XP), } } - return generatePlot(s, i, days, copaings, stats) + return generatePlot(s, i, copaings, stats) } -func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, copaings map[int]*user.Copaing, stats map[int][]plotter.XY) (io.WriterTo, error) { +func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, copaings map[int]*user.Copaing, stats map[int][]plotter.XY) (io.WriterTo, error) { p := plot.New() p.Title.Text = "Évolution de l'XP" p.X.Label.Text = "Jours" @@ -199,18 +199,6 @@ func generatePlot(s *discordgo.Session, i *discordgo.InteractionCreate, days uin } return 0 }) - //first := stats[in][0] - //if first.X > float64(-days) { - // stats[in] = append([]plotter.XY{{ - // X: first.X - 1, Y: 0, - // }}, stats[in]...) - //} - //last := stats[in][len(stats[in])-1] - //if last.X <= -1 { - // stats[in] = append(stats[in], plotter.XY{ - // X: last.X + 1, Y: 0, - // }) - //} l, err := plotter.NewLine(plotter.XYs(stats[in])) if err != nil { logger.Alert("commands/stats.go - Adding line points", err.Error()) -- cgit v1.2.3 From 12585b20d504a664ce887d781bce1d299350d244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 31 Aug 2025 17:35:01 +0200 Subject: feat(stats): avoid stopping process if copaing is not found --- commands/stats.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'commands') diff --git a/commands/stats.go b/commands/stats.go index cde49a1..0114918 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -2,6 +2,7 @@ package commands import ( "bytes" + "errors" "gorm.io/gorm" "image/color" "io" @@ -143,8 +144,12 @@ func stats(s *discordgo.Session, i *discordgo.InteractionCreate, days uint, exec if !ok { var cp user.Copaing if err := gokord.DB.First(&cp, raw.CopaingID).Error; err != nil { - logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", raw.CopaingID) - return nil, err + if !errors.Is(err, gorm.ErrRecordNotFound) { + logger.Alert("commands/stats.go - Finding copaing", err.Error(), "id", raw.CopaingID) + return nil, err + } + logger.Warn("Copaing not found, skipping entry", "old_id", raw.CopaingID) + continue } copaings[raw.CopaingID] = &cp } -- cgit v1.2.3 From 30ecd60b041398390f11fccdf46444fa28690bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Thu, 4 Sep 2025 16:25:59 +0200 Subject: build(gokord): upgrade to latest nightly still use discordgo name before merging anhgelus/gokord with nyttikord/gokord --- commands/config.go | 2 +- commands/credits.go | 2 +- commands/rank.go | 2 +- commands/reset.go | 2 +- commands/stats.go | 2 +- commands/top.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) (limited to 'commands') diff --git a/commands/config.go b/commands/config.go index 41fb60e..c4644bc 100644 --- a/commands/config.go +++ b/commands/config.go @@ -9,7 +9,7 @@ import ( "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/component" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" + discordgo "github.com/nyttikord/gokord" ) const ( diff --git a/commands/credits.go b/commands/credits.go index 5c3c4bd..f0a8c46 100644 --- a/commands/credits.go +++ b/commands/credits.go @@ -4,7 +4,7 @@ import ( "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" + discordgo "github.com/nyttikord/gokord" ) func Credits(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { diff --git a/commands/rank.go b/commands/rank.go index 48a893f..94dabf2 100644 --- a/commands/rank.go +++ b/commands/rank.go @@ -7,7 +7,7 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/user" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" + discordgo "github.com/nyttikord/gokord" ) func Rank(s *discordgo.Session, i *discordgo.InteractionCreate, optMap cmd.OptionMap, resp *cmd.ResponseBuilder) { diff --git a/commands/reset.go b/commands/reset.go index 128354f..07e3ba3 100644 --- a/commands/reset.go +++ b/commands/reset.go @@ -5,7 +5,7 @@ import ( "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" + discordgo "github.com/nyttikord/gokord" ) func Reset(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { diff --git a/commands/stats.go b/commands/stats.go index 0114918..f93f6a0 100644 --- a/commands/stats.go +++ b/commands/stats.go @@ -17,8 +17,8 @@ import ( "github.com/anhgelus/gokord" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" "github.com/jackc/pgx/v5/pgtype" + discordgo "github.com/nyttikord/gokord" "gonum.org/v1/plot" "gonum.org/v1/plot/plotter" "gonum.org/v1/plot/vg" diff --git a/commands/top.go b/commands/top.go index fedea45..ecbf6f4 100644 --- a/commands/top.go +++ b/commands/top.go @@ -9,7 +9,7 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/user" "github.com/anhgelus/gokord/cmd" "github.com/anhgelus/gokord/logger" - "github.com/bwmarrin/discordgo" + discordgo "github.com/nyttikord/gokord" ) func Top(_ *discordgo.Session, i *discordgo.InteractionCreate, _ cmd.OptionMap, resp *cmd.ResponseBuilder) { -- cgit v1.2.3