diff options
| -rw-r--r-- | commands/config.go | 44 | ||||
| -rw-r--r-- | config/channel.go | 17 | ||||
| -rw-r--r-- | config/xp_reduce.go | 72 | ||||
| -rw-r--r-- | config/xp_role.go | 205 | ||||
| -rw-r--r-- | dynamicid/handling.go | 67 | ||||
| -rw-r--r-- | main.go | 76 | ||||
| -rw-r--r-- | rolereact/manager.go | 43 | ||||
| -rw-r--r-- | rolereact/rolereact.go | 302 | ||||
| -rw-r--r-- | rolereact/views.go | 38 |
9 files changed, 357 insertions, 507 deletions
diff --git a/commands/config.go b/commands/config.go index 336e66a..1878bdb 100644 --- a/commands/config.go +++ b/commands/config.go @@ -1,18 +1,17 @@ package commands import ( + "context" "fmt" "slices" "strings" "git.anhgelus.world/anhgelus/les-copaings-bot/config" "git.anhgelus.world/anhgelus/les-copaings-bot/exp" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) @@ -21,8 +20,8 @@ const ( OpenConfig = "config" ) -func ConfigResponse(i *event.InteractionCreate) *interaction.Response { - cfg := config.GetGuildConfig(i.GuildID) +func ConfigResponse(guildID string) *interaction.Response { + cfg := config.GetGuildConfig(guildID) roles := "" l := len(cfg.XpRoles) - 1 slices.SortFunc(cfg.XpRoles, func(xp1, xp2 config.XpRole) int { @@ -121,45 +120,30 @@ func ConfigResponse(i *event.InteractionCreate) *interaction.Response { } } -func ConfigCommand( - s bot.Session, - i *event.InteractionCreate, - _ cmd.OptionMap, - resp *cmd.ResponseBuilder, -) { - err := s.InteractionAPI().Respond(i.Interaction, ConfigResponse(i)) +func ConfigCommand(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + err := dg.InteractionAPI().Respond(i.Interaction, ConfigResponse(i.GuildID)) if err != nil { - s.Logger().Error("sending config", "error", err) + bot.Logger(ctx).Error("sending config", "error", err) } } -func ConfigMessageComponent( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - _ *cmd.ResponseBuilder, -) { - response := ConfigResponse(i) +func ConfigMessageComponent(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { + response := ConfigResponse(i.GuildID) response.Type = types.InteractionResponseUpdateMessage - err := s.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i.Interaction, response) if err != nil { - s.Logger().Error("sending config", "error", err) + bot.Logger(ctx).Error("sending config", "error", err) } } -func ConfigModal( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.ModalSubmitData, - _ *cmd.ResponseBuilder, -) { - response := ConfigResponse(i) +func ConfigModal(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit) { + response := ConfigResponse(i.GuildID) response.Type = types.InteractionResponseUpdateMessage - err := s.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i.Interaction, response) if err != nil { - s.Logger().Error("sending config", "error", err) + bot.Logger(ctx).Error("sending config", "error", err) } } diff --git a/config/channel.go b/config/channel.go index 0c25b25..6086f09 100644 --- a/config/channel.go +++ b/config/channel.go @@ -1,11 +1,10 @@ package config import ( + "context" "strings" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) @@ -20,27 +19,27 @@ const ( DisChannelDelSet = "disabled_channel_del_set" ) -func HandleModifyFallbackChannel(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, _ *cmd.ResponseBuilder) bool { +func HandleModifyFallbackChannel(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) bool { cfg := GetGuildConfig(i.GuildID) var channelID string - if len(data.Values) > 0 { - channelID = data.Values[0] + if len(i.Data.Values) > 0 { + channelID = i.Data.Values[0] } cfg.FallbackChannel = channelID err := cfg.Save() if err != nil { - s.Logger().Error("saving fallback channel", "error", err) + bot.Logger(ctx).Error("saving fallback channel", "error", err) return false } return true } -func HandleModifyDisChannel(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, _ *cmd.ResponseBuilder) bool { +func HandleModifyDisChannel(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) bool { cfg := GetGuildConfig(i.GuildID) - cfg.DisabledChannels = strings.Join(data.Values, ";") + cfg.DisabledChannels = strings.Join(i.Data.Values, ";") err := cfg.Save() if err != nil { - s.Logger().Error("unable to save disabled channel", "error", err) + bot.Logger(ctx).Error("unable to save disabled channel", "error", err) return false } return true diff --git a/config/xp_reduce.go b/config/xp_reduce.go index 389043d..f8f8d95 100644 --- a/config/xp_reduce.go +++ b/config/xp_reduce.go @@ -1,14 +1,12 @@ package config import ( + "context" "fmt" "strconv" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/component" - "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) @@ -17,52 +15,54 @@ const ( TimeReduceSet = "time_reduce_set" ) -func HandleModifyPeriodicReduceCommand(s bot.Session, i *event.InteractionCreate, _ *interaction.MessageComponentData, _ *cmd.ResponseBuilder) { +func HandleModifyPeriodicReduceCommand(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { 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), - }, - }, + resp := interaction.NewModalResponse(). + CustomID(TimeReduceSet). + Title("Modifier la durée de l'expérience"). + AddComponent(&component.TextDisplay{ + Content: "Seul l'expérience gagnée sur cette période sera comptabilisée dans le niveau par défaut", + }). + AddComponent(&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) + }). + Response() + err := dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending xp reduce modal", "error", err) + bot.Logger(ctx).Error("sending xp reduce modal", "error", err) } } -func HandleTimeReduceSet(s bot.Session, i *event.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder) bool { - v := data.Components[0].(*component.Label).Component.(*component.TextInput).Value +func HandleTimeReduceSet(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit) bool { + v := i.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() + resp := interaction.NewMessageResponse(). + IsEphemeral(). + Message(fmt.Sprintf("La valeur indiquée, `%s`, c'est pas un entier.", v)). + Response() + err = dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending bad input message", "error", err) + bot.Logger(ctx).Error("sending bad input message", "error", err) } return false } if days < 30 { - err = resp.IsEphemeral().SetMessage("Le nombre de jours doit être suppérieur à 30.").Send() + resp := interaction.NewMessageResponse(). + IsEphemeral(). + Message("Le nombre de jours doit être suppérieur à 30."). + Response() + err = dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending less than 30 days message", "error", err) + bot.Logger(ctx).Error("sending less than 30 days message", "error", err) } return false } @@ -70,7 +70,7 @@ func HandleTimeReduceSet(s bot.Session, i *event.InteractionCreate, data *intera cfg.DaysXPRemains = uint(days) err = cfg.Save() if err != nil { - s.Logger().Error("saving DaysXPRemains configuration", "error", err) + bot.Logger(ctx).Error("saving DaysXPRemains configuration", "error", err) return false } return true diff --git a/config/xp_role.go b/config/xp_role.go index 2feab59..76389c9 100644 --- a/config/xp_role.go +++ b/config/xp_role.go @@ -1,6 +1,7 @@ package config import ( + "context" "fmt" "slices" "strconv" @@ -8,12 +9,10 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/dynamicid" "git.anhgelus.world/anhgelus/les-copaings-bot/exp" "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) @@ -39,12 +38,7 @@ const ( XpRoleDel = `xp_role_del` ) -func HandleXpRole( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - _ *cmd.ResponseBuilder, -) { +func HandleXpRole(ctx context.Context, dg bot.Session, i *interaction.Interaction) { cfg := GetGuildConfig(i.GuildID) container := component.Container{ Components: []component.Message{ @@ -95,65 +89,50 @@ func HandleXpRole( Flags: channel.MessageFlagsIsComponentsV2, }, } - err := s.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i, response).Do(ctx) if err != nil { - s.Logger().Error("sending config", "error", err) + bot.Logger(ctx).Error("sending config", "error", err) } } -func HandleXpRoleNew( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - _ *cmd.ResponseBuilder, -) { +func HandleXpRoleNew(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { one := 1 - response := &interaction.Response{ - Type: types.InteractionResponseModal, - Data: &interaction.ResponseData{ - Title: "Nouveau rôle de niveau", - CustomID: XpRoleAdd, - Components: []component.Component{ - &component.Label{ - Label: "Niveau", - Component: &component.TextInput{ - CustomID: "level", - Style: component.TextInputShort, - Placeholder: "5", - MinLength: 1, - MaxLength: 5, - Required: true, - }, - }, - &component.Label{ - Label: "Rôle", - Component: &component.SelectMenu{ - MenuType: types.SelectMenuRole, - CustomID: "role", - MinValues: &one, - MaxValues: one, - }, - }, + resp := interaction.NewModalResponse(). + Title("Nouveau rôle de niveau"). + CustomID(XpRoleAdd). + AddComponent(&component.Label{ + Label: "Niveau", + Component: &component.TextInput{ + CustomID: "level", + Style: component.TextInputShort, + Placeholder: "5", + MinLength: 1, + MaxLength: 5, + Required: true, }, - }, - } - err := s.InteractionAPI().Respond(i.Interaction, response) + }). + AddComponent(&component.Label{ + Label: "Rôle", + Component: &component.SelectMenu{ + MenuType: types.SelectMenuRole, + CustomID: "role", + MinValues: &one, + MaxValues: one, + }, + }). + Response() + err := dg.InteractionAPI().Respond(i.Interaction, resp) if err != nil { - s.Logger().Error("sending modal to add", "error", err) + bot.Logger(ctx).Error("sending modal to add", "error", err) } } -func HandleXpRoleEdit( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - parameters *XpRoleId, resp *cmd.ResponseBuilder, -) { +func HandleXpRoleEdit(ctx context.Context, dg bot.Session, i *interaction.Interaction, params *XpRoleId) { config := GetGuildConfig(i.GuildID) - id := parameters.ID + id := params.ID _, role := config.FindXpRoleID(id) if role == nil { - HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(ctx, dg, i) return } @@ -202,24 +181,19 @@ func HandleXpRoleEdit( }, } - err := s.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i, response) if err != nil { - s.Logger().Error("sending xp_role config", "error", err) + bot.Logger(ctx).Error("sending xp_role config", "error", err) } } -func HandleXpRoleEditRole( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *XpRoleId, resp *cmd.ResponseBuilder, -) { - id := parameters.ID - role := data.Values[0] +func HandleXpRoleEditRole(ctx context.Context, dg bot.Session, i *interaction.MessageComponent, params *XpRoleId) { + id := params.ID + role := i.Data.Values[0] cfg := GetGuildConfig(i.GuildID) _, xpRole := cfg.FindXpRoleID(id) if xpRole == nil { - err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + err := dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -227,30 +201,24 @@ func HandleXpRoleEditRole( }, }) if err != nil { - s.Logger().Error("sending unable to get role message", "error", err) + bot.Logger(ctx).Error("sending unable to get role message", "error", err) } return } xpRole.RoleID = role err := gokord.DB.Save(xpRole).Error if err != nil { - s.Logger().Error("saving config", "error", err, "guild", i.GuildID, "id", id, "type", "add") + bot.Logger(ctx).Error("saving config", "error", err, "guild", i.GuildID, "id", id, "type", "add") } - HandleXpRoleEdit(s, i, &interaction.MessageComponentData{}, parameters, resp) + HandleXpRoleEdit(ctx, dg, i.Interaction, params) } -func HandleXpRoleEditLevelStart( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - parameters *XpRoleId, - _ *cmd.ResponseBuilder, -) { - id := parameters.ID +func HandleXpRoleEditLevelStart(ctx context.Context, dg bot.Session, i *interaction.MessageComponent, params *XpRoleId) { + id := params.ID cfg := GetGuildConfig(i.GuildID) _, xpRole := cfg.FindXpRoleID(id) if xpRole == nil { - err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + err := dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -258,7 +226,7 @@ func HandleXpRoleEditLevelStart( }, }) if err != nil { - s.Logger().Error("sending unable to get role message", "error", err) + bot.Logger(ctx).Error("sending unable to get role message", "error", err) } return } @@ -283,31 +251,25 @@ func HandleXpRoleEditLevelStart( }, }, } - err := s.InteractionAPI().Respond(i.Interaction, response) + err := dg.InteractionAPI().Respond(i.Interaction, response) if err != nil { - s.Logger().Error("sending edit level modal", "error", err) + bot.Logger(ctx).Error("sending edit level modal", "error", err) } } -func HandleXpRoleEditLevel( - s bot.Session, - i *event.InteractionCreate, - data *interaction.ModalSubmitData, - parameters *XpRoleId, - resp *cmd.ResponseBuilder, -) { - id := parameters.ID +func HandleXpRoleEditLevel(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit, params *XpRoleId) { + id := params.ID - levelInput := data.Components[0].(*component.Label).Component.(*component.TextInput) + levelInput := i.Data.Components[0].(*component.Label).Component.(*component.TextInput) level, err := strconv.Atoi(levelInput.Value) if err != nil || level < 0 { - err = resp.IsEphemeral(). - SetMessage( - fmt.Sprintf("Le niveau doit être un nombre entier positif.\n-# Trouvé : %s", levelInput.Value), - ). - Send() + resp := interaction.NewMessageResponse(). + IsEphemeral(). + Message(fmt.Sprintf("Le niveau doit être un nombre entier positif.\n-# Trouvé : %s", levelInput.Value)). + Response() + err = dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending bad number warning message", "error", err) + bot.Logger(ctx).Error("sending bad number warning message", "error", err) } return } @@ -316,38 +278,32 @@ func HandleXpRoleEditLevel( cfg := GetGuildConfig(i.GuildID) _, xpRole := cfg.FindXpRoleID(id) if xpRole == nil { - err = s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + err = dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, Content: "Impossible de modifier le rôle. Peut-être a-t-il été supprimé ?", }, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("sending unable to modify role message", "error", err) + bot.Logger(ctx).Error("sending unable to modify role message", "error", err) } return } xpRole.XP = xp err = gokord.DB.Save(xpRole).Error if err != nil { - s.Logger().Error("saving config", "guild", i.GuildID, "id", id, "type", "edit") + bot.Logger(ctx).Error("saving config", "guild", i.GuildID, "id", id, "type", "edit") } - HandleXpRoleEdit(s, i, &interaction.MessageComponentData{}, parameters, resp) + HandleXpRoleEdit(ctx, dg, i.Interaction, params) } -func HandleXpRoleDel( - s bot.Session, - i *event.InteractionCreate, - _ *interaction.MessageComponentData, - parameters *XpRoleId, - resp *cmd.ResponseBuilder, -) { +func HandleXpRoleDel(ctx context.Context, dg bot.Session, i *interaction.MessageComponent, parameters *XpRoleId) { id := parameters.ID cfg := GetGuildConfig(i.GuildID) _, role := cfg.FindXpRoleID(id) if role == nil { - err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ + err := dg.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é ?", @@ -355,41 +311,36 @@ func HandleXpRoleDel( }, }) if err != nil { - s.Logger().Error("sending role not found message", "error", err) + bot.Logger(ctx).Error("sending role not found message", "error", err) } return } err := gokord.DB.Delete(role).Error if err != nil { - s.Logger().Error("deleting entry", "error", err, "guild", i.GuildID, "id", id, "type", "del") + bot.Logger(ctx).Error("deleting entry", "error", err, "guild", i.GuildID, "id", id, "type", "del") } - HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(ctx, dg, i.Interaction) } -func HandleXpRoleAdd( - s bot.Session, - i *event.InteractionCreate, - data *interaction.ModalSubmitData, - resp *cmd.ResponseBuilder, -) { - levelInput := data.Components[0].(*component.Label).Component.(*component.TextInput) +func HandleXpRoleAdd(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit) { + levelInput := i.Data.Components[0].(*component.Label).Component.(*component.TextInput) in, err := strconv.Atoi(levelInput.Value) if err != nil || in < 0 { - err = resp.IsEphemeral(). - SetMessage( - fmt.Sprintf("Le niveau doit être un nombre entier positif.\n-# Trouvé : %s", levelInput.Value), - ). - Send() + resp := interaction.NewMessageResponse(). + IsEphemeral(). + Message(fmt.Sprintf("Le niveau doit être un nombre entier positif.\n-# Trouvé : %s", levelInput.Value)). + Response() + err = dg.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("sending bad number warning message", "error", err) + bot.Logger(ctx).Error("sending bad number warning message", "error", err) } return } xp := exp.LevelXP(uint(in)) - roleId := data.Components[1].(*component.Label).Component.(*component.SelectMenu).Values[0] + roleId := i.Data.Components[1].(*component.Label).Component.(*component.SelectMenu).Values[0] cfg := GetGuildConfig(i.GuildID) cfg.XpRoles = append(cfg.XpRoles, XpRole{ @@ -398,9 +349,9 @@ func HandleXpRoleAdd( }) err = cfg.Save() if err != nil { - s.Logger().Error("saving config", "error", err, "role", roleId, "guild", i.GuildID) + bot.Logger(ctx).Error("saving config", "error", err, "role", roleId, "guild", i.GuildID) return } - HandleXpRole(s, i, &interaction.MessageComponentData{}, resp) + HandleXpRole(ctx, dg, i.Interaction) } diff --git a/dynamicid/handling.go b/dynamicid/handling.go index e43d658..08d1620 100644 --- a/dynamicid/handling.go +++ b/dynamicid/handling.go @@ -4,69 +4,60 @@ import ( "context" "strings" - "github.com/anhgelus/gokord" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/discord/types" "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) -func HandleDynamicMessageComponent[DynamicData any]( - b *gokord.Bot, - handler func( - bot.Session, - *event.InteractionCreate, - *interaction.MessageComponentData, - *DynamicData, *cmd.ResponseBuilder, - ), +func HandleDynamicMessageComponent[T any]( + events bot.EventManager, + handler func(context.Context, bot.Session, *interaction.MessageComponent, T), base string, ) { - b.AddHandler(func(_ context.Context, s bot.Session, i *event.InteractionCreate) { + events.AddHandler(func(ctx context.Context, dg bot.Session, i *event.InteractionCreate) { if i.Type != types.InteractionMessageComponent { return } - data := i.MessageComponentData() - if !strings.HasPrefix(data.CustomID, base+";") { + msg := i.MessageComponent() + cid := msg.Data.CustomID + if !strings.HasPrefix(cid, base+";") { return } - dynamicID := data.CustomID[len(base)+1:] - dynamicData := new(DynamicData) - err := UnmarshallCSV(dynamicID, dynamicData) + dynamicID := cid[len(base)+1:] + var dynamic T + err := UnmarshallCSV(dynamicID, dynamic) if err != nil { - s.Logger().Error("Unable to parse CustomID", "error", err, "CustomID", data.CustomID, "base", base) + bot.Logger(ctx).Error("Unable to parse CustomID", "error", err, "CustomID", cid, "base", base) return } - handler(s, i, data, dynamicData, cmd.NewResponseBuilder(s, i)) + handler(ctx, dg, msg, dynamic) }) } -func HandleDynamicModalComponent[DynamicData any]( - b *gokord.Bot, - handler func( - bot.Session, - *event.InteractionCreate, - *interaction.ModalSubmitData, - *DynamicData, - *cmd.ResponseBuilder, - ), +func HandleDynamicModalComponent[T any]( + events bot.EventManager, + handler func(context.Context, bot.Session, *interaction.ModalSubmit, T), base string, + ) { - b.AddHandler(func(_ context.Context, s bot.Session, i *event.InteractionCreate) { + events.AddHandler(func(ctx context.Context, dg bot.Session, i *event.InteractionCreate) { if i.Type != types.InteractionModalSubmit { return } - data := i.ModalSubmitData() - if strings.HasPrefix(data.CustomID, base+";") { - dynamicID := data.CustomID[len(base)+1:] - dynamicData := new(DynamicData) - err := UnmarshallCSV(dynamicID, dynamicData) - if err != nil { - s.Logger().Error("Unable to parse CustomID", "error", err, "CustomID", data.CustomID, "base", base) - return - } - handler(s, i, data, dynamicData, cmd.NewResponseBuilder(s, i)) + modal := i.ModalSubmit() + cid := modal.Data.CustomID + if !strings.HasPrefix(cid, base+";") { + return + } + dynamicID := cid[len(base)+1:] + var dynamic T + err := UnmarshallCSV(dynamicID, dynamic) + if err != nil { + bot.Logger(ctx).Error("Unable to parse CustomID", "error", err, "CustomID", cid, "base", base) + return } + handler(ctx, dg, modal, dynamic) }) } @@ -18,9 +18,8 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/exp" "git.anhgelus.world/anhgelus/les-copaings-bot/rolereact" "git.anhgelus.world/anhgelus/les-copaings-bot/user" - "github.com/anhgelus/gokord/cmd" _ "github.com/joho/godotenv/autoload" - discordgo "github.com/nyttikord/gokord" + "github.com/nyttikord/gokord" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/discord" "github.com/nyttikord/gokord/discord/types" @@ -150,13 +149,14 @@ func main() { if verbose { logLevel = slog.LevelDebug } - dg := discordgo.NewWithLogLevel("Bot "+token, logLevel) + dg := gokord.NewWithLogLevel("Bot "+token, logLevel) dg.Identify.Intents = discord.IntentsAllWithoutPrivileged | discord.IntentsMessageContent | discord.IntentGuildMembers events := dg.EventManager() + intrs := dg.InteractionManager() events.AddHandler(ready) // related to rolereact @@ -202,46 +202,50 @@ func main() { }) events.AddHandler(rolereact.HandleReactionAdd) events.AddHandler(rolereact.HandleReactionRemove) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleModifyComponent, rolereact.OpenMessage) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleApplyMessage, rolereact.ApplyMessage) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleResetMessage, rolereact.ResetMessage) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleStartSetNote, rolereact.SetNote) - dynamicid.HandleDynamicModalComponent(&b, rolereact.HandleSetNote, rolereact.SetNote) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleNewRole, rolereact.NewRole) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleOpenRole, rolereact.OpenRole) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleSetRole, rolereact.SetRoleRoleID) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleSetReaction, rolereact.SetRoleReaction) - dynamicid.HandleDynamicMessageComponent(&b, rolereact.HandleDelRole, rolereact.DelRole) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleModifyComponent, rolereact.OpenMessage) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleApplyMessage, rolereact.ApplyMessage) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleResetMessage, rolereact.ResetMessage) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleStartSetNote, rolereact.SetNote) + dynamicid.HandleDynamicModalComponent(events, rolereact.HandleSetNote, rolereact.SetNote) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleNewRole, rolereact.NewRole) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleOpenRole, rolereact.OpenRole) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleSetRole, rolereact.SetRoleRoleID) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleSetReaction, rolereact.SetRoleReaction) + dynamicid.HandleDynamicMessageComponent(events, rolereact.HandleDelRole, rolereact.DelRole) // interaction: /config - b.HandleMessageComponent(commands.ConfigMessageComponent, commands.OpenConfig) + intrs.HandleMessageComponent(commands.OpenConfig, commands.ConfigMessageComponent) // xp role related - b.HandleMessageComponent(config.HandleXpRole, config.ModifyXpRole) - b.HandleMessageComponent(config.HandleXpRoleNew, config.XpRoleNew) - b.HandleModal(config.HandleXpRoleAdd, config.XpRoleAdd) - dynamicid.HandleDynamicMessageComponent(&b, config.HandleXpRoleEdit, config.XpRoleEdit) - dynamicid.HandleDynamicMessageComponent(&b, config.HandleXpRoleEditRole, config.XpRoleEditRole) - dynamicid.HandleDynamicMessageComponent(&b, config.HandleXpRoleEditLevelStart, config.XpRoleEditLevelStart) - dynamicid.HandleDynamicModalComponent(&b, config.HandleXpRoleEditLevel, config.XpRoleEditLevel) - dynamicid.HandleDynamicMessageComponent(&b, config.HandleXpRoleDel, config.XpRoleDel) + intrs.HandleMessageComponent(config.ModifyXpRole, func(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { + config.HandleXpRole(ctx, dg, i.Interaction) + }) + intrs.HandleMessageComponent(config.XpRoleNew, config.HandleXpRoleNew) + intrs.HandleModalSubmit(config.XpRoleAdd, config.HandleXpRoleAdd) + dynamicid.HandleDynamicMessageComponent(events, func(ctx context.Context, dg bot.Session, i *interaction.MessageComponent, params *config.XpRoleId) { + config.HandleXpRoleEdit(ctx, dg, i.Interaction, params) + }, config.XpRoleEdit) + dynamicid.HandleDynamicMessageComponent(events, config.HandleXpRoleEditRole, config.XpRoleEditRole) + dynamicid.HandleDynamicMessageComponent(events, config.HandleXpRoleEditLevelStart, config.XpRoleEditLevelStart) + dynamicid.HandleDynamicModalComponent(events, config.HandleXpRoleEditLevel, config.XpRoleEditLevel) + dynamicid.HandleDynamicMessageComponent(events, config.HandleXpRoleDel, config.XpRoleDel) // channel related - b.HandleMessageComponent(func(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { - if config.HandleModifyFallbackChannel(s, i, data, resp) { - commands.ConfigMessageComponent(s, i, data, resp) + intrs.HandleMessageComponent(config.ModifyFallbackChannel, func(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { + if config.HandleModifyFallbackChannel(ctx, dg, i) { + commands.ConfigMessageComponent(ctx, dg, i) } - }, config.ModifyFallbackChannel) - b.HandleMessageComponent(func(s bot.Session, i *event.InteractionCreate, data *interaction.MessageComponentData, resp *cmd.ResponseBuilder) { - if config.HandleModifyDisChannel(s, i, data, resp) { - commands.ConfigMessageComponent(s, i, data, resp) + }) + intrs.HandleMessageComponent(config.ModifyDisChannel, func(ctx context.Context, dg bot.Session, i *interaction.MessageComponent) { + if config.HandleModifyDisChannel(ctx, dg, i) { + commands.ConfigMessageComponent(ctx, dg, i) } - }, config.ModifyDisChannel) + }) // reduce related - b.HandleMessageComponent(config.HandleModifyPeriodicReduceCommand, config.ModifyTimeReduce) - b.HandleModal(func(s bot.Session, i *event.InteractionCreate, data *interaction.ModalSubmitData, resp *cmd.ResponseBuilder) { - if config.HandleTimeReduceSet(s, i, data, resp) { - commands.ConfigModal(s, i, data, resp) + intrs.HandleMessageComponent(config.ModifyTimeReduce, config.HandleModifyPeriodicReduceCommand) + intrs.HandleModalSubmit(config.TimeReduceSet, func(ctx context.Context, dg bot.Session, i *interaction.ModalSubmit) { + if config.HandleTimeReduceSet(ctx, dg, i) { + commands.ConfigModal(ctx, dg, i) } - }, config.TimeReduceSet) + }) // xp handlers events.AddHandler(OnMessage) @@ -275,7 +279,7 @@ func main() { } } -func setupTimers(ctx context.Context, dg *discordgo.Session) { +func setupTimers(ctx context.Context, dg *gokord.Session) { d := 24 * time.Hour debug := common.IsDebug(ctx) if debug { diff --git a/rolereact/manager.go b/rolereact/manager.go index 1288b33..ab268f2 100644 --- a/rolereact/manager.go +++ b/rolereact/manager.go @@ -13,6 +13,7 @@ import ( "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/emoji" "github.com/nyttikord/gokord/event" + "github.com/nyttikord/gokord/interaction" ) func MessageContent(message *config.RoleReactMessage) string { @@ -31,34 +32,28 @@ func MessageContent(message *config.RoleReactMessage) string { return content } -func ApplyMessageChange(s bot.Session, i *event.InteractionCreate, message *config.RoleReactMessage) string { +func ApplyMessageChange(ctx context.Context, s bot.Session, i *interaction.Interaction, message *config.RoleReactMessage) string { messageContent := MessageContent(message) - _, err := s.ChannelAPI().MessageEditComplex( - &channel.MessageEdit{ - Content: &messageContent, - AllowedMentions: &channel.MessageAllowedMentions{}, - Channel: message.ChannelID, - ID: message.MessageID, - }, - ) + _, err := s.ChannelAPI().MessageEditComplex(&channel.MessageEdit{ + Content: &messageContent, + AllowedMentions: &channel.MessageAllowedMentions{}, + Channel: message.ChannelID, + ID: message.MessageID, + }).Do(ctx) if err != nil { - s.Logger().Error("unable to update rolereact message", "error", err) + bot.Logger(ctx).Error("unable to update rolereact message", "error", err) return "Impossible de mettre à jour le message." } for _, role := range message.Roles { if role.Reaction != "" && role.RoleID != "" && err == nil { - err = s.ChannelAPI().MessageReactionAdd( - message.ChannelID, - message.MessageID, - role.Reaction, - ) + err = s.ChannelAPI().MessageReactionAdd(message.ChannelID, message.MessageID, role.Reaction).Do(ctx) } } if err != nil { - s.Logger().Error("unable to update reactions on rolereact message", "error", err) + bot.Logger(ctx).Error("unable to update reactions on rolereact message", "error", err) return "Impossible de mettre à jour le message." } - cfg := GetGuildConfigPreloaded(i.GuildID) + cfg := GetGuildConfigPreloaded(ctx, i.GuildID) messageIndex := slices.IndexFunc(cfg.RrMessages, func(m config.RoleReactMessage) bool { return m.ID == message.ID }) if messageIndex != -1 { oldMessage := cfg.RrMessages[messageIndex] @@ -71,7 +66,7 @@ func ApplyMessageChange(s bot.Session, i *event.InteractionCreate, message *conf if !ok { err := oldGokord.DB.Delete(role).Error if err != nil { - s.Logger().Error("unable to delete reaction role from database", "error", err) + bot.Logger(ctx).Error("unable to delete reaction role from database", "error", err) return "Impossible de sauvegarder le message de rôle. Merci de contacter l'administrateur du bot." } } @@ -79,13 +74,13 @@ func ApplyMessageChange(s bot.Session, i *event.InteractionCreate, message *conf cfg.RrMessages[messageIndex] = *message err := oldGokord.DB.Save(cfg.RrMessages[messageIndex]).Error if err != nil { - s.Logger().Error("unable to save rolereaction message in database", "error", err) + bot.Logger(ctx).Error("unable to save rolereaction message in database", "error", err) return "Impossible de sauvegarder le message de rôle. Merci de contacter l'administrateur du bot." } for _, role := range cfg.RrMessages[messageIndex].Roles { err = oldGokord.DB.Save(role).Error if err != nil { - s.Logger().Error("unable to save rolereaction role in database", "error", err) + bot.Logger(ctx).Error("unable to save rolereaction role in database", "error", err) return "Impossible de sauvegarder le message de rôle. Merci de contacter l'administrateur du bot." } } @@ -93,8 +88,8 @@ func ApplyMessageChange(s bot.Session, i *event.InteractionCreate, message *conf return "Message de réaction mis à jour avec succès !" } -func WaitForEmoji(s bot.Session, userID string, messageID string) (string, bool) { - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) +func WaitForEmoji(ctx context.Context, s bot.Session, userID string, messageID string) (string, bool) { + ctx, cancel := context.WithTimeout(ctx, 1*time.Minute) defer cancel() emojiChann := make(chan emoji.Emoji) @@ -115,7 +110,7 @@ func WaitForEmoji(s bot.Session, userID string, messageID string) (string, bool) } } -func GetMessageFromEditID(i *event.InteractionCreate, editID uint) (*config.RoleReactMessage, bool) { +func GetMessageFromEditID(i *interaction.Interaction, editID uint) (*config.RoleReactMessage, bool) { cfg := config.GetGuildConfig(i.GuildID) m, ok := messageEdits[editID] if !ok || m.GuildConfigID != cfg.ID { @@ -124,7 +119,7 @@ func GetMessageFromEditID(i *event.InteractionCreate, editID uint) (*config.Role return m, true } -func GetGuildConfigPreloaded(guildID string) *config.GuildConfig { +func GetGuildConfigPreloaded(ctx context.Context, guildID string) *config.GuildConfig { cfg := config.GuildConfig{GuildID: guildID} // err := oldGokord.DB.Where("guild_id = ?", cfg.GuildID).Preload("XpRoles").Preload("RrMessages.Roles").FirstOrCreate(cfg).Error err := oldGokord.DB.Where("guild_id = ?", cfg.GuildID).Preload("RrMessages.Roles").FirstOrCreate(&cfg).Error diff --git a/rolereact/rolereact.go b/rolereact/rolereact.go index 6cb3b5c..2830ab4 100644 --- a/rolereact/rolereact.go +++ b/rolereact/rolereact.go @@ -7,12 +7,10 @@ import ( "git.anhgelus.world/anhgelus/les-copaings-bot/config" "git.anhgelus.world/anhgelus/les-copaings-bot/dynamicid" - "github.com/anhgelus/gokord/cmd" "github.com/nyttikord/gokord/bot" "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) @@ -44,22 +42,18 @@ var ( messageEdits map[uint]*config.RoleReactMessage = make(map[uint]*config.RoleReactMessage) ) -func HandleCommand( - s bot.Session, - i *event.InteractionCreate, - o cmd.OptionMap, - resp *cmd.ResponseBuilder, -) { - err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ +func HandleCommand(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { + err := dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseDeferredChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, }, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("unable to defer interaction", "error", err) + bot.Logger(ctx).Error("unable to defer interaction", "error", err) return } + o := i.OptionMap() c := o["salon"] var channelID string if c != nil { @@ -73,36 +67,35 @@ func HandleCommand( GuildID: i.GuildID, } messageContent := MessageContent(&message) - m, err := s.ChannelAPI().MessageSendComplex( - channelID, &channel.MessageSend{ - Content: messageContent, - AllowedMentions: &channel.MessageAllowedMentions{}, - }, - ) + m, err := dg.ChannelAPI().MessageSendComplex(channelID, &channel.MessageSend{ + Content: messageContent, + AllowedMentions: &channel.MessageAllowedMentions{}, + }, + ).Do(ctx) if err != nil { - _, err := s.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ + _, err := dg.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ Flags: channel.MessageFlagsIsComponentsV2, Components: []component.Message{&component.TextDisplay{Content: fmt.Sprintf("Impossible d'envoyer le message : %s", err.Error())}}, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send message", "error", err) + bot.Logger(ctx).Error("Unable to send message", "error", err) } return } message.MessageID = m.ID - cfg := GetGuildConfigPreloaded(i.GuildID) + cfg := GetGuildConfigPreloaded(ctx, i.GuildID) cfg.RrMessages = append(cfg.RrMessages, message) err = cfg.Save() if err != nil { - s.Logger().Error("Unable to save rolereact message in database", "error", err) - _, err := s.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ + bot.Logger(ctx).Error("Unable to save rolereact message in database", "error", err) + _, err := dg.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ Flags: channel.MessageFlagsIsComponentsV2, Components: []component.Message{ &component.TextDisplay{Content: "Impossible d'enregistrer le message dans la base de données. Merci de contacter l'administrateur du bot."}, }, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("unable to send message", "error", err) + bot.Logger(ctx).Error("unable to send message", "error", err) } return } @@ -111,27 +104,23 @@ func HandleCommand( editID := messageCounter messageCounter++ - components := MessageModifyComponents(i, &EditID{MessageEditID: editID}) + components := MessageModifyComponents(i.Interaction, &EditID{MessageEditID: editID}) // Using this function here is deprecated as per discord documentation. // That said, using the recommended EditResponse endpoint does not allow the use of // version 2 components... - _, err = s.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ + _, err = dg.InteractionAPI().FollowupMessageCreate(i.Interaction, false, &channel.WebhookParams{ Flags: channel.MessageFlagsIsComponentsV2, Components: components, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send edit rolereact message", "error", err) + bot.Logger(ctx).Error("Unable to send edit rolereact message", "error", err) } } -func HandleModifyCommand( - ctx context.Context, - s bot.Session, - cmd *interaction.ApplicationCommand, -) { +func HandleModifyCommand(ctx context.Context, dg bot.Session, i *interaction.ApplicationCommand) { logger := bot.Logger(ctx) - messageId := cmd.Data.TargetID - cfg := GetGuildConfigPreloaded(cmd.GuildID) + messageId := i.Data.TargetID + cfg := GetGuildConfigPreloaded(ctx, i.GuildID) var target *config.RoleReactMessage var targetEditID uint for editID, message := range messageEdits { @@ -147,7 +136,7 @@ func HandleModifyCommand( } } if target == nil { - err := s.InteractionAPI().Respond(cmd.Interaction, &interaction.Response{ + err := dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, Data: &interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral, @@ -163,39 +152,27 @@ func HandleModifyCommand( targetEditID = messageCounter messageCounter++ } - err := s.InteractionAPI().Respond(cmd.Interaction, &interaction.Response{ + err := dg.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseChannelMessageWithSource, - Data: MessageModifyData(cmd, &EditID{MessageEditID: targetEditID}), + Data: MessageModifyData(ctx, i.Interaction, &EditID{MessageEditID: targetEditID}), }).Do(ctx) if err != nil { logger.Error("Unable to send modify rolereact message", "error", err) } } -func HandleModifyComponent( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { +func HandleModifyComponent(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditID) { err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, - Data: MessageModifyData(i, parameters), - }) + Data: MessageModifyData(ctx, i.Interaction, params), + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send modify rolereact message", "error", err) + bot.Logger(ctx).Error("Unable to send modify rolereact message", "error", err) } } -func HandleResetMessage( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleResetMessage(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditID) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var responseData interaction.ResponseData if !ok { responseData = interaction.ResponseData{ @@ -205,31 +182,25 @@ func HandleResetMessage( }, } } else { - cfg := GetGuildConfigPreloaded(i.GuildID) + cfg := GetGuildConfigPreloaded(ctx, i.GuildID) for _, m := range cfg.RrMessages { if m.ID == message.ID { - messageEdits[parameters.MessageEditID] = &m + messageEdits[params.MessageEditID] = &m } } - responseData = *MessageModifyData(i, parameters) + responseData = *MessageModifyData(ctx, i.Interaction, params) } err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, Data: &responseData, }) if err != nil { - s.Logger().Error("Unable to send reset message message", "error", err) + bot.Logger(ctx).Error("Unable to send reset message message", "error", err) } } -func HandleStartSetNote( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleStartSetNote(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditID) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) if !ok { err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, @@ -241,42 +212,32 @@ func HandleStartSetNote( }, }) if err != nil { - s.Logger().Error("Unable to send message edit not found message", "error", err) + bot.Logger(ctx).Error("Unable to send message edit not found message", "error", err) } return } - err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ - Type: types.InteractionResponseModal, - Data: &interaction.ResponseData{ - Title: "Changer la description", - CustomID: dynamicid.FormatCustomID(SetNote, *parameters), - Components: []component.Component{ - &component.Label{ - Label: "Nouvelle description", - Description: "Description affichée sur votre message de réaction", - Component: &component.TextInput{ - Style: component.TextInputParagraph, - MaxLength: 2000, - CustomID: "note", - Value: message.Note, - }, - }, + resp := interaction.NewModalResponse(). + Title("Changer la description"). + CustomID(dynamicid.FormatCustomID(SetNote, *params)). + AddComponent(&component.Label{ + Label: "Nouvelle description", + Description: "Description affichée sur votre message de réaction", + Component: &component.TextInput{ + Style: component.TextInputParagraph, + MaxLength: 2000, + CustomID: "note", + Value: message.Note, }, - }, - }) + }). + Response() + err := s.InteractionAPI().Respond(i.Interaction, resp).Do(ctx) if err != nil { - s.Logger().Error("Unable to send edit note modal", "error", err) + bot.Logger(ctx).Error("Unable to send edit note modal", "error", err) } } -func HandleSetNote( - s bot.Session, - i *event.InteractionCreate, - data *interaction.ModalSubmitData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleSetNote(ctx context.Context, s bot.Session, i *interaction.ModalSubmit, params *EditID) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) if !ok { err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, @@ -288,28 +249,22 @@ func HandleSetNote( }, }) if err != nil { - s.Logger().Error("unable to send set note error message", "error", err) + bot.Logger(ctx).Error("unable to send set note error message", "error", err) } return } - message.Note = data.Components[0].(*component.Label).Component.(*component.TextInput).Value + message.Note = i.Data.Components[0].(*component.Label).Component.(*component.TextInput).Value err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, - Data: MessageModifyData(i, parameters), + Data: MessageModifyData(ctx, i.Interaction, params), }) if err != nil { - s.Logger().Error("Unable to send updated note message", "error", err) + bot.Logger(ctx).Error("Unable to send updated note message", "error", err) } } -func HandleApplyMessage( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleApplyMessage(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditID) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var responseData interaction.ResponseData if !ok { responseData = interaction.ResponseData{ @@ -323,35 +278,29 @@ func HandleApplyMessage( Data: &responseData, }) if err != nil { - s.Logger().Error("unable to send apply message error message", "error", err) + bot.Logger(ctx).Error("unable to send apply message error message", "error", err) } return } err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseDeferredChannelMessageWithSource, Data: &interaction.ResponseData{Flags: channel.MessageFlagsEphemeral}, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to defer interaction", "error", err) + bot.Logger(ctx).Error("Unable to defer interaction", "error", err) return } - m := ApplyMessageChange(s, i, message) + m := ApplyMessageChange(ctx, s, i.Interaction, message) _, err = s.InteractionAPI().ResponseEdit(i.Interaction, &channel.WebhookEdit{ Content: &m, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send apply rolereaction message changes", "error", err) + bot.Logger(ctx).Error("Unable to send apply rolereaction message changes", "error", err) } } -func HandleNewRole( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditID, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleNewRole(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditID) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var responseData interaction.ResponseData if !ok { responseData = interaction.ResponseData{ @@ -362,7 +311,7 @@ func HandleNewRole( } } else { message.Roles = append(message.Roles, &config.RoleReact{CounterID: roleCounter}) - responseData = MessageModifyRoleData(i, &EditIDWithRole{MessageEditID: parameters.MessageEditID, RoleCounterID: roleCounter}, "") + responseData = MessageModifyRoleData(i.Interaction, &EditIDWithRole{MessageEditID: params.MessageEditID, RoleCounterID: roleCounter}, "") roleCounter++ } err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ @@ -370,18 +319,12 @@ func HandleNewRole( Data: &responseData, }) if err != nil { - s.Logger().Error("Unable to send modify reaction role message", "error", err) + bot.Logger(ctx).Error("Unable to send modify reaction role message", "error", err) } } -func HandleOpenRole( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditIDWithRole, - resp *cmd.ResponseBuilder, -) { - _, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleOpenRole(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditIDWithRole) { + _, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var responseData interaction.ResponseData if !ok { responseData = interaction.ResponseData{ @@ -391,29 +334,23 @@ func HandleOpenRole( }, } } else { - responseData = MessageModifyRoleData(i, parameters, "") + responseData = MessageModifyRoleData(i.Interaction, params, "") } err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, Data: &responseData, }) if err != nil { - s.Logger().Error("Unable to send open reaction role message", "error", err) + bot.Logger(ctx).Error("Unable to send open reaction role message", "error", err) } } -func HandleSetRole( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditIDWithRole, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleSetRole(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditIDWithRole) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var responseData interaction.ResponseData var role *config.RoleReact if ok { - roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == parameters.RoleCounterID }) + roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == params.RoleCounterID }) if roleIndex != -1 { role = message.Roles[roleIndex] } @@ -426,29 +363,23 @@ func HandleSetRole( }, } } else { - role.RoleID = data.Values[0] - responseData = MessageModifyRoleData(i, parameters, "") + role.RoleID = i.Data.Values[0] + responseData = MessageModifyRoleData(i.Interaction, params, "") } err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, Data: &responseData, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send open reaction role message", "error", err) + bot.Logger(ctx).Error("Unable to send open reaction role message", "error", err) } } -func HandleSetReaction( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditIDWithRole, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleSetReaction(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditIDWithRole) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) var role *config.RoleReact if ok { - roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == parameters.RoleCounterID }) + roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == params.RoleCounterID }) if roleIndex != -1 { role = message.Roles[roleIndex] } @@ -462,66 +393,61 @@ func HandleSetReaction( &component.TextDisplay{Content: "Impossible de trouver la modification de message. Veuillez réessayer."}, }, }, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send open reaction role message", "error", err) + bot.Logger(ctx).Error("Unable to send open reaction role message", "error", err) } return } - responseData := MessageModifyRoleData(i, parameters, "Ajoute la réaction que tu veux choisir au message de rôle de réaction (tu peux y accéder avec le bouton ci-dessous)") + responseData := MessageModifyRoleData(i.Interaction, params, "Ajoute la réaction que tu veux choisir au message de rôle de réaction (tu peux y accéder avec le bouton ci-dessous)") + //TODO: handle errors here s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, Data: &responseData, - }) - emojiName, ok := WaitForEmoji(s, i.Member.User.ID, message.MessageID) + }).Do(ctx) + emojiName, ok := WaitForEmoji(ctx, s, i.Member.User.ID, message.MessageID) if !ok { - editResponseComponents := MessageModifyRoleComponents(i, parameters, "Le temps d'attente a été dépassé") + editResponseComponents := MessageModifyRoleComponents(i.Interaction, params, "Le temps d'attente a été dépassé") _, err := s.InteractionAPI().ResponseEdit(i.Interaction, &channel.WebhookEdit{ Components: &editResponseComponents, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("unable to send timed out reaction message", "error", err) + bot.Logger(ctx).Error("unable to send timed out reaction message", "error", err) } return } - err := s.ChannelAPI().MessageReactionAdd(message.ChannelID, message.MessageID, emojiName) + err := s.ChannelAPI().MessageReactionAdd(message.ChannelID, message.MessageID, emojiName).Do(ctx) if err != nil { - editResponseComponents := MessageModifyRoleComponents(i, parameters, "La réaction n'est pas utilisable. Cela peut être résolu en l'ajoutant à ce serveur") + editResponseComponents := MessageModifyRoleComponents(i.Interaction, params, "La réaction n'est pas utilisable. Cela peut être résolu en l'ajoutant à ce serveur") _, err := s.InteractionAPI().ResponseEdit(i.Interaction, &channel.WebhookEdit{ Components: &editResponseComponents, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("unable to send unusable reaction message", "error", err) + bot.Logger(ctx).Error("unable to send unusable reaction message", "error", err) } return } - err = s.ChannelAPI().MessageReactionRemove(message.ChannelID, message.MessageID, emojiName, i.Member.User.ID) + err = s.ChannelAPI().MessageReactionRemove(message.ChannelID, message.MessageID, emojiName, i.Member.User.ID).Do(ctx) if err != nil { - s.Logger().Warn("unable to remove author reaction from message", "error", err) + bot.Logger(ctx).Warn("unable to remove author reaction from message", "error", err) } role.Reaction = emojiName - components := MessageModifyRoleComponents(i, parameters, "") + components := MessageModifyRoleComponents(i.Interaction, params, "") _, err = s.InteractionAPI().ResponseEdit(i.Interaction, &channel.WebhookEdit{ Flags: channel.MessageFlagsIsComponentsV2 | channel.MessageFlagsEphemeral, Components: &components, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to edit original response", "error", err) + bot.Logger(ctx).Error("Unable to edit original response", "error", err) } } -func HandleDelRole( - s bot.Session, - i *event.InteractionCreate, - data *interaction.MessageComponentData, - parameters *EditIDWithRole, - resp *cmd.ResponseBuilder, -) { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func HandleDelRole(ctx context.Context, s bot.Session, i *interaction.MessageComponent, params *EditIDWithRole) { + message, ok := GetMessageFromEditID(i.Interaction, params.MessageEditID) roleIndex := -1 if ok { - roleIndex = slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == parameters.RoleCounterID }) + roleIndex = slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == params.RoleCounterID }) } if !ok || roleIndex == -1 { err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ @@ -532,9 +458,9 @@ func HandleDelRole( &component.TextDisplay{Content: "Impossible de trouver la modification de message. Veuillez réessayer."}, }, }, - }) + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send open reaction role message", "error", err) + bot.Logger(ctx).Error("Unable to send open reaction role message", "error", err) } return } @@ -544,9 +470,9 @@ func HandleDelRole( err := s.InteractionAPI().Respond(i.Interaction, &interaction.Response{ Type: types.InteractionResponseUpdateMessage, - Data: MessageModifyData(i, &EditID{MessageEditID: parameters.MessageEditID}), - }) + Data: MessageModifyData(ctx, i.Interaction, &EditID{MessageEditID: params.MessageEditID}), + }).Do(ctx) if err != nil { - s.Logger().Error("Unable to send modify message message", "error", err) + bot.Logger(ctx).Error("Unable to send modify message message", "error", err) } } diff --git a/rolereact/views.go b/rolereact/views.go index 3ecfe13..7b31ec4 100644 --- a/rolereact/views.go +++ b/rolereact/views.go @@ -1,6 +1,7 @@ package rolereact import ( + "context" "fmt" "slices" @@ -9,12 +10,11 @@ import ( "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" - "github.com/nyttikord/gokord/event" "github.com/nyttikord/gokord/interaction" ) -func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []component.Message { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func MessageModifyComponents(i *interaction.Interaction, params *EditID) []component.Message { + message, ok := GetMessageFromEditID(i, params.MessageEditID) if !ok { return []component.Message{ &component.TextDisplay{Content: "Cette modification est trop vieille et a été oubliée."}, @@ -34,7 +34,7 @@ func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []c Accessory: &component.Button{ Label: "Modifier", Style: component.ButtonStyleSecondary, - CustomID: dynamicid.FormatCustomID(SetNote, *parameters), + CustomID: dynamicid.FormatCustomID(SetNote, *params), }, }, &component.Separator{}, @@ -61,7 +61,7 @@ func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []c Accessory: &component.Button{ Label: "Modifier", Style: component.ButtonStyleSecondary, - CustomID: dynamicid.FormatCustomID(OpenRole, EditIDWithRole{parameters.MessageEditID, role.CounterID}), + CustomID: dynamicid.FormatCustomID(OpenRole, EditIDWithRole{params.MessageEditID, role.CounterID}), }, }) } @@ -76,7 +76,7 @@ func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []c &component.Button{ Style: component.ButtonStylePrimary, Label: "Ajouter", - CustomID: dynamicid.FormatCustomID(NewRole, EditID{MessageEditID: parameters.MessageEditID}), + CustomID: dynamicid.FormatCustomID(NewRole, EditID{MessageEditID: params.MessageEditID}), Disabled: len(message.Roles) >= 20, }, }, @@ -87,12 +87,12 @@ func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []c &component.Button{ Label: "Appliquer", Style: component.ButtonStylePrimary, - CustomID: dynamicid.FormatCustomID(ApplyMessage, EditID{MessageEditID: parameters.MessageEditID}), + CustomID: dynamicid.FormatCustomID(ApplyMessage, EditID{MessageEditID: params.MessageEditID}), }, &component.Button{ Label: "Réinitialiser", Style: component.ButtonStyleDanger, - CustomID: dynamicid.FormatCustomID(ResetMessage, *parameters), + CustomID: dynamicid.FormatCustomID(ResetMessage, *params), }, &component.Button{ Label: "Message", @@ -108,9 +108,9 @@ func MessageModifyComponents(i *event.InteractionCreate, parameters *EditID) []c } } -func MessageModifyData(i *event.InteractionCreate, parameters *EditID) *interaction.ResponseData { +func MessageModifyData(ctx context.Context, i *interaction.Interaction, params *EditID) *interaction.ResponseData { components := []component.Component{} - for _, component := range MessageModifyComponents(i, parameters) { + for _, component := range MessageModifyComponents(i, params) { components = append(components, component) } responseData := &interaction.ResponseData{ @@ -120,11 +120,11 @@ func MessageModifyData(i *event.InteractionCreate, parameters *EditID) *interact return responseData } -func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDWithRole, emojiMessage string) []component.Message { - message, ok := GetMessageFromEditID(i, parameters.MessageEditID) +func MessageModifyRoleComponents(i *interaction.Interaction, params *EditIDWithRole, emojiMessage string) []component.Message { + message, ok := GetMessageFromEditID(i, params.MessageEditID) var role *config.RoleReact if ok { - roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == parameters.RoleCounterID }) + roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == params.RoleCounterID }) if roleIndex != -1 { role = message.Roles[roleIndex] } @@ -145,7 +145,7 @@ func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDW reactionButton = component.Button{Label: "Ajouter", Style: component.ButtonStylePrimary} disableBack = true } - reactionButton.CustomID = dynamicid.FormatCustomID(SetRoleReaction, *parameters) + reactionButton.CustomID = dynamicid.FormatCustomID(SetRoleReaction, *params) defaultRoleValues := make([]component.SelectMenuDefaultValue, 0) if role.RoleID != "" { defaultRoleValues = append(defaultRoleValues, component.SelectMenuDefaultValue{ @@ -173,7 +173,7 @@ func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDW &component.ActionsRow{Components: []component.Message{ &component.SelectMenu{ MenuType: types.SelectMenuRole, - CustomID: dynamicid.FormatCustomID(SetRoleRoleID, *parameters), + CustomID: dynamicid.FormatCustomID(SetRoleRoleID, *params), MinValues: &one, MaxValues: 1, Placeholder: "Sélectionner un rôle", DefaultValues: defaultRoleValues, @@ -183,7 +183,7 @@ func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDW &component.Button{ Style: component.ButtonStyleDanger, Label: "Supprimer", - CustomID: dynamicid.FormatCustomID(DelRole, *parameters), + CustomID: dynamicid.FormatCustomID(DelRole, *params), }, }}, &component.Separator{}, @@ -192,7 +192,7 @@ func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDW Label: "Retour", Style: component.ButtonStyleSecondary, Disabled: disableBack, - CustomID: dynamicid.FormatCustomID(OpenMessage, EditID{MessageEditID: parameters.MessageEditID}), + CustomID: dynamicid.FormatCustomID(OpenMessage, EditID{MessageEditID: params.MessageEditID}), }, &component.Button{ Label: "Message", Style: component.ButtonStyleLink, @@ -205,9 +205,9 @@ func MessageModifyRoleComponents(i *event.InteractionCreate, parameters *EditIDW }} } -func MessageModifyRoleData(i *event.InteractionCreate, parameters *EditIDWithRole, emojiMessage string) interaction.ResponseData { +func MessageModifyRoleData(i *interaction.Interaction, params *EditIDWithRole, emojiMessage string) interaction.ResponseData { components := []component.Component{} - for _, component := range MessageModifyRoleComponents(i, parameters, emojiMessage) { + for _, component := range MessageModifyRoleComponents(i, params, emojiMessage) { components = append(components, component) } return interaction.ResponseData{ |
