diff options
| -rw-r--r-- | commands/config.go | 128 | ||||
| -rw-r--r-- | config/channel.go | 112 | ||||
| -rw-r--r-- | config/guild.go | 24 | ||||
| -rw-r--r-- | config/xp_reduce.go | 101 | ||||
| -rw-r--r-- | config/xp_role.go | 107 | ||||
| -rw-r--r-- | events.go | 10 | ||||
| -rw-r--r-- | main.go | 41 |
7 files changed, 253 insertions, 270 deletions
diff --git a/commands/config.go b/commands/config.go index d1e144d..fc15a5c 100644 --- a/commands/config.go +++ b/commands/config.go @@ -2,6 +2,7 @@ package commands import ( "fmt" + "slices" "strings" "git.anhgelus.world/anhgelus/les-copaings-bot/config" @@ -11,7 +12,6 @@ import ( "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/emoji" "github.com/nyttikord/gokord/interaction" ) @@ -24,6 +24,9 @@ func ConfigResponse(i *discordgo.InteractionCreate) *interaction.Response { cfg := config.GetGuildConfig(i.GuildID) roles := "" l := len(cfg.XpRoles) - 1 + slices.SortFunc(cfg.XpRoles, func(xp1, xp2 config.XpRole) int { + return int(xp2.XP) - int(xp1.XP) + }) for i, r := range cfg.XpRoles { if i == l { roles += fmt.Sprintf("> Niveau %d - <@&%s>", exp.Level(r.XP), r.RoleID) @@ -32,68 +35,78 @@ func ConfigResponse(i *discordgo.InteractionCreate) *interaction.Response { } } if len(roles) == 0 { - roles = "Aucun rôle configuré :(" + roles = "Aucun rôle configuré" } disChans := strings.Split(cfg.DisabledChannels, ";") - l = len(disChans) - 1 - chans := "" - for i, c := range disChans { - if i == l-1 { - chans += fmt.Sprintf("> <#%s>", c) - } else if i != l { - chans += fmt.Sprintf("> <#%s>\n", c) + disChansDefault := []component.SelectMenuDefaultValue{} + for _, c := range disChans { + if c != "" { + disChansDefault = append(disChansDefault, component.SelectMenuDefaultValue{ + ID: c, + Type: types.SelectMenuDefaultValueChannel, + }) } } - if len(chans) == 0 { - chans = "Aucun salon désactivé :)" - } - var defaultChan string - if len(cfg.FallbackChannel) == 0 { - defaultChan = "Pas de valeur" - } else { - defaultChan = fmt.Sprintf("<#%s>", cfg.FallbackChannel) + defaultChan := []component.SelectMenuDefaultValue{} + if len(cfg.FallbackChannel) > 0 { + defaultChan = append(defaultChan, component.SelectMenuDefaultValue{ + ID: cfg.FallbackChannel, + Type: types.SelectMenuDefaultValueChannel, + }) } + zero := 0 content := []component.Component{ &component.Container{ Components: []component.Message{ &component.TextDisplay{Content: "## Configuration"}, &component.Separator{}, - &component.TextDisplay{Content: "**Salon par défaut**\n" + defaultChan}, - &component.TextDisplay{Content: "**Rôles de niveau**\n" + roles}, - &component.TextDisplay{Content: "**Salons ignorés**\n" + chans}, - &component.TextDisplay{ - Content: fmt.Sprintf("**Jours avant la réduction**\n%d jours", cfg.DaysXPRemains), + &component.TextDisplay{Content: "**Salons par défaut**\n-# Les niveaux obtenue grâce à un appel sont affichés ici"}, + &component.ActionsRow{ + Components: []component.Message{ + &component.SelectMenu{ + MenuType: types.SelectMenuChannel, + CustomID: config.ModifyFallbackChannel, + Placeholder: "Pas de salon par défaut", + MinValues: &zero, + MaxValues: 1, + DefaultValues: defaultChan, + }, + }, }, + &component.TextDisplay{Content: "**Salons désactivé**\n-# Les messages ne donneront pas d'expérience dans ces salons"}, &component.ActionsRow{ Components: []component.Message{ &component.SelectMenu{ - MenuType: types.SelectMenuString, - Placeholder: "Gestion des paramètres", - CustomID: ConfigModify, - Options: []component.SelectMenuOption{ - { - Label: "Salons par défaut", - Value: config.ModifyFallbackChannel, - Emoji: &emoji.Component{Name: "📣"}, - }, - { - Label: "Rôles de niveaux", - Value: config.ModifyXpRole, - Emoji: &emoji.Component{Name: "🏅"}, - }, - { - Label: "Salons ignorés", - Value: config.ModifyDisChannel, - Emoji: &emoji.Component{Name: "🫣"}, - }, - { - Label: "Temps avant la réduction d'expérience", - Value: config.ModifyTimeReduce, - Emoji: &emoji.Component{Name: "📉"}, - }, - }, + MenuType: types.SelectMenuChannel, + CustomID: config.ModifyDisChannel, + Placeholder: "Pas de salons désactivé", + MinValues: &zero, + MaxValues: 25, + DefaultValues: disChansDefault, + }, + }, + }, + &component.Section{ + Components: []component.Message{ + &component.TextDisplay{Content: "**Rôles de niveau**\n" + roles}, + }, + Accessory: &component.Button{ + Label: "Modifier", + Style: component.ButtonStyleSecondary, + CustomID: config.ModifyXpRole, + }, + }, + &component.Section{ + Components: []component.Message{ + &component.TextDisplay{ + Content: fmt.Sprintf("**Jours avant la réduction**\n-# Seule l'expérience gagnée les x derniers jours est comptabilisée dans le niveau par défaut\n%d jours", cfg.DaysXPRemains), }, }, + Accessory: &component.Button{ + Label: "Modifier", + Style: component.ButtonStyleSecondary, + CustomID: config.ModifyTimeReduce, + }, }, }, }, @@ -121,16 +134,31 @@ func ConfigCommand( } func ConfigMessageComponent( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, _ *cmd.ResponseBuilder, ) { response := ConfigResponse(i) response.Type = types.InteractionResponseUpdateMessage - err := session.InteractionAPI().Respond(i.Interaction, response) + err := s.InteractionAPI().Respond(i.Interaction, response) + + if err != nil { + s.LogError(err, "sending config") + } +} + +func ConfigModal( + s *discordgo.Session, + i *discordgo.InteractionCreate, + _ *interaction.ModalSubmitData, + resp *cmd.ResponseBuilder, +) { + response := ConfigResponse(i) + response.Type = types.InteractionResponseUpdateMessage + err := s.InteractionAPI().Respond(i.Interaction, response) if err != nil { - session.LogError(err, "sending config") + s.LogError(err, "sending config") } } diff --git a/config/channel.go b/config/channel.go index c918810..723ec38 100644 --- a/config/channel.go +++ b/config/channel.go @@ -5,12 +5,12 @@ import ( "github.com/anhgelus/gokord/cmd" discordgo "github.com/nyttikord/gokord" + "github.com/nyttikord/gokord/interaction" ) const ( ModifyFallbackChannel = "fallback_channel" - FallbackChannelSet = "fallback_channel_set" ModifyDisChannel = "disabled_channel" DisChannelAdd = "disabled_channel_add" @@ -19,108 +19,28 @@ const ( DisChannelDelSet = "disabled_channel_del_set" ) -func HandleModifyFallbackChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ *interaction.MessageComponentData, _ *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(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() - +func HandleModifyFallbackChannel(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) bool { cfg := GetGuildConfig(i.GuildID) - channelID := data.Values[0] - + var channelID string + if len(data.Values) > 0 { + channelID = data.Values[0] + } cfg.FallbackChannel = channelID err := cfg.Save() if err != nil { - s.LogError(err, "saving fallback channel") - if err = resp.SetMessage("Erreur lors de la sauvegarde du salon").Send(); err != nil { - s.LogError(err, "sending error while saving channel") - } - return - } - if err = resp.SetMessage("Salon sauvegardé.").Send(); err != nil { - s.LogError(err, "sending channel saved") + s.LogError(err, "Saving fallback channel") + return false } + return true } -func HandleModifyDisChannel(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ *interaction.MessageComponentData, _ *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 *interaction.MessageComponentData, 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 *interaction.MessageComponentData, 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(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { - resp.IsEphemeral() +func HandleModifyDisChannel(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) bool { 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 { - s.LogError(err, "sending channel not disabled") - } - return - } - cfg.DisabledChannels = strings.ReplaceAll(cfg.DisabledChannels, id+";", "") - if err := cfg.Save(); err != nil { - s.LogError(err, "saving config disable del") - if err = resp.SetMessage("Il y a eu une erreur lors de la modification de la base de données.").Send(); err != nil { - s.LogError(err, "sending error while saving config") - } - } - if err := resp.SetMessage("Modification sauvegardé.").Send(); err != nil { - s.LogError(err, "modification saved message disable del") + cfg.DisabledChannels = strings.Join(data.Values, ";") + err := cfg.Save() + if err != nil { + s.LogError(err, "Unable to save disabled channel") + return false } + return true } diff --git a/config/guild.go b/config/guild.go index 6310fa4..9cdb7e4 100644 --- a/config/guild.go +++ b/config/guild.go @@ -4,6 +4,7 @@ import ( "strings" "github.com/anhgelus/gokord" + discordgo "github.com/nyttikord/gokord" ) type GuildConfig struct { @@ -31,8 +32,27 @@ func (cfg *GuildConfig) Save() error { return gokord.DB.Save(cfg).Error } -func (cfg *GuildConfig) IsDisabled(channelID string) bool { - return strings.Contains(cfg.DisabledChannels, channelID) +func (cfg *GuildConfig) IsDisabled(s *discordgo.Session, channelID string) bool { + ok := true + for channelID != "" && ok { + ok = !strings.Contains(cfg.DisabledChannels, channelID) + c, err := s.State.Channel(channelID) + if err != nil { + s.LogError(err, "Unable to find channel %s in state", c) + c, err = s.ChannelAPI().Channel(channelID) + if err == nil { + s.State.ChannelAdd(c) + } else { + s.LogError(err, "Unable to fetch channel %s", s) + return false + } + } + if err != nil { + return false + } + channelID = c.ParentID + } + return !ok } func (cfg *GuildConfig) FindXpRole(roleID string) (int, *XpRole) { diff --git a/config/xp_reduce.go b/config/xp_reduce.go index a61ef1a..bf04bf0 100644 --- a/config/xp_reduce.go +++ b/config/xp_reduce.go @@ -1,8 +1,13 @@ package config import ( + "fmt" + "strconv" + "github.com/anhgelus/gokord/cmd" discordgo "github.com/nyttikord/gokord" + "github.com/nyttikord/gokord/component" + "github.com/nyttikord/gokord/discord/types" "github.com/nyttikord/gokord/interaction" ) @@ -11,47 +16,61 @@ const ( TimeReduceSet = "time_reduce_set" ) -func HandleModifyPeriodicReduce(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ *interaction.MessageComponentData, 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 HandleModifyPeriodicReduceCommand(s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { + cfg := GetGuildConfig(i.GuildID) + response := interaction.Response{ + Type: types.InteractionResponseModal, + Data: &interaction.ResponseData{ + CustomID: TimeReduceSet, + Title: "Modifier la durée de l'expérience", + Components: []component.Component{ + // TODO: When gokord supports it, enable this description again + // &component.TextDisplay{ + // Content: "Seul l'expérience gagnée sur cette période sera comptabilisée dans le niveau par défaut", + // }, + &component.Label{ + Label: "Durée en jours", + Component: &component.TextInput{ + CustomID: TimeReduceSet, + MinLength: 1, + MaxLength: 3, + Style: component.TextInputShort, + Placeholder: "Durée en jours", + Value: fmt.Sprintf("%d", cfg.DaysXPRemains), + }, + }, + }, + }, + } + err := s.InteractionAPI().Respond(i.Interaction, &response) + if err != nil { + s.LogError(err, "Sending xp reduce modal") + } } -func HandleTimeReduceSet(_ *discordgo.Session, _ *discordgo.InteractionCreate, _ *interaction.ModalSubmitData, _ *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()) - //} +func HandleTimeReduceSet(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder) bool { + v := data.Components[0].(*component.Label).Component.(*component.TextInput).Value + days, err := strconv.Atoi(v) + if err != nil { + err = resp.IsEphemeral().SetMessage(fmt.Sprintf("La valeur indiquée, `%s`, c'est pas un entier.", v)).Send() + if err != nil { + s.LogError(err, "Sending bad input message") + } + return false + } + if days < 30 { + err = resp.IsEphemeral().SetMessage("Le nombre de jours doit être suppérieur à 30.").Send() + if err != nil { + s.LogError(err, "Sending less than 30 days message") + } + return false + } + cfg := GetGuildConfig(i.GuildID) + cfg.DaysXPRemains = uint(days) + err = cfg.Save() + if err != nil { + s.LogError(err, "Saving DaysXPRemains configuration") + return false + } + return true } diff --git a/config/xp_role.go b/config/xp_role.go index 72af42b..d55e6d3 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "slices" "strconv" "git.anhgelus.world/anhgelus/les-copaings-bot/exp" @@ -33,7 +34,7 @@ const ( ) func HandleXpRole( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, _ *cmd.ResponseBuilder, @@ -42,9 +43,13 @@ func HandleXpRole( container := component.Container{ Components: []component.Message{ &component.TextDisplay{Content: "## Configuration / Rôles de niveaux"}, + &component.TextDisplay{Content: "Ces rôles seront donnés et retirés en fonction du niveau de chacun"}, &component.Separator{}, }, } + slices.SortFunc(cfg.XpRoles, func(xp1, xp2 XpRole) int { + return int(xp2.XP) - int(xp1.XP) + }) for _, r := range cfg.XpRoles { container.Components = append(container.Components, &component.Section{ Components: []component.Message{ @@ -84,14 +89,14 @@ func HandleXpRole( Flags: channel.MessageFlagsIsComponentsV2, }, } - err := session.InteractionAPI().Respond(i.Interaction, response) + err := s.InteractionAPI().Respond(i.Interaction, response) if err != nil { - session.LogError(err, "Sending config") + s.LogError(err, "Sending config") } } func HandleXpRoleNew( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, _ *cmd.ResponseBuilder, @@ -126,14 +131,14 @@ func HandleXpRoleNew( }, }, } - err := session.InteractionAPI().Respond(i.Interaction, response) + err := s.InteractionAPI().Respond(i.Interaction, response) if err != nil { - session.LogError(err, "Sending modal to add") + s.LogError(err, "Sending modal to add") } } func HandleXpRoleEdit( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, parameters []string, resp *cmd.ResponseBuilder, @@ -141,12 +146,12 @@ func HandleXpRoleEdit( config := GetGuildConfig(i.GuildID) id, err := getRoleLevelID(parameters) if err != nil { - session.LogError(err, "Reading dynamic CustomID") + s.LogError(err, "Reading dynamic CustomID") return } _, role := config.FindXpRoleID(id) if role == nil { - HandleXpRole(session, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) return } @@ -191,28 +196,28 @@ func HandleXpRoleEdit( }, } - err = session.InteractionAPI().Respond(i.Interaction, response) + err = s.InteractionAPI().Respond(i.Interaction, response) if err != nil { - session.LogError(err, "Sending xp_role config") + s.LogError(err, "Sending xp_role config") } } func HandleXpRoleEditRole( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, parameters []string, resp *cmd.ResponseBuilder, ) { id, err := getRoleLevelID(parameters) if err != nil { - session.LogError(err, "Reading dynamic CustomID") + s.LogError(err, "Reading dynamic CustomID") return } role := data.Values[0] cfg := GetGuildConfig(i.GuildID) - _, xprole := cfg.FindXpRoleID(id) - if xprole == nil { - err = session.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + _, xpRole := cfg.FindXpRoleID(id) + if xpRole == nil { + err = s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -220,20 +225,20 @@ func HandleXpRoleEditRole( }, }) if err != nil { - session.LogError(err, "Sending unable to get role message") + s.LogError(err, "Sending unable to get role message") } return } - xprole.RoleID = role - err = gokord.DB.Save(xprole).Error + xpRole.RoleID = role + err = gokord.DB.Save(xpRole).Error if err != nil { - session.LogError(err, "Saving config guild_id %s, id %d, type add", i.GuildID, id) + s.LogError(err, "Saving config guild_id %s, id %d, type add", i.GuildID, id) } - HandleXpRoleEdit(session, i, &interaction.MessageComponentData{}, parameters, resp) + HandleXpRoleEdit(s, i, &interaction.MessageComponentData{}, parameters, resp) } func HandleXpRoleEditLevelStart( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, parameters []string, @@ -241,13 +246,13 @@ func HandleXpRoleEditLevelStart( ) { id, err := getRoleLevelID(parameters) if err != nil { - session.LogError(err, "Reading dynamic CustomID") + s.LogError(err, "Reading dynamic CustomID") return } cfg := GetGuildConfig(i.GuildID) - _, role := cfg.FindXpRoleID(id) - if role == nil { - err = session.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + _, xpRole := cfg.FindXpRoleID(id) + if xpRole == nil { + err = s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -255,7 +260,7 @@ func HandleXpRoleEditLevelStart( }, }) if err != nil { - session.LogError(err, "Sending Unable to get role message") + s.LogError(err, "Sending Unable to get role message") } return } @@ -274,20 +279,20 @@ func HandleXpRoleEditLevelStart( MinLength: 1, MaxLength: 5, Placeholder: "5", - Value: strconv.FormatUint(uint64(exp.Level(role.XP)), 10), + Value: strconv.FormatUint(uint64(exp.Level(xpRole.XP)), 10), }, }, }, }, } - err = session.InteractionAPI().Respond(i.Interaction, response) + err = s.InteractionAPI().Respond(i.Interaction, response) if err != nil { - session.LogError(err, "Sending Edit level modal") + s.LogError(err, "Sending Edit level modal") } } func HandleXpRoleEditLevel( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.ModalSubmitData, parameters []string, @@ -295,7 +300,7 @@ func HandleXpRoleEditLevel( ) { id, err := getRoleLevelID(parameters) if err != nil { - session.LogError(err, "Reading dynamic CustomID") + s.LogError(err, "Reading dynamic CustomID") return } @@ -309,16 +314,16 @@ func HandleXpRoleEditLevel( ). Send() if err != nil { - session.LogError(err, "Sending bad number warning message") + s.LogError(err, "Sending bad number warning message") } return } xp := exp.LevelXP(uint(level)) cfg := GetGuildConfig(i.GuildID) - _, xprole := cfg.FindXpRoleID(id) - if xprole == nil { - err = session.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + _, xpRole := cfg.FindXpRoleID(id) + if xpRole == nil { + err = s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -326,20 +331,20 @@ func HandleXpRoleEditLevel( }, }) if err != nil { - session.LogError(err, "Sending unable to modify role message") + s.LogError(err, "Sending unable to modify role message") } return } - xprole.XP = xp - err = gokord.DB.Save(xprole).Error + xpRole.XP = xp + err = gokord.DB.Save(xpRole).Error if err != nil { - session.LogError(err, "Saving config guild_id %s, id %d, type add", i.GuildID, id) + s.LogError(err, "Saving config guild_id %s, id %d, type add", i.GuildID, id) } - HandleXpRoleEdit(session, i, &interaction.MessageComponentData{}, parameters, resp) + HandleXpRoleEdit(s, i, &interaction.MessageComponentData{}, parameters, resp) } func HandleXpRoleDel( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, _ *interaction.MessageComponentData, dynamicValues []string, @@ -347,13 +352,13 @@ func HandleXpRoleDel( ) { id, err := getRoleLevelID(dynamicValues) if err != nil { - session.LogError(err, "reading dynamic CustomID") + s.LogError(err, "reading dynamic CustomID") return } cfg := GetGuildConfig(i.GuildID) _, role := cfg.FindXpRoleID(id) if role == nil { - err := session.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Content: "Rôle introuvable. Peut-être a-t-il déjà été supprimé ?", @@ -361,20 +366,20 @@ func HandleXpRoleDel( }, }) if err != nil { - session.LogError(err, "Sending role not found message") + s.LogError(err, "Sending role not found message") } return } err = gokord.DB.Delete(role).Error if err != nil { - session.LogError(err, "Deleting entry guild_id %s, id %d, type del", i.GuildID, id) + s.LogError(err, "Deleting entry guild_id %s, id %d, type del", i.GuildID, id) } - HandleXpRole(session, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) } func HandleXpRoleAdd( - session *discordgo.Session, + s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder, @@ -389,7 +394,7 @@ func HandleXpRoleAdd( ). Send() if err != nil { - session.LogError(err, "sending bad number warning message") + s.LogError(err, "sending bad number warning message") } return } @@ -404,11 +409,11 @@ func HandleXpRoleAdd( }) err = cfg.Save() if err != nil { - session.LogError(err, "saving config for role %s in %s", roleId, i.GuildID) + s.LogError(err, "saving config for role %s in %s", roleId, i.GuildID) return } - HandleXpRole(session, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) } func getRoleLevelID(dynamic []string) (uint, error) { @@ -27,7 +27,7 @@ func OnMessage(s *discordgo.Session, m *discordgo.MessageCreate) { return } cfg := config.GetGuildConfig(m.GuildID) - if cfg.IsDisabled(m.ChannelID) { + if cfg.IsDisabled(s, m.ChannelID) { return } c := user.GetCopaing(m.Author.ID, m.GuildID) @@ -48,13 +48,13 @@ func OnVoiceUpdate(s *discordgo.Session, e *discordgo.VoiceStateUpdate) { return } cfg := config.GetGuildConfig(e.GuildID) - if (e.BeforeUpdate == nil || cfg.IsDisabled(e.BeforeUpdate.ChannelID)) && e.ChannelID != "" { - if cfg.IsDisabled(e.ChannelID) { + if (e.BeforeUpdate == nil || cfg.IsDisabled(s, e.BeforeUpdate.ChannelID)) && e.ChannelID != "" { + if cfg.IsDisabled(s, e.ChannelID) { return } onConnection(s, e) - } else if e.BeforeUpdate != nil && (e.ChannelID == "" || cfg.IsDisabled(e.ChannelID)) { - if cfg.IsDisabled(e.BeforeUpdate.ChannelID) { + } else if e.BeforeUpdate != nil && (e.ChannelID == "" || cfg.IsDisabled(s, e.ChannelID)) { + if cfg.IsDisabled(s, e.BeforeUpdate.ChannelID) { return } onDisconnect(s, e) @@ -235,25 +235,6 @@ func main() { } // interaction: /config - bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { - if len(data.Values) != 1 { - bot.LogError(errors.New("invalid data values"), "handle config modify, values: %#v", data.Values) - return - } - switch data.Values[0] { - case config.ModifyXpRole: - config.HandleXpRole(s, i, data, resp) - case config.ModifyFallbackChannel: - config.HandleModifyFallbackChannel(s, i, data, resp) - case config.ModifyDisChannel: - config.HandleModifyDisChannel(s, i, data, resp) - case config.ModifyTimeReduce: - config.HandleModifyPeriodicReduce(s, i, data, resp) - default: - bot.LogError(errors.New("unknown value"), "detecting value %s", data.Values[0]) - return - } - }, commands.ConfigModify) bot.HandleMessageComponent(commands.ConfigMessageComponent, commands.OpenConfig) // xp role related bot.HandleMessageComponent(config.HandleXpRole, config.ModifyXpRole) @@ -265,13 +246,23 @@ func main() { handleDynamicModalComponent(&bot, config.HandleXpRoleEditLevel, config.XpRoleEditLevelPattern) handleDynamicMessageComponent(&bot, config.HandleXpRoleDel, config.XpRoleDel) // channel related - bot.HandleMessageComponent(config.HandleFallbackChannelSet, config.FallbackChannelSet) - bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelAdd) - bot.HandleMessageComponent(config.HandleDisChannel, config.DisChannelDel) - bot.HandleMessageComponent(config.HandleDisChannelAddSet, config.DisChannelAddSet) - bot.HandleMessageComponent(config.HandleDisChannelDelSet, config.DisChannelDelSet) + bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { + if config.HandleModifyFallbackChannel(s, i, data, resp) { + commands.ConfigMessageComponent(s, i, data, resp) + } + }, config.ModifyFallbackChannel) + bot.HandleMessageComponent(func(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { + if config.HandleModifyDisChannel(s, i, data, resp) { + commands.ConfigMessageComponent(s, i, data, resp) + } + }, config.ModifyDisChannel) // reduce related - bot.HandleModal(config.HandleTimeReduceSet, config.TimeReduceSet) + bot.HandleMessageComponent(config.HandleModifyPeriodicReduceCommand, config.ModifyTimeReduce) + bot.HandleModal(func(s *discordgo.Session, i *discordgo.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder) { + if config.HandleTimeReduceSet(s, i, data, resp) { + commands.ConfigModal(s, i, data, resp) + } + }, config.TimeReduceSet) // xp handlers bot.AddHandler(OnMessage) |
