Browse Source

Merge branch 'Interactions' of https://github.com/Discord-Net-Labs/Discord.Net-Labs into Interactions

pull/1923/head
quin lynch 4 years ago
parent
commit
1de660a478
3 changed files with 84 additions and 14 deletions
  1. +72
    -13
      README.md
  2. +12
    -1
      src/Discord.Net.Core/Entities/Channels/ChannelType.cs
  3. +0
    -0
      src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs

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

+ 12
- 1
src/Discord.Net.Core/Entities/Channels/ChannelType.cs View File

@@ -14,6 +14,17 @@ namespace Discord
/// <summary> The channel is a category channel. </summary>
Category = 4,
/// <summary> The channel is a news channel. </summary>
News = 5
News = 5,
/// <summary> The channel is a store channel. </summary>
Store = 6,
/// <summary> The channel is a temporary thread channel under a news channel. </summary>
NewsThread = 10,
/// <summary> The channel is a temporary thread channel under a text channel. </summary>
PublicThread = 11,
/// <summary> The channel is a private temporary thread channel under a text channel. </summary>
PrivateThread = 12,
/// <summary> The channel is a stage voice channel. </summary>
Stage = 13

}
}

src/Discord.Net.Core/Entities/Messages/SticketFormatType.cs → src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs View File


Loading…
Cancel
Save