Browse Source

Merge pull request #34 from MrCakeSlayer/Interactions

Update component/interaction examples
pull/1923/head
Quin Lynch GitHub 4 years ago
parent
commit
d7325a116f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 72 additions and 13 deletions
  1. +72
    -13
      README.md

+ 72
- 13
README.md View File

@@ -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,86 @@ 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);
//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: 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)

Loading…
Cancel
Save