package rolereact import ( "context" "fmt" "slices" "git.anhgelus.world/anhgelus/les-copaings-bot/config" "git.anhgelus.world/anhgelus/les-copaings-bot/dynamicid" "github.com/nyttikord/gokord/channel" "github.com/nyttikord/gokord/component" "github.com/nyttikord/gokord/discord/types" "github.com/nyttikord/gokord/interaction" ) func MessageModifyComponents(ctx context.Context, i *interaction.Interaction, params *EditID) []component.Message { message, ok := GetMessageFromEditID(ctx, i, params.MessageEditID) if !ok { return []component.Message{ &component.TextDisplay{Content: "Cette modification est trop vieille et a été oubliée."}, } } var note string if message.Note != "" { note = message.Note } else { note = "*Pas de note*" } components := []component.Message{ &component.TextDisplay{Content: "## Modifier un message de réaction"}, &component.Separator{}, &component.Section{ Components: []component.Message{&component.TextDisplay{Content: note}}, Accessory: &component.Button{ Label: "Modifier", Style: component.ButtonStyleSecondary, CustomID: dynamicid.FormatCustomID(SetNote, *params), }, }, &component.Separator{}, } for _, role := range message.Roles { var reaction string if role.Reaction != "" { reaction = FormatEmoji(role.Reaction) } else { reaction = ":no_entry_sign:" } var roleMention string if role.RoleID != 0 { roleMention = fmt.Sprintf("<@&%d>", role.RoleID) } else { roleMention = "*Pas de rôle sélectionné*" } if role.CounterID == 0 { role.CounterID = roleCounter roleCounter++ } components = append(components, &component.Section{ Components: []component.Message{&component.TextDisplay{Content: fmt.Sprintf("%s %s", reaction, roleMention)}}, Accessory: &component.Button{ Label: "Modifier", Style: component.ButtonStyleSecondary, CustomID: dynamicid.FormatCustomID(OpenRole, EditIDWithRole{params.MessageEditID, role.CounterID}), }, }) } if len(message.Roles) == 0 { components = append(components, &component.TextDisplay{ Content: "*Pas de rôles de réaction défini*", }) } components = append(components, []component.Message{ &component.ActionsRow{ Components: []component.Message{ &component.Button{ Style: component.ButtonStylePrimary, Label: "Ajouter", CustomID: dynamicid.FormatCustomID(NewRole, EditID{MessageEditID: params.MessageEditID}), Disabled: len(message.Roles) >= 20, }, }, }, &component.Separator{}, &component.ActionsRow{ Components: []component.Message{ &component.Button{ Label: "Appliquer", Style: component.ButtonStylePrimary, CustomID: dynamicid.FormatCustomID(ApplyMessage, EditID{MessageEditID: params.MessageEditID}), }, &component.Button{ Label: "Réinitialiser", Style: component.ButtonStyleDanger, CustomID: dynamicid.FormatCustomID(ResetMessage, *params), }, &component.Button{ Label: "Message", Style: component.ButtonStyleLink, URL: fmt.Sprintf("https://discord.com/channels/%s/%s/%s", message.GuildID, message.ChannelID, message.MessageID), }, }, }}...) return []component.Message{ &component.Container{ Components: components, }, } } func MessageModifyData(ctx context.Context, i *interaction.Interaction, params *EditID) *interaction.ResponseData { components := []component.Component{} for _, component := range MessageModifyComponents(ctx, i, params) { components = append(components, component) } responseData := &interaction.ResponseData{ Flags: channel.MessageFlagsIsComponentsV2 | channel.MessageFlagsEphemeral, Components: components, } return responseData } func MessageModifyRoleComponents(ctx context.Context, i *interaction.Interaction, params *EditIDWithRole, emojiMessage string) []component.Message { message, ok := GetMessageFromEditID(ctx, i, params.MessageEditID) var role *config.RoleReact if ok { roleIndex := slices.IndexFunc(message.Roles, func(role *config.RoleReact) bool { return role.CounterID == params.RoleCounterID }) if roleIndex != -1 { role = message.Roles[roleIndex] } } if !ok || role == nil { return []component.Message{ &component.TextDisplay{Content: "Impossible de trouver la modification de message. Veuillez réessayer."}, } } disableBack := false var reactionDescription string var reactionButton component.Button if role.Reaction != "" { reactionDescription = fmt.Sprintf("**Réaction : ** %s", FormatEmoji(role.Reaction)) reactionButton = component.Button{Label: "Modifier", Style: component.ButtonStyleSecondary} } else { reactionDescription = "*Aucune réaction pour le moment*" reactionButton = component.Button{Label: "Ajouter", Style: component.ButtonStylePrimary} disableBack = true } reactionButton.CustomID = dynamicid.FormatCustomID(SetRoleReaction, *params) defaultRoleValues := make([]component.SelectMenuDefaultValue, 0) if role.RoleID != 0 { defaultRoleValues = append(defaultRoleValues, component.SelectMenuDefaultValue{ Type: types.SelectMenuDefaultValueRole, ID: role.RoleID, }) } disableBack = disableBack || (role.RoleID == 0) one := 1 components := []component.Message{ &component.TextDisplay{Content: "## Modifier un message de réaction"}, &component.Separator{}, &component.Section{ Components: []component.Message{ &component.TextDisplay{Content: reactionDescription}, }, Accessory: &reactionButton, }, } if emojiMessage != "" { components = append(components, &component.TextDisplay{Content: "-# " + emojiMessage}) } components = append(components, []component.Message{ &component.ActionsRow{Components: []component.Message{ &component.SelectMenu{ MenuType: types.SelectMenuRole, CustomID: dynamicid.FormatCustomID(SetRoleRoleID, *params), MinValues: &one, MaxValues: 1, Placeholder: "Sélectionner un rôle", DefaultValues: defaultRoleValues, }, }}, &component.ActionsRow{Components: []component.Message{ &component.Button{ Style: component.ButtonStyleDanger, Label: "Supprimer", CustomID: dynamicid.FormatCustomID(DelRole, *params), }, }}, &component.Separator{}, &component.ActionsRow{Components: []component.Message{ &component.Button{ Label: "Retour", Style: component.ButtonStyleSecondary, Disabled: disableBack, CustomID: dynamicid.FormatCustomID(OpenMessage, EditID{MessageEditID: params.MessageEditID}), }, &component.Button{ Label: "Message", Style: component.ButtonStyleLink, URL: fmt.Sprintf("https://discord.com/channels/%s/%s/%s", message.GuildID, message.ChannelID, message.MessageID), }, }}, }...) return []component.Message{&component.Container{ Components: components, }} } func MessageModifyRoleData(ctx context.Context, i *interaction.Interaction, params *EditIDWithRole, emojiMessage string) interaction.ResponseData { components := []component.Component{} for _, component := range MessageModifyRoleComponents(ctx, i, params, emojiMessage) { components = append(components, component) } return interaction.ResponseData{ Flags: channel.MessageFlagsEphemeral | channel.MessageFlagsIsComponentsV2, Components: components, } }