| @@ -26,11 +26,7 @@ This branch is on pause and does not work currently, Once everything is stable w | |||
| ### web/SlashCommandService | |||
| 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 | |||
| // Subscribe to the InteractionCreated event | |||
| client.InteractionCreated += Client_InteractionCreated; | |||
| @@ -38,23 +34,80 @@ client.InteractionCreated += Client_InteractionCreated; | |||
| ... | |||
| 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: | |||
| ```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()); | |||
| ``` | |||
| ### 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 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) | |||