From 48e6070ab93ee1231737eef2547f771c5a7d34ad Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Mon, 5 Jul 2021 10:49:23 -0400 Subject: [PATCH 1/4] Add new channel type IDs --- .../Entities/Channels/ChannelType.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs index 6dd910ba6..85fc0b811 100644 --- a/src/Discord.Net.Core/Entities/Channels/ChannelType.cs +++ b/src/Discord.Net.Core/Entities/Channels/ChannelType.cs @@ -14,6 +14,17 @@ namespace Discord /// The channel is a category channel. Category = 4, /// The channel is a news channel. - News = 5 + News = 5, + /// The channel is a store channel. + Store = 6, + /// The channel is a temporary thread channel under a news channel. + NewsThread = 10, + /// The channel is a temporary thread channel under a text channel. + PublicThread = 11, + /// The channel is a private temporary thread channel under a text channel. + PrivateThread = 12, + /// The channel is a stage voice channel. + Stage = 13 + } } From ba254a772da0ff7b44c1aacf7c4c6841a0f3433d Mon Sep 17 00:00:00 2001 From: Quin Lynch <49576606+quinchs@users.noreply.github.com> Date: Mon, 5 Jul 2021 11:56:18 -0300 Subject: [PATCH 2/4] Rename SticketFormatType.cs to StickerFormatType.cs --- .../Messages/{SticketFormatType.cs => StickerFormatType.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Discord.Net.Core/Entities/Messages/{SticketFormatType.cs => StickerFormatType.cs} (100%) diff --git a/src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs b/src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs similarity index 100% rename from src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs rename to src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs From 7d6224b558cbb364318b03d5a52c6db67116099a Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 6 Jul 2021 08:51:05 -0400 Subject: [PATCH 3/4] Update examples --- README.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 981108982..f7671aca6 100644 --- a/README.md +++ b/README.md @@ -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() + { + 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) From 5e31eb12a693df53f6e40e98c6580257accf56b7 Mon Sep 17 00:00:00 2001 From: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Date: Tue, 6 Jul 2021 09:00:17 -0400 Subject: [PATCH 4/4] Include addition vars for selection dropdowns --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index f7671aca6..f99f3ec4a 100644 --- a/README.md +++ b/README.md @@ -74,9 +74,15 @@ private async Task MyMessageComponentHandler(SocketInteraction arg) // You can also followup with a second message await parsedArg.FollowupAsync($"Clicked {parsedArg.Data.CustomId}!", type: InteractionResponseType.ChannelMessageWithSource, ephemeral: true); + + //If you are using selection dropdowns, you can get the selected label and values using these: + var selectedLabel = ((SelectMenu) parsedArg.Message.Components.First().Components.First()).Options.FirstOrDefault(x => x.Value == parsedArg.Data.Values.FirstOrDefault())?.Label; + var selectedValue = parsedArg.Data.Values.First(); } ``` +> Note: The example above assumes that the selection dropdown is expecting only 1 returned value, if you configured your dropdown for multiple values, you'll need to modify the code slightly. + ### Sending messages with buttons Theres a new field in all `SendMessageAsync` functions that takes in a `MessageComponent`, you can use it like so: ```cs