aboutsummaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-08-21 12:54:52 +0000
committerAnhgelus Morhtuuzh <william@herges.fr>2025-08-21 12:54:52 +0000
commit166aadabfb37a1a565bb8d46241682c709b1c4db (patch)
treebc77b8e3f7a7599ad272fcc3c0032f3258ff7cd7 /config
parent026abcc07a57eeda8a08a746ad2b664e956360f3 (diff)
parent15448aa0014e1473582227e2ea301df7ccfb9560 (diff)
Merge pull request '[Refactor] Config command' (#1) from refactor/config-command into main
Reviewed-on: https://git.anhgelus.world/anhgelus/les-copaings-bot/pulls/1
Diffstat (limited to 'config')
-rw-r--r--config/channel.go126
-rw-r--r--config/guild.go14
-rw-r--r--config/xp_reduce.go60
-rw-r--r--config/xp_role.go216
4 files changed, 405 insertions, 11 deletions
diff --git a/config/channel.go b/config/channel.go
new file mode 100644
index 0000000..355b0e1
--- /dev/null
+++ b/config/channel.go
@@ -0,0 +1,126 @@
+package config
+
+import (
+ "github.com/anhgelus/gokord/cmd"
+ "github.com/anhgelus/gokord/component"
+ "github.com/anhgelus/gokord/logger"
+ "github.com/bwmarrin/discordgo"
+ "strings"
+)
+
+const (
+ ModifyFallbackChannel = "fallback_channel"
+ FallbackChannelSet = "fallback_channel_set"
+
+ ModifyDisChannel = "disabled_channel"
+ DisChannelAdd = "disabled_channel_add"
+ DisChannelAddSet = "disabled_channel_add_set"
+ DisChannelDel = "disabled_channel_del"
+ DisChannelDelSet = "disabled_channel_del_set"
+)
+
+func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().SetComponents(component.New().Add(component.NewActionRow().Add(
+ component.NewChannelSelect(FallbackChannelSet).AddChannelType(discordgo.ChannelTypeGuildText),
+ ))).Send()
+ if err != nil {
+ logger.Alert("config/channel.go - Sending channel list for fallback", err.Error())
+ }
+}
+
+func HandleFallbackChannelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+
+ cfg := GetGuildConfig(i.GuildID)
+ channelID := data.Values[0]
+
+ cfg.FallbackChannel = channelID
+ err := cfg.Save()
+ if err != nil {
+ logger.Alert("config/channel.go - Saving fallback channel", err.Error())
+ if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil {
+ logger.Alert("config/channel.go - Sending error while saving channel", err.Error())
+ }
+ return
+ }
+ if err = resp.SetMessage("Salon sauvegardé.").Send(); err != nil {
+ logger.Alert("config/channel.go - Sending channel saved", err.Error())
+ }
+}
+
+func HandleModifyDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().SetComponents(component.New().Add(component.NewActionRow().
+ Add(
+ component.NewButton(DisChannelAdd, discordgo.PrimaryButton).
+ SetLabel("Désactiver un salon").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "⬇️"}),
+ ).
+ Add(
+ component.NewButton(DisChannelDel, discordgo.DangerButton).
+ SetLabel("Réactiver un salon").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}),
+ ),
+ )).Send()
+ if err != nil {
+ logger.Alert("config/channel.go - Sending action type", err.Error())
+ }
+}
+
+func HandleDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral().SetMessage("Salon à désactiver...")
+ cID := DisChannelAddSet
+ if data.CustomID == DisChannelDel {
+ resp.SetMessage("Salon à réactiver...")
+ cID = DisChannelDelSet
+ }
+ err := resp.SetComponents(component.New().Add(component.NewActionRow().Add(component.NewChannelSelect(cID)))).Send()
+ if err != nil {
+ logger.Alert("config/channel.go - Sending channel list for disable", err.Error())
+ }
+}
+
+func HandleDisChannelAddSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ cfg := GetGuildConfig(i.GuildID)
+ id := data.Values[0]
+ if strings.Contains(cfg.DisabledChannels, id) {
+ err := resp.SetMessage("Le salon est déjà dans la liste des salons désactivés").Send()
+ if err != nil {
+ logger.Alert("commands/config.go - Channel already disabled", err.Error())
+ }
+ return
+ }
+ cfg.DisabledChannels += id + ";"
+ if err := cfg.Save(); err != nil {
+ logger.Alert("commands/config.go - Saving config disable add", err.Error())
+ if err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send(); err != nil {
+ logger.Alert("config/channel.go - Sending error while saving config", err.Error())
+ }
+ }
+ if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil {
+ logger.Alert("commands/config.go - Modification saved message disable add", err.Error())
+ }
+}
+
+func HandleDisChannelDelSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ cfg := GetGuildConfig(i.GuildID)
+ id := data.Values[0]
+ if !strings.Contains(cfg.DisabledChannels, id) {
+ err := resp.SetMessage("Le salon n'est pas désactivé").Send()
+ if err != nil {
+ logger.Alert("commands/config.go - Channel not disabled", err.Error())
+ }
+ return
+ }
+ cfg.DisabledChannels = strings.ReplaceAll(cfg.DisabledChannels, id+";", "")
+ if err := cfg.Save(); err != nil {
+ logger.Alert("commands/config.go - Saving config disable del", err.Error())
+ if err = resp.SetMessage("Il y a eu une erreur lors de la modification de de la base de données.").Send(); err != nil {
+ logger.Alert("config/channel.go - Sending error while saving config", err.Error())
+ }
+ }
+ if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil {
+ logger.Alert("commands/config.go - Modification saved message disable del", err.Error())
+ }
+}
diff --git a/config/guild.go b/config/guild.go
index fb7eaef..8384d5b 100644
--- a/config/guild.go
+++ b/config/guild.go
@@ -1,9 +1,9 @@
package config
import (
- "github.com/anhgelus/gokord"
- "github.com/anhgelus/gokord/utils"
"strings"
+
+ "github.com/anhgelus/gokord"
)
type GuildConfig struct {
@@ -15,18 +15,10 @@ type GuildConfig struct {
DaysXPRemains uint `gorm:"default:90"` // 30 * 3 = 90 (three months)
}
-type XpRole struct {
- ID uint `gorm:"primarykey"`
- XP uint
- RoleID string
- GuildConfigID uint
-}
-
func GetGuildConfig(guildID string) *GuildConfig {
cfg := GuildConfig{GuildID: guildID}
if err := cfg.Load(); err != nil {
- utils.SendAlert("config/guild.go - Loading guild config", err.Error(), "guild_id", guildID)
- return nil
+ panic(err)
}
return &cfg
}
diff --git a/config/xp_reduce.go b/config/xp_reduce.go
new file mode 100644
index 0000000..ce5f23c
--- /dev/null
+++ b/config/xp_reduce.go
@@ -0,0 +1,60 @@
+package config
+
+import (
+ "strconv"
+
+ "github.com/anhgelus/gokord/cmd"
+ "github.com/anhgelus/gokord/component"
+ "github.com/anhgelus/gokord/logger"
+ "github.com/bwmarrin/discordgo"
+)
+
+const (
+ ModifyTimeReduce = "time_reduce"
+ TimeReduceSet = "time_reduce_set"
+)
+
+func HandleModifyPeriodicReduce(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsModal().
+ SetCustomID(TimeReduceSet).
+ SetComponents(component.New().ForModal().Add(component.NewActionRow().ForModal().Add(
+ component.NewTextInput(TimeReduceSet, "Jours avant la réduction", discordgo.TextInputShort).
+ SetMinLength(1).
+ SetMaxLength(3),
+ ))).Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Sending modal for periodic reduce", err.Error())
+ }
+}
+
+func HandleTimeReduceSet(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ v := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput).Value
+ days, err := strconv.Atoi(v)
+ if err != nil {
+ logger.Debug(err.Error())
+ if err = resp.SetMessage("Nombres de jours invalides. Merci de mettre un entier.").Send(); err != nil {
+ logger.Alert("config/xp_reduce.go - Sending bad input", err.Error())
+ }
+ return
+ }
+ if days < 30 {
+ err = resp.SetMessage("Le nombre de jours est inférieur à 30.").Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Days < 30 (fallback)", err.Error())
+ }
+ return
+ }
+ cfg := GetGuildConfig(i.GuildID)
+ cfg.DaysXPRemains = uint(days)
+ if err = cfg.Save(); err != nil {
+ logger.Alert("config/channel.go - Saving days xp remains", err.Error())
+ if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil {
+ logger.Alert("config/xp_reduce.go - Sending error while saving days xp remains", err.Error())
+ }
+ return
+ }
+ if err = resp.SetMessage("Modification sauvegardée.").Send(); err != nil {
+ logger.Alert("config/xp_reduce.go - Sending days saved", err.Error())
+ }
+}
diff --git a/config/xp_role.go b/config/xp_role.go
new file mode 100644
index 0000000..f815cc2
--- /dev/null
+++ b/config/xp_role.go
@@ -0,0 +1,216 @@
+package config
+
+import (
+ "fmt"
+ "strconv"
+ "time"
+
+ "github.com/anhgelus/gokord"
+ "github.com/anhgelus/gokord/cmd"
+ "github.com/anhgelus/gokord/component"
+ "github.com/anhgelus/gokord/logger"
+ "github.com/anhgelus/les-copaings-bot/exp"
+ "github.com/bwmarrin/discordgo"
+)
+
+type XpRole struct {
+ ID uint `gorm:"primarykey"`
+ XP uint
+ RoleID string
+ GuildConfigID uint
+}
+
+const (
+ ModifyXpRole = "xp_role"
+ XpRoleAdd = "xp_role_add"
+ XpRoleAddLevel = "xp_role_add_level"
+ XpRoleAddRole = "xp_role_add_role"
+ XpRoleDel = "xp_role_del"
+ XpRoleDelRole = "xp_role_del_role"
+ XpRoleEdit = "xp_role_edit"
+ XpRoleEditLevel = "xp_role_edit_level"
+ XpRoleEditRole = "xp_role_edit_role"
+)
+
+var (
+ configModifyMap = map[string]uint{}
+)
+
+func HandleModifyXpRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().
+ SetMessage("Action à réaliser").
+ SetComponents(component.New().Add(component.NewActionRow().
+ Add(component.NewButton(XpRoleAdd, discordgo.PrimaryButton).
+ SetLabel("Ajouter").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}),
+ ).
+ Add(component.NewButton(XpRoleEdit, discordgo.SecondaryButton).
+ SetLabel("Modifier").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}),
+ ).
+ Add(component.NewButton(XpRoleDel, discordgo.DangerButton).
+ SetLabel("Supprimer").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}),
+ ),
+ )).Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Sending config", err.Error())
+ }
+}
+
+func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ cID := XpRoleAddLevel
+ if data.CustomID == XpRoleEdit {
+ cID = XpRoleEditLevel
+ }
+ err := resp.IsModal().
+ SetTitle("Role").
+ SetCustomID(cID).
+ SetComponents(component.New().ForModal().Add(component.NewActionRow().ForModal().Add(
+ component.NewTextInput(cID, "Niveau", discordgo.TextInputShort).
+ SetPlaceholder("5").
+ IsRequired().
+ SetMinLength(0).
+ SetMaxLength(5),
+ ))).
+ Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Sending modal to add/edit", err.Error())
+ }
+}
+
+func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ for _, r := range cfg.XpRoles {
+ if r.RoleID == roleId {
+ err := resp.SetMessage("Le rôle est déjà présent dans la config").Send()
+ if err != nil {
+ logger.Alert("config/xp_role.go - Role already in config", err.Error())
+ }
+ return
+ }
+ }
+ cfg.XpRoles = append(cfg.XpRoles, XpRole{
+ XP: configModifyMap[getKeyConfigRole(i)],
+ RoleID: roleId,
+ })
+ err := cfg.Save()
+ if err != nil {
+ logger.Alert(
+ "config/xp_role.go - Saving config",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "add",
+ )
+ }
+ if err = resp.SetMessage("Rôle ajouté.").Send(); err != nil {
+ logger.Alert("config/xp_role.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ _, r := cfg.FindXpRole(roleId)
+ if r == nil {
+ err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
+ if err != nil {
+ logger.Alert("config/xp_role.go - Role not found (edit)", err.Error())
+ }
+ return
+ }
+ r.XP = configModifyMap[getKeyConfigRole(i)]
+ err := gokord.DB.Save(r).Error
+ if err != nil {
+ logger.Alert(
+ "config/xp_role.go - Saving config",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "edit",
+ )
+ }
+ if err = resp.SetMessage("Rôle modifié.").Send(); err != nil {
+ logger.Alert("config/xp_role.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().
+ SetMessage("Rôle à supprimer").
+ SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))).
+ Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Sending response to del", err.Error())
+ }
+}
+
+func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ _, r := cfg.FindXpRole(roleId)
+ if r == nil {
+ err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
+ if err != nil {
+ logger.Alert("config/xp_role.go - Sending role not found (del)", err.Error())
+ }
+ return
+ }
+ err := gokord.DB.Delete(r).Error
+ if err != nil {
+ logger.Alert(
+ "config/xp_role.go - Deleting entry",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "del",
+ )
+ }
+ if err = resp.SetMessage("Rôle supprimé.").Send(); err != nil {
+ logger.Alert("config/xp_role.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) {
+ resp.IsEphemeral()
+ input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput)
+
+ k := getKeyConfigRole(i)
+ in, err := strconv.Atoi(input.Value)
+ if err != nil || in < 0 {
+ if err = resp.
+ 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] = exp.LevelXP(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 = XpRoleEditRole
+ resp.SetMessage("Rôle à modifier")
+ }
+
+ err = resp.
+ SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))).
+ Send()
+ if err != nil {
+ logger.Alert("config/xp_reduce.go - Sending response to add/edit", err.Error())
+ }
+}
+
+func getKeyConfigRole(i *discordgo.InteractionCreate) string {
+ return fmt.Sprintf("r:%s:%s", i.GuildID, i.Member.User.ID)
+}