* meta: bump version
* Null or empty fix (#176)
* Add components and stickers to ReplyAsync extension
* Fixed null or empty
* Changed Label to Description
* -||-
Co-authored-by: quin lynch <lynchquin@gmail.com>
* More regions (#177)
* Preconditions
* ChannelHelper
* RestDMChannel
* RestGroupChannel
* RestBan
* RestGroupUser
* EntityExtensions
* DiscordSocketClient
* DiscordSocketClient
* Discord.net.core.xml fix (#178)
* Changed Label to Description
* Added Discord- .MessageComponent .ISticker[]
,Discord.MessageComponent,Discord.ISticker[] to ReplyAsync
* Remove references to labs
* Update Discord.Net.sln
* Added SendMessagesInThreads and StartEmbeddedActivities. (#175)
* Added SendMessagesInThreads and StartEmbeddedActivities.
Adjusted owner perms.
Change UsePublicThreads -> CreatePublicThreads
Change UsePrivateThreads -> CreatePrivateThreads
* removed extra ///
* Added UsePublicThreads and UsePrivateThreads back with Obsolete Attribute
* removed 'false' from Obsolete Attribute
* Squashed commit of the following:
commit dca41a348e
Author: quin lynch <lynchquin@gmail.com>
Date: Thu Sep 23 07:02:19 2021 -0300
Autocomplete commands
* meta: xml. closes#171
* Revert user agent and $device to dnet
* meta: bump version
* meta: bump vers
* Fix sticker args
* Grammer fix (#179)
* Made IVoiceChannel mentionable
* Embeds array for send message async (#181)
* meta: bump version
* meta: bump vers
* Fix sticker args
* Grammer fix (#179)
* Added embeds for SendMessageAsync
* [JsonProperty("embed")] forgot to remove this
public Optional<Embed> Embed { get; set; }
* It has been done as requested.
* Changed the old way of handeling single embeds
* Moved embeds param and added options param
* xmls
Co-authored-by: quin lynch <lynchquin@gmail.com>
* Fix thread permissions (#183)
* Update GuildPermissionsTests.cs
* Update GuildPermissions.cs
* Use compound assignment (#186)
* Used compound assignment
* -||-
* -||-
* Remove unnecessary suppression (#188)
* Inlined variable declarations (#185)
* Fixed some warnings (#184)
* Fixed some warnings
* Another fixed warning
* Changed the SSendFileAsync to SendFileAsync
* Removed para AlwaysAcknowledgeInteractions
* Moved it back to the previous version
* Added periods to the end like quin requested!! :((
Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>
* Object initialization can be simplified fixed (#189)
* Conditional-expression-simplification (#193)
* Capitlazation fixes (#192)
* Removed-this. (#191)
* Use 'switch' expression (#187)
* Use 'switch' expression
* Reverted it to the old switch case
* Fixed-compiler-error (#194)
* Submitting updates to include new permissions. (#195)
* Submitting updates to include new permissions.
* Make old permissions obsolete and update tests
Co-authored-by: quin lynch <lynchquin@gmail.com>
* Update azure-pipelines.yml
* Update azure-pipelines.yml
* Update azure-pipelines.yml
* Add support for long in autocomplete option
* Add support for sending files with multiple embeds (#196)
* Add support for sending files with multiple embeds
* Simplify prepending single embed to embed array
* Consistency for embeds endpoints (#197)
* Changed the way of handling prepending of embeds.
For consistency.
* reformatted the summary
* Revert pipeline
* Fix duplicate merge conflicts
* Changed minimum slash command name length to 1 per Discord API docs (#198)
* Channel endpoints requirements correction (#199)
* Added some requirements to channels for topic
* Changed check from NotNullOrEmpty to NotNullOrEmpty
* Added some requirements to channels for name
Preconditions.LessThan
* Formatting of file
* Added restriction for description not being null (#200)
* Update azure-pipelines.yml
* Update deploy.yml
* Remove version tag from proj
* Update deploy.yml
* Removed versions from project files
* Removed style of the nuget badge and added logo (#201)
The style was not properly added to it and the plastic version does not look good with the discord badge.
I thought it would look better with a logo
* Fix Type not being set in SocketApplicationCommand
* Remove useless GuildId property
* meta: update XML
* Add Autocomplete to SlashCommandOptionBuilder
* Added autocomplete in SlashCommandOptionBuilder. (#206)
Co-authored-by: Quin Lynch <49576606+quinchs@users.noreply.github.com>
* Fix duplicate autocomplete
* Fix#208
* Fix sub commands being interpreted as a parameter for autocomplete
* Fix exposed optional
* Support the discord:// protocol in buttons (#207)
* Update UrlValidation.cs
* Update ComponentBuilder.cs
* Add docs and better error messages.
* Fix wonky intentation
* Add competing activity status type (#205)
* Update GuildPermissionsTests.cs
* Update GuildPermissions.cs
* Add competing status type
* Add Icons to IRole (#204)
* Added icon field to IRole
* Added GetGuildRoleIconUrl()
* Added Clean Content Function (#174)
* Added Clean Content Function
* Fixed Spelling problems and bad var handling
* Add StripMarkDown Method
* Clean Content Expanded (#212)
* Implement CleanContent In IMessage & RestMessage
* Update Spelling and Documentation
* Add SanatizeMessage to MessageHelper and Refactor Rest and Socket Message
* Add event for autocomplete interaction (#214)
* Spelling corrections (#215)
* Remove null collections
* Followup with file async warnings (#216)
* Changed from NotNullOrWhitespace to NotNullOrEmpty
* Added NotNullOrEmpty on filename
* Added system to interpret from the path
* Added a check for if it contains a period
* It has been done, how ever it will break stuff
* Changed to use ??= how ever still added error check
* Added space under check
* Changed from with a period to valid file extension
* Added checks for SendFileAsync
* Removed filename != null &&
* Add channel types in application command options. (#217)
* add channel types in application command options
* Indent Docs
* Stage instance audit logs as well as thread audit log type
* Update azure-pipelines.yml
* Update azure-pipelines.yml
* Fix system messages not including mentioned users. Added ContextMenuCommand message type
* Remove file extension check (#218)
* Fix NRE in modify guild channel
* Fix 429's not being accounted for in ratelimit updates
* meta: add net5 framework
Co-Authored-By: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>
* Proper doc logos (#221)
* Update GuildPermissionsTests.cs
* Update GuildPermissions.cs
* Add competing activity status type
* logo changes
* logo text as path
* add missing logo
* Update package logo and favicon
* Update docfx references
* Remove XML files and use original pipeline format
* Remove console writeline
* Remove Console.WriteLine
* Remove useless log
* Rename Available sticker field to IsAvailable
* Rename Available to IsAvailable in stickers
* Add summary indent for role members
* Add summary indent to SocketInvite
* Rename DefaultPermission to IsDefaultPermission
* Rename Default to IsDefault and Required to IsRequired in IApplicationCommandOption
* Rename Default and Required to IsDefault and IsRequired in IApplicationCommandOption. Rename DefaultPermission to IsDefaultPermission in IApplicationCommand
* Remove extra white spaces
* Renamed Joined, Archived, and Locked to HasJoined, IsArchived, and IsLocked
* Rename Live and DiscoverableDisabled to IsDiscoverableDisabled and IsLive in IStageChannel
* Remove newline
* Add indent to summaries
* Remove unnecessary json serializer field
* Fix ToEntity for roletags incorrectly using IsPremiumSubscriber
* Update RestChannel for new channel types
* Fix different rest channels not deserializing properly
* fully qualify internal for UrlValidation and add indent to summary
* Add missing periods to InteractionResponseType
* Fix summary in IApplicationCommandOptionChoice
* Update IApplicationCommandOption summaries
* Update IApplicationCommandInteractionDataOption summaries
* Update IApplicationCommandInteractionData summaries
* Update IApplicationCommand summaries
* Update ApplicationCommandType summaries
* rename DefaultPermission to IsDefaultPermission in ApplicationCommandProperties
* update ApplicationCommandOptionChoiceProperties summaries
* Rename Default, Required, and Autocomplete to IsDefault, IsRequired, and IsAutocomplete in ApplicationCommandOptionProperties
* Update SlashCommandProperties summaries
* update SlashCommandBuilder boolean field names, summaries, and choice parameters
* Update SelectMenuOption summaries, Rename Default to IsDefault in SelectMenuOption
* update SelectMenuComponent summaries. Rename Disabled to IsDisabled in SelectMenuComponent
* update ComponentBuilder summaries and boolean fields.
* Update ButtonComponent summaries and boolean fields
* update ActionRowComponent summaries
* Update UserCommandBuilder
* Update MessageCommandBuilder summaries and boolean properties
* Update IGuild summary
* Update IGuild summaries
* Update StagePrivacyLevel summary
* update IThreadChannel summaries
* Update IStageChannel summaries
* Refactor summaries and boolean property names
* General cleanup (#223)
* General cleanup
* Add Async suffix to SendAutocompleteResult
* Fix more formatting
* Fix unused RequestOptions in GetActiveThreadsAsync
* Add message to ArgumentNullException
* Ephemeral attachments
* Add missing jsonproperty attribute
* Add IMessage.Interaction
* Update attachment checks for embed urls
* meta: bump version
* Remove old package configs and update image
* Update package logos
* Fix logo reference for azure
* Deprecate old package definitions in favor for target file
* Deprecate old package definitions in favor for target file
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
* Update package ids
* Fix url validation
* meta: bump version
* Fix assignment of UserMentions (#233)
* Fix CleanContent (#231)
* Fix SocketSlashCommandData access modifier. (#237)
Fixes#229
* Update README with better header (#232)
* Update README with better header
Adds HTML elements that implement the main logo & improve the redirection tag positions.
* Resolving border issue in light-mode
* Update sponsor section
* Implement checks for interaction respond times and multiple interaction responses. closes#236, #235
* Add response check to socket auto complete
* meta: bump versions
* Fix#239
* meta: bump version
* meta: update logo
* meta: bump versions
* Revert received at time, confirmed by discord staff to be accurate
* Merge branch 'release/3.x' of https://github.com/Discord-Net-Labs/Discord.Net-Labs into merger-labs
Update requested changes of obsolete and references to labs.
Added `Interaction` to `IMessage`
Fixed grammar
Fixed bugs relating to interactions.
* Update docs
* Update CHANGELOG.md
* meta: docs building
* Update docs.yml
* Update docs.yml
* Fix docfx version
* Update docs.yml
* Update docs.bat
* Rename docs repo for clone
* update docfx version
* Update docs.bat
* Update docfx version
* Remove docs from pipeline
* FAQ revamped, metadata updated (#241)
* FAQ revamped, metadata updated
* Update FAQ.md
* Update README.md
* Docs index improvement
* Fix InvalidOperationException in modify channel
* feature: guild avatars, closes#238
* feature: modify role icons
* meta: changelog
* meta: bump version
* Update README.md
* Fix non value type options not being included in autocomplete
* Add new activity flags (#254)
* Add new activity flags
* Add missing commas
* Added support for GUILD_JOIN_REQUEST_DELETE event (#253)
Fixes#247
* Adding BotHTTPInteraction user flag (#252)
* animated guild banner support (#255)
* Docs work (WIP) (#242)
* Main page work
* Metadata logo dir
* More main page edits
* Naming change
* Dnet guide entries pruned
* Add student hub guild directory channel (#256)
* animated guild banner support
* Add guild directory channel
* Fix followup with file overwrite having incorrect parameter locations
* Merge labs 3.x
* Update GUILD_JOIN_REQUEST_DELETE event
* Update head.tmpl.partial
* Removed BannerId and AccentColor (#260)
* Removed BannerId property, GetBannerURL method, and AccentColor property from IUser and socket entities.
* Fixed errors in IUser.cs
* Added back summary for GetAvatarUrl method in IUser.cs
* Support Guild Boost Progress Bars (#262)
* Support Guild Boost Progress Bars
* Update SocketChannel.cs
* Fix non-optional and unnecessary values.
* Spelling
* Reordering and consistency.
* Remove log for reconnect
* Add missing flags to SystemChannelMessageDeny (#267)
* Fix labs reference in analyzer project and provider project
* Rename new activity flags
* Guild feature revamp and smart gateway intent checks
* Get thread user implementation
* Amend creating slash command guide (#269)
* Adding BotHTTPInteraction user flag
* Added comments explaining the Global command create stipulations.
* Fix numeric type check for options
* Add state checking to ConnectionManager.StartAsync (#272)
* initial interface changes
* Multi file upload + attachment editing
* meta: bump versions
* Update CHANGELOG.md
* Update CHANGELOG.md
* Support Min and Max values on ApplicationCommandOptions (#273)
* Support Min and Max values on ApplicationCommandOptions
* Support decimal min/max values
* Docs imrpovments + use ToNullable
* Logomark, doc settings edit (#258)
* Logomark, doc settings edit
* Replace standard logo
* Bumping docfx plugins to latest release
* Bump version metadata
* Logo svg fix
* Change default sticker behavior and add AlwaysResolveSticker to the config
* Implement rest based interactions. Added ED25519 checks. Updated summaries.
* Update package logo
* Automatically fix ordering of optional command options (#276)
* auto fix optional command option order
* clean up indentation
* Fix maximum number of Select Menu Options (#282)
As of https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-menu-structure the maximum number of options is 25, not less than 25. Hopefully the change catches all necessary locations
* Add voice region to modify voice channels
* Update summaries on rest interactions
* Interaction Specific Interfaces (#283)
* added interaction specific interfaces
* fix build error
* implement change requests
* Update application
* Add Guild Scheduled Events (#279)
* guild events initial
* sharded events
* Add new gateway intents and fix bugs
* More work on new changes to guild events
* Update guild scheduled events
* Added events to extended guild and add event start event
* Update preconditions
* Implement breaking changes guild guild events. Add guild event permissions
* Update tests and change privacy level requirements
* Update summaries and add docs for guild events
* meta: bump version
* Increment meta version (#285)
* Increment meta version
* Update docfx.json
* Fix#289 and add configureawaits to rest based interactions
* meta: bump version
* Add GUILD_SCHEDULED_EVENT_USER_ADD and GUILD_SCHEDULED_EVENT_USER_REMOVE (#287)
* Remove newline
* Fix autocomplete result value
* meta: bump versions
* Add `GuildScheduledEventUserAdd` and `GuildScheduledEventUserRemove` to sharded client
* Make RestUserCommand public (#292)
* Fix Components not showing on FUWF (#288) (#293)
Adds Components to Payload JSON Generation
* Implement smarter rest resolvable interaction data. Fixes#294
* Add UseInteractionSnowflakeDate to config #286
* Implement Better Discord Errors (#291)
* Initial error parsing
* Implement better errors
* Add missing error codes
* Add voice disconnect opcodes
* Remove unused class, add summaries to discordjsonerror, and remove public constructor of slash command properties
* Add error code summary
* Update error message summary
* Update src/Discord.Net.Core/DiscordJsonError.cs
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
* Update src/Discord.Net.WebSocket/API/Voice/VoiceCloseCode.cs
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
* Fix autocomplete result value
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
* Change the minimum length of slash commands to 1 (#284)
* Change the minimum length of slash commands to 1. This is the correct value according to the docs and it has been changed after user feedback.
* Fix the limit in 3 other places
Co-authored-by: quin lynch <lynchquin@gmail.com>
* Add new thread creation properties
* Add role emoji. Fixes#295
* Fix mocked text channel
* Fix precondition checks. Closes#281
* Initial fix (#297)
* meta: bump version
* Update from release/3.x
* Remove more labs references
* Remove doc file for Discord.Net.Analyzers
Co-authored-by: Simon Hjorthøj <sh2@live.dk>
Co-authored-by: drobbins329 <drobbins329@gmail.com>
Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com>
Co-authored-by: d4n3436 <dan3436@hotmail.com>
Co-authored-by: Will <WilliamWelsh@users.noreply.github.com>
Co-authored-by: Eugene Garbuzov <kkxo.mail@gmail.com>
Co-authored-by: CottageDwellingCat <80918250+CottageDwellingCat@users.noreply.github.com>
Co-authored-by: Emily <89871431+emillly-b@users.noreply.github.com>
Co-authored-by: marens101 <marens101@gmail.com>
Co-authored-by: Jared L <48422312+lhjt@users.noreply.github.com>
Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com>
Co-authored-by: Bill <billchirico@gmail.com>
Co-authored-by: Liege72 <65319395+Liege72@users.noreply.github.com>
Co-authored-by: Floowey <floowey@gmx.at>
Co-authored-by: Cenk Ergen <57065323+Cenngo@users.noreply.github.com>
Co-authored-by: exsersewo <exsersewo@systemexit.co.uk>
Co-authored-by: Dennis Fischer <fischer_dennis@live.de>
.NET Core 1.1 does not support WebSockets on Win7 and earlier. This issue has been fixed since the release of .NET Core 2.1. It is recommended to target .NET Core 2.1 or above for your project if you wish to run your bot on legacy platforms; alternatively, you may choose to install the [Discord.Net.Providers.WS4Net](https://www.nuget.org/packages/Discord.Net.Providers.WS4Net/) package.
Ratelimits are a core concept of any API - Discords API is no exception. each verified library must follow the ratelimit guidelines.
### Using the ratelimit callback
There is a new property within `RequestOptions` called RatelimitCallback. This callback is called when a request is made via the rest api. The callback is called with a `IRateLimitInfo` parameter:
| IsGlobal | bool | Whether or not this ratelimit info is global. |
| Limit | int? | The number of requests that can be made. |
| Remaining | int? | The number of remaining requests that can be made. |
| RetryAfter | int? | The total time (in seconds) of when the current rate limit bucket will reset. Can have decimals to match previous millisecond ratelimit precision. |
| Reset | DateTimeOffset? | The time at which the rate limit resets. |
| ResetAfter | TimeSpan? | The absolute time when this ratelimit resets. |
| Bucket | string | A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path). |
| Lag | TimeSpan? | The amount of lag for the request. This is used to denote the precise time of when the ratelimit expires. |
| Endpoint | string | The endpoint that this ratelimit info came from. |
Let's set up a ratelimit callback that will print out the ratelimit info to the console.
```cs
public async Task MyRatelimitCallback(IRateLimitInfo info)
You can get a collection of users who are currently interested in the event by calling `GetUsersAsync`. This method works like any other get users method as in it returns an async enumerable. This method also supports pagination by user id.
```cs
// get all users and flatten the result into one collection.
var users = await event.GetUsersAsync().FlattenAsync();
// get users around the 613425648685547541 id.
var aroundUsers = await event.GetUsersAsync(613425648685547541, Direction.Around).FlattenAsync();
Welcome! This guide will show you how to use application commands.
## What is an application command?
Application commands consist of three different types. Slash commands, context menu User commands and context menu Message commands.
Slash commands are made up of a name, description, and a block of options, which you can think of like arguments to a function. The name and description help users find your command among many others, and the options validate user input as they fill out your command.
Message and User commands are only a name, to the user. So try to make the name descriptive. They're accessed by right clicking (or long press, on mobile) a user or a message, respectively.
All three varieties of application commands have both Global and Guild variants. Your global commands are available in every guild that adds your application. You can also make commands for a specific guild; they're only available in that guild. The User and Message commands are more limited in quantity than the slash commands. For specifics, check out their respective guide pages.
An Interaction is the message that your application receives when a user uses a command. It includes the values that the user submitted, as well as some metadata about this particular instance of the command being used: the guild_id, channel_id, member and other fields. You can find all the values in our data models.
## Authorizing your bot for application commands
There is a new special OAuth2 scope for applications called `applications.commands`. In order to make Application Commands work within a guild, the guild must authorize your application with the `applications.commands` scope. The bot scope is not enough.
Head over to your discord applications OAuth2 screen and make sure to select the `application.commands` scope.
There are two kinds of Context Menu Commands: User Commands and Message Commands.
Each of these have a Global and Guild variant.
Global menu commands are available for every guild that adds your app. An individual app's global commands are also available in DMs if that app has a bot that shares a mutual guild with the user.
Guild commands are specific to the guild you specify when making them. Guild commands are not available in DMs. Command names are unique per application within each scope (global and guild). That means:
- Your app cannot have two global commands with the same name
- Your app cannot have two guild commands within the same name on the same guild
- Your app can have a global and guild command with the same name
- Multiple apps can have commands with the same names
**Note**: Apps can have a maximum of 5 global context menu commands, and an additional 5 guild-specific context menu commands per guild.
If you don't have the code for a bot ready yet please follow [this guide](https://docs.stillu.cc/guides/getting_started/first-bot.html).
## UserCommandBuilder
The context menu user command builder will help you create user commands. The builder has these available fields and methods:
// Now that we have our builder, we can call the BulkOverwriteApplicationCommandAsync to make our context commands. Note: this will overwrite all your previous commands with this array.
// If our command was invalid, we should catch an ApplicationCommandException. This exception contains the path of the error as well as the error message. You can serialize the Error field in the exception to get a visual of where your error is.
var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented);
// You can send this error somewhere or just print it to the console, for this example we're just going to print it.
Console.WriteLine(json);
}
}
```
> [!NOTE]
> Application commands only need to be created once. They do _not_ have to be 'created' on every startup or connection. The example simple shows creating them in the ready event as it's simpler than creating normal bot commands to register application commands.
User commands and Message commands have their own unique event just like the other interaction types. For user commands the event is `UserCommandExecuted` and for message commands the event is `MessageCommandExecuted`.
There are two kinds of Slash Commands: global commands and guild commands.
Global commands are available for every guild that adds your app. An individual app's global commands are also available in DMs if that app has a bot that shares a mutual guild with the user.
Guild commands are specific to the guild you specify when making them. Guild commands are not available in DMs. Command names are unique per application within each scope (global and guild). That means:
- Your app cannot have two global commands with the same name
- Your app cannot have two guild commands within the same name on the same guild
- Your app can have a global and guild command with the same name
- Multiple apps can have commands with the same names
**Note**: Apps can have a maximum of 100 global commands, and an additional 100 guild-specific commands per guild.
**Note**: Global commands will take up to 1 hour to create, delete or modify on guilds. If you need to update a command quickly for testing you can create it as a guild command.
If you don't have the code for a bot ready yet please follow [this guide](https://docs.stillu.cc/guides/getting_started/first-bot.html).
## SlashCommandBuilder
The slash command builder will help you create slash commands. The builder has these available fields and methods:
// Using the ready event is a simple implementation for the sake of the example. Suitable for testing and development.
// For a production bot, it is recommended to only run the CreateGlobalApplicationCommandAsync() once for each command.
}
catch(ApplicationCommandException exception)
{
// If our command was invalid, we should catch an ApplicationCommandException. This exception contains the path of the error as well as the error message. You can serialize the Error field in the exception to get a visual of where your error is.
var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented);
// You can send this error somewhere or just print it to the console, for this example we're just going to print it.
Console.WriteLine(json);
}
}
```
> [!NOTE]
> Slash commands only need to be created once. They do _not_ have to be 'created' on every startup or connection. The example simple shows creating them in the ready event as it's simpler than creating normal bot commands to register slash commands. The global commands take up to an hour to register every time the CreateGlobalApplicationCommandAsync() is called for a given command.
Interactions are the base thing sent over by Discord. Slash commands are one of the interaction types. We can listen to the `SlashCommandExecuted` event to respond to them. Lets add this to our code:
With every type of interaction there is a `Data` field. This is where the relevant information lives about our command that was executed. In our case, `Data` is a `SocketSlashCommandData` instance. In the data class, we can access the name of the command triggered as well as the options if there were any. For this example, we're just going to respond with the name of the command executed.
> After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using `RespondAsync()` or you can choose to send a deferred response with `DeferAsync()`.
> If choosing a deferred response, the user will see a loading state for the interaction, and you'll have up to 15 minutes to edit the original deferred response using `ModifyOriginalResponseAsync()`. You can read more about response types [here](https://discord.com/developers/docs/interactions/slash-commands#interaction-response)
This seems to be working! Next, we will look at parameters for slash commands.
What is an ephemeral response? Basically, only the user who executed the command can see the result of it, this is pretty simple to implement.
> [!NOTE]
> You don't have to run arg.DeferAsync() to capture the interaction, you can use arg.RespondAsync() with a message to capture it, this also follows the ephemeral rule.
When responding with either `FollowupAsync` or `RespondAsync` you can pass in an `ephemeral` property. When setting it to true it will respond ephemerally, false and it will respond non-ephemerally.
Subcommands allow you to have multiple commands available in a single command. They can be useful for representing sub options for a command. For example: A settings command. Let's first look at some limitations with subcommands set by discord.
- An app can have up to 25 subcommand groups on a top-level command
- An app can have up to 25 subcommands within a subcommand group
- commands can have up to 25 `options`
- options can have up to 25 `choices`
```
VALID
command
|
|__ subcommand
|
|__ subcommand
----
command
|
|__ subcommand-group
|
|__ subcommand
|
|__ subcommand-group
|
|__ subcommand
-------
INVALID
command
|
|__ subcommand-group
|
|__ subcommand-group
|
|__ subcommand-group
|
|__ subcommand-group
----
INVALID
command
|
|__ subcommand
|
|__ subcommand-group
|
|__ subcommand
|
|__ subcommand-group
```
Let's write a settings command that can change 3 fields in our bot.
```cs
public string FieldA { get; set; } = "test";
public int FieldB { get; set; } = 10;
public bool FieldC { get; set; } = true;
public async Task Client_Ready()
{
ulong guildId = 848176216011046962;
var guildCommand = new SlashCommandBuilder()
.WithName("settings")
.WithDescription("Changes some settings within the bot.")
With slash command options you can add choices, making the user select between some set values. Lets create a command that asks how much they like our bot!
Let's set up our slash command:
```cs
private async Task Client_Ready()
{
ulong guildId = 848176216011046962;
var guildCommand = new SlashCommandBuilder()
.WithName("feedback")
.WithDescription("Tell us how much you are enjoying this bot!")
.AddOption(new SlashCommandOptionBuilder()
.WithName("rating")
.WithDescription("The rating your willing to give our bot")
var json = JsonConvert.SerializeObject(exception.Error, Formatting.Indented);
Console.WriteLine(json);
}
}
```
> [!NOTE]
> Your `ApplicationCommandOptionType` specifies which type your choices are, you need to use `ApplicationCommandOptionType.Integer` for choices whos values are whole numbers, `ApplicationCommandOptionType.Number` for choices whos values are doubles, and `ApplicationCommandOptionType.String` for string values.
We have defined 5 choices for the user to pick from, each choice has a value assigned to it. The value can either be a string or an int. In our case we're going to use an int. This is what the command looks like:
Message components are a framework for adding interactive elements to a message your app or bot sends. They're accessible, customizable, and easy to use.
## What is a Component
Components are a new parameter you can use when sending messages with your bot. There are currently 2 different types of components you can use: Buttons and Select Menus.
## Creating components
Lets create a simple component that has a button. First thing we need is a way to trigger the message, this can be done via commands or simply a ready event. Lets make a command that triggers our button message.
```cs
[Command("spawner")]
public async Task Spawn()
{
// Reply with some components
}
```
We now have our command, but we need to actually send the buttons with the command. To do that, lets look at the `ComponentBuilder` class:
| label | `string` | The label text for the button. |
| customId | `string` | The custom id of the button. |
| style | `ButtonStyle` | The style of the button. |
| emote | `IEmote` | A IEmote to be used with this button. |
| url | `string` | A URL to be used only if the `ButtonStyle` is a Link. |
| disabled | `bool` | Whether or not the button is disabled. |
| row | `int` | The row to place the button if it has enough room, otherwise 0 |
### Label
This is the front facing text that the user sees. The maximum length is 80 characters.
### CustomId
This is the property sent to you by discord when a button is clicked. It is not required for link buttons as they do not emit an event. The maximum length is 100 characters.
### Style
Styling your buttons are important for indicating different actions:

You can do this by using the `ButtonStyle` which has all the styles defined.
### Emote
You can specify an `IEmote` when creating buttons to add them to your button. They have the same restrictions as putting guild based emotes in messages.
### Url
If you use the link style with your button you can specify a url. When this button is clicked the user is taken to that url.
### Disabled
You can specify if your button is disabled, meaning users won't be able to click on it.
Lets handle the selection of an option, We can hook the `SelectMenuExecuted` event to handle our select menu:
```cs
client.SelectMenuExecuted += MyMenuHandler;
```
The `SelectMenuExecuted` also supplies a `SocketMessageComponent` argument, we can confirm that its a select menu by checking the `ComponentType` inside of the data field if we need, but the library will do that for us and only execute our handler if its a select menu.
The values that the user has selected will be inside of the `Values` collection in the Data field. we can list all of them back to the user for this example.
```cs
public async Task MyMenuHandler(SocketMessageComponent arg)
{
var text = string.Join(", ", arg.Data.Values);
await arg.RespondAsync($"You have selected {text}");
Lets say you have some components on an ephemeral slash command, and you want to modify the message that the button is on. The issue with this is that ephemeral messages are not stored and can not be get via rest or other means.
Luckily, Discord thought of this and introduced a way to modify them with interactions.
### Using the UpdateAsync method
Components come with an `UpdateAsync` method that can update the message that the component was on. You can use it like a `ModifyAsync` method.
Lets use it with a command, we first create our command, in this example im just going to use a message command:
var firstMultipleParam = _parameters.FirstOrDefault(x => x.IsMultiple);
if ((firstMultipleParam != null) && (firstMultipleParam != lastParam))
throw new InvalidOperationException($"Only the last parameter in a command may have the Multiple flag. Parameter: {firstMultipleParam.Name} in {PrimaryAlias}");
var firstRemainderParam = _parameters.FirstOrDefault(x => x.IsRemainder);
if ((firstRemainderParam != null) && (firstRemainderParam != lastParam))
throw new InvalidOperationException($"Only the last parameter in a command may have the Remainder flag. Parameter: {firstRemainderParam.Name} in {PrimaryAlias}");
//If we get this far, at least one parse was successful. Execute the most likely overload.
var chosenOverload = successfulParses[0];
var result = await chosenOverload.Key.ExecuteAsync(context, chosenOverload.Value, services).ConfigureAwait(false);
if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // succesful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deffered execution)
if (!result.IsSuccess && !(result is RuntimeResult || result is ExecuteResult)) // successful results raise the event in CommandInfo#ExecuteInternalAsync (have to raise it there b/c deferred execution)
StickerFormatType.None or StickerFormatType.Png or StickerFormatType.Apng => "png", // In the case of the Sticker endpoint, the sticker will be available as PNG if its format_type is PNG or APNG, and as Lottie if its format_type is LOTTIE.
StickerFormatType.Lottie => "lottie",
_ => throw new ArgumentException(nameof(format)),
};
}
private static string FormatToExtension(ImageFormat format, string imageId)
{
if (format == ImageFormat.Auto)
format = imageId.StartsWith("a_") ? ImageFormat.Gif : ImageFormat.Png;
/// The guild has access to set an animated guild icon.
/// </summary>
AnimatedIcon = 1 << 0,
/// <summary>
/// The guild has access to set a guild banner image.
/// </summary>
Banner = 1 << 1,
/// <summary>
/// The guild has access to use commerce features (i.e. create store channels).
/// </summary>
Commerce = 1 << 2,
/// <summary>
/// The guild can enable welcome screen, Membership Screening, stage channels and discovery, and receives community updates.
/// </summary>
Community = 1 << 3,
/// <summary>
/// The guild is able to be discovered in the directory.
/// </summary>
Discoverable = 1 << 4,
/// <summary>
/// The guild is able to be featured in the directory.
/// </summary>
Featureable = 1 << 5,
/// <summary>
/// The guild has access to set an invite splash background.
/// </summary>
InviteSplash = 1 << 6,
/// <summary>
/// The guild has enabled <seealso href="https://discord.com/developers/docs/resources/guild#membership-screening-object">Membership Screening</seealso>.
/// </summary>
MemberVerificationGateEnabled = 1 << 7,
/// <summary>
/// The guild has enabled monetization.
/// </summary>
MonetizationEnabled = 1 << 8,
/// <summary>
/// The guild has increased custom sticker slots.
/// </summary>
MoreStickers = 1 << 9,
/// <summary>
/// The guild has access to create news channels.
/// </summary>
News = 1 << 10,
/// <summary>
/// The guild is partnered.
/// </summary>
Partnered = 1 << 11,
/// <summary>
/// The guild can be previewed before joining via Membership Screening or the directory.
/// </summary>
PreviewEnabled = 1 << 12,
/// <summary>
/// The guild has access to create private threads.
/// </summary>
PrivateThreads = 1 << 13,
/// <summary>
/// The guild is able to set role icons.
/// </summary>
RoleIcons = 1 << 14,
/// <summary>
/// The guild has access to the seven day archive time for threads.
/// </summary>
SevenDayThreadArchive = 1 << 15,
/// <summary>
/// The guild has access to the three day archive time for threads.
/// </summary>
ThreeDayThreadArchive = 1 << 16,
/// <summary>
/// The guild has enabled ticketed events.
/// </summary>
TicketedEventsEnabled = 1 << 17,
/// <summary>
/// The guild has access to set a vanity URL.
/// </summary>
VanityUrl = 1 << 18,
/// <summary>
/// The guild is verified.
/// </summary>
Verified = 1 << 19,
/// <summary>
/// The guild has access to set 384kbps bitrate in voice (previously VIP voice servers).
var vals = Enum.GetValues(typeof(GuildFeature)).Cast<GuildFeature>();
var missingValues = vals.Where(x => feature.HasFlag(x) && !Value.HasFlag(x));
throw new InvalidOperationException($"Missing required guild feature{(missingValues.Count() > 1 ? "s" : "")} {string.Join(", ", missingValues.Select(x => x.ToString()))} in order to execute this operation.");
/// <param name="name">The new name for the category.</param>
@@ -703,6 +778,12 @@ namespace Discord
/// <returns>A guild user associated with the specified <paramref name="userId" />; <see langword="null" /> if the user is already in the guild.</returns>
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.