aboutsummaryrefslogtreecommitdiff
path: root/config/xp_role.go
diff options
context:
space:
mode:
Diffstat (limited to 'config/xp_role.go')
-rw-r--r--config/xp_role.go214
1 files changed, 214 insertions, 0 deletions
diff --git a/config/xp_role.go b/config/xp_role.go
new file mode 100644
index 0000000..bed5c57
--- /dev/null
+++ b/config/xp_role.go
@@ -0,0 +1,214 @@
+package config
+
+import (
+ "fmt"
+ "github.com/anhgelus/gokord"
+ "github.com/anhgelus/gokord/cmd"
+ "github.com/anhgelus/gokord/component"
+ "github.com/anhgelus/gokord/logger"
+ "github.com/bwmarrin/discordgo"
+ "strconv"
+ "time"
+)
+
+type XpRole struct {
+ ID uint `gorm:"primarykey"`
+ XP uint
+ RoleID string
+ GuildConfigID uint
+}
+
+const (
+ ModifyXpRole = "xp_role"
+ XpRoleAdd = "xp_role_add"
+ XpRoleAddLevel = "xp_role_add_level"
+ XpRoleAddRole = "xp_role_add_role"
+ XpRoleDel = "xp_role_del"
+ XpRoleDelRole = "xp_role_del_role"
+ XpRoleEdit = "xp_role_edit"
+ XpRoleEditLevel = "xp_role_edit_level"
+ XpRoleEditRole = "xp_role_edit_role"
+)
+
+var (
+ configModifyMap = map[string]uint{}
+)
+
+func HandleModifyXpRole(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().
+ SetMessage("Action à réaliser").
+ SetComponents(component.New().Add(component.NewActionRow().Add(
+ component.NewStringSelect(ModifyXpRole).SetPlaceholder("Action").
+ AddOption(
+ component.NewSelectOption("Ajouter", XpRoleAdd).
+ SetDescription("Ajouter un rôle à XP").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "⬆️"}),
+ ).
+ AddOption(
+ component.NewSelectOption("Modifier", XpRoleEdit).
+ SetDescription("Modifier un rôle à XP").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "📝"}),
+ ).
+ AddOption(
+ component.NewSelectOption("Supprimer", XpRoleDel).
+ SetDescription("Supprimer un rôle à XP").
+ SetEmoji(&discordgo.ComponentEmoji{Name: "❌"}),
+ ),
+ ))).Send()
+ if err != nil {
+ logger.Alert("config/guild.go - Sending config", err.Error())
+ }
+}
+
+func HandleXpRoleAddEdit(_ *discordgo.Session, _ *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ cID := XpRoleAddLevel
+ if data.CustomID == XpRoleEdit {
+ cID = XpRoleEditLevel
+ }
+ err := resp.IsModal().
+ SetTitle("Role").
+ SetComponents(component.New().ForModal().Add(component.NewActionRow().Add(
+ component.NewTextInput(cID, "Niveau", discordgo.TextInputShort).
+ SetPlaceholder("5").
+ IsRequired().
+ SetMinLength(0).
+ SetMaxLength(5),
+ ))).
+ Send()
+ if err != nil {
+ logger.Alert("config/guild.go - Sending modal to add/edit", err.Error())
+ }
+}
+
+func HandleXpRoleAddRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ for _, r := range cfg.XpRoles {
+ if r.RoleID == roleId {
+ err := resp.SetMessage("Le rôle est déjà présent dans la config").Send()
+ if err != nil {
+ logger.Alert("commands/config.go - Role already in config", err.Error())
+ }
+ return
+ }
+ }
+ cfg.XpRoles = append(cfg.XpRoles, XpRole{
+ XP: configModifyMap[getKeyConfigRole(i)],
+ RoleID: roleId,
+ })
+ err := cfg.Save()
+ if err != nil {
+ logger.Alert(
+ "commands/config.go - Saving config",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "add",
+ )
+ }
+ if err = resp.IsEphemeral().SetMessage("Rôle ajouté.").Send(); err != nil {
+ logger.Alert("commands/config.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleEditRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ _, r := cfg.FindXpRole(roleId)
+ if r == nil {
+ err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
+ if err != nil {
+ logger.Alert("commands/config.go - Role not found (edit)", err.Error())
+ }
+ return
+ }
+ r.XP = configModifyMap[getKeyConfigRole(i)]
+ err := gokord.DB.Save(r).Error
+ if err != nil {
+ logger.Alert(
+ "commands/config.go - Saving config",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "edit",
+ )
+ }
+ if err = resp.IsEphemeral().SetMessage("Rôle modifié.").Send(); err != nil {
+ logger.Alert("commands/config.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleDel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ err := resp.IsEphemeral().
+ SetMessage("Rôle à supprimer").
+ SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(XpRoleDelRole)))).
+ Send()
+ if err != nil {
+ logger.Alert("config/guild.go - Sending response to del", err.Error())
+ }
+}
+
+func HandleXpRoleDelRole(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.MessageComponentInteractionData, resp *cmd.ResponseBuilder) {
+ cfg := GetGuildConfig(i.GuildID)
+ roleId := data.Values[0]
+ _, r := cfg.FindXpRole(roleId)
+ if r == nil {
+ err := resp.SetMessage("Le rôle n'a pas été trouvé dans la config.").Send()
+ if err != nil {
+ logger.Alert("commands/config.go - Sending role not found (del)", err.Error())
+ }
+ return
+ }
+ err := gokord.DB.Delete(r).Error
+ if err != nil {
+ logger.Alert(
+ "commands/config.go - Deleting entry",
+ err.Error(),
+ "guild_id", i.GuildID,
+ "role_id", roleId,
+ "type", "del",
+ )
+ }
+ if err = resp.IsEphemeral().SetMessage("Rôle supprimé.").Send(); err != nil {
+ logger.Alert("commands/config.go - Sending success", err.Error())
+ }
+}
+
+func HandleXpRoleLevel(_ *discordgo.Session, i *discordgo.InteractionCreate, data discordgo.ModalSubmitInteractionData, resp *cmd.ResponseBuilder) {
+ input := data.Components[0].(*discordgo.ActionsRow).Components[0].(*discordgo.TextInput)
+
+ k := getKeyConfigRole(i)
+ in, err := strconv.Atoi(input.Value)
+ if err != nil || in < 0 {
+ if err = resp.IsEphemeral().
+ SetMessage("Impossible de lire le nombre. Il doit s'agit d'un nombre entier positif.").
+ Send(); err != nil {
+ logger.Alert("command/config.go - Sending bad number", err.Error())
+ }
+ return
+ }
+ configModifyMap[k] = uint(in)
+ go func(i *discordgo.InteractionCreate, k string) {
+ time.Sleep(5 * time.Minute)
+ delete(configModifyMap, k)
+ }(i, k)
+
+ cID := XpRoleAddRole
+ resp.SetMessage("Rôle à ajouter")
+ if data.CustomID == XpRoleEditLevel {
+ cID = XpRoleEditLevel
+ resp.SetMessage("Rôle à modifier")
+ }
+
+ err = resp.IsEphemeral().
+ SetMessage("Rôle à supprimer").
+ SetComponents(component.New().Add(component.NewActionRow().Add(component.NewRoleSelect(cID)))).
+ Send()
+ if err != nil {
+ logger.Alert("config/guild.go - Sending response to add/edit", err.Error())
+ }
+}
+
+func getKeyConfigRole(i *discordgo.InteractionCreate) string {
+ return fmt.Sprintf("r:%s:%s", i.GuildID, i.User.ID)
+}