| @@ -26,11 +26,7 @@ This branch is on pause and does not work currently, Once everything is stable w | |||||
| ### web/SlashCommandService | ### web/SlashCommandService | ||||
| webmilio's spin on the SlashCommandService branch, again the state of this is unknown. | webmilio's spin on the SlashCommandService branch, again the state of this is unknown. | ||||
| ## Message Components | |||||
| So, you want to use Message components? Well you're in luck! Below is a quick overview of how to use them | |||||
| #### Listening for button presses | |||||
| ## Listening for interactions | |||||
| ```cs | ```cs | ||||
| // Subscribe to the InteractionCreated event | // Subscribe to the InteractionCreated event | ||||
| client.InteractionCreated += Client_InteractionCreated; | client.InteractionCreated += Client_InteractionCreated; | ||||
| @@ -38,23 +34,80 @@ client.InteractionCreated += Client_InteractionCreated; | |||||
| ... | ... | ||||
| private async Task Client_InteractionCreated(SocketInteraction arg) | private async Task Client_InteractionCreated(SocketInteraction arg) | ||||
| { | { | ||||
| // If the type of the interaction is a message component | |||||
| if(arg.Type == Discord.InteractionType.MessageComponent) | |||||
| switch (arg.Type) // We want to check the type of this interaction | |||||
| { | { | ||||
| // parse the args | |||||
| var parsedArg = (SocketMessageComponent)arg; | |||||
| // respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. | |||||
| await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage); | |||||
| //Slash commands | |||||
| case InteractionType.ApplicationCommand: | |||||
| await MySlashCommandHandler(arg); | |||||
| break; | |||||
| //Button clicks/selection dropdowns | |||||
| case InteractionType.MessageComponent: | |||||
| await MyMessageComponentHandler(arg); | |||||
| break; | |||||
| //Unused | |||||
| case InteractionType.Ping: | |||||
| break; | |||||
| //Unknown/Unsupported | |||||
| default: | |||||
| Console.WriteLine("Unsupported interaction type: " + arg.Type); | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| ``` | ``` | ||||
| #### Sending messages with buttons | |||||
| ### Handling button clicks and selection dropdowns | |||||
| ```cs | |||||
| private async Task MyMessageComponentHandler(SocketInteraction arg) | |||||
| { | |||||
| // Parse the arg | |||||
| var parsedArg = (SocketMessageComponent) arg; | |||||
| // Get the custom ID | |||||
| var customId = parsedArg.Data.CustomId; | |||||
| // Get the user | |||||
| var user = (SocketGuildUser) arg.User; | |||||
| // Get the guild | |||||
| var guild = user.Guild; | |||||
| // Respond with the update message response type. This edits the original message if you have set AlwaysAcknowledgeInteractions to false. | |||||
| // You can also use "ephemeral" so that only the original user of the interaction sees the message | |||||
| await parsedArg.RespondAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.UpdateMessage, ephemeral: true); | |||||
| // You can also followup with a second message | |||||
| await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); | |||||
| } | |||||
| ``` | |||||
| ### Sending messages with buttons | |||||
| Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: | Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: | ||||
| ```cs | ```cs | ||||
| var builder = new ComponentBuilder().WithButton("Hello!", ButtonStyle.Primary, customId: "id_1"); | |||||
| var builder = new ComponentBuilder().WithButton("Hello!", customId: "id_1", ButtonStyle.Primary, row: 0); | |||||
| await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); | await Context.Channel.SendMessageAsync("Test buttons!", component: builder.Build()); | ||||
| ``` | ``` | ||||
| ### Sending messages with selection dropdowns | |||||
| Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: | |||||
| ```cs | |||||
| var builder = new ComponentBuilder() | |||||
| .WithSelectMenu(new SelectMenuBuilder() | |||||
| .WithCustomId("id_2") | |||||
| .WithLabel("Select menu!") | |||||
| .WithPlaceholder("This is a placeholder") | |||||
| .WithOptions(new List<SelectMenuOptionBuilder>() | |||||
| { | |||||
| new SelectMenuOptionBuilder() | |||||
| .WithLabel("Option A") | |||||
| .WithEmote(Emote.Parse("<:evanpog:810017136814194698>")) | |||||
| .WithDescription("Evan pog champ") | |||||
| .WithValue("value1"), | |||||
| new SelectMenuOptionBuilder() | |||||
| .WithLabel("Option B") | |||||
| .WithDescription("Option B is poggers") | |||||
| .WithValue("value2") | |||||
| })); | |||||
| await Context.Channel.SendMessageAsync("Test selection!", component: builder.Build()); | |||||
| ``` | |||||
| > Note: You can only have 5 buttons per row and 5 rows per message. If a row contains a selection dropdown it cannot contain any buttons. | |||||
| ## Slash commands | ## Slash commands | ||||
| Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) | Slash command example how to's can be found [here](https://github.com/Discord-Net-Labs/Discord.Net-Labs/blob/Interactions/docs/guides/commands/application-commands.md). If you want to read some code using slash commands, you can do that [here](https://github.com/quinchs/SwissbotCore/blob/master/SwissbotCore/Handlers/AutoMod/Censor.cs) | ||||