commit dca41a348e
Author: quin lynch <lynchquin@gmail.com>
Date: Thu Sep 23 07:02:19 2021 -0300
Autocomplete commands
pull/1923/head
| @@ -1,4 +1,4 @@ | |||||
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <Project Sdk="Microsoft.NET.Sdk"> | |||||
| <Import Project="../../Discord.Net.targets" /> | <Import Project="../../Discord.Net.targets" /> | ||||
| <Import Project="../../StyleAnalyzer.targets" /> | <Import Project="../../StyleAnalyzer.targets" /> | ||||
| <PropertyGroup> | <PropertyGroup> | ||||
| @@ -4508,37 +4508,42 @@ | |||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Name"> | <member name="P:Discord.ApplicationCommandOptionProperties.Name"> | ||||
| <summary> | <summary> | ||||
| The name of this option. | |||||
| Gets or sets the name of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Description"> | <member name="P:Discord.ApplicationCommandOptionProperties.Description"> | ||||
| <summary> | <summary> | ||||
| The description of this option. | |||||
| Gets or sets the description of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Type"> | <member name="P:Discord.ApplicationCommandOptionProperties.Type"> | ||||
| <summary> | <summary> | ||||
| The type of this option. | |||||
| Gets or sets the type of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Default"> | <member name="P:Discord.ApplicationCommandOptionProperties.Default"> | ||||
| <summary> | <summary> | ||||
| The first required option for the user to complete. only one option can be default. | |||||
| Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Required"> | <member name="P:Discord.ApplicationCommandOptionProperties.Required"> | ||||
| <summary> | <summary> | ||||
| <see langword="true"/> if this option is required for this command, otherwise <see langword="false"/>. | |||||
| Gets or sets if the option is required. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Autocomplete"> | |||||
| <summary> | |||||
| Gets or sets whether or not this option supports autocomplete | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Choices"> | <member name="P:Discord.ApplicationCommandOptionProperties.Choices"> | ||||
| <summary> | <summary> | ||||
| choices for string and int types for the user to pick from. | |||||
| Gets or sets the choices for string and int types for the user to pick from. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.ApplicationCommandOptionProperties.Options"> | <member name="P:Discord.ApplicationCommandOptionProperties.Options"> | ||||
| <summary> | <summary> | ||||
| If the option is a subcommand or subcommand group type, this nested options will be the parameters. | |||||
| Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.ApplicationCommandOptionChoiceProperties"> | <member name="T:Discord.ApplicationCommandOptionChoiceProperties"> | ||||
| @@ -4649,6 +4654,68 @@ | |||||
| ApplicationCommandType.Message is Context Menu Message command type | ApplicationCommandType.Message is Context Menu Message command type | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.AutocompleteOption"> | |||||
| <summary> | |||||
| Represents an autocomplete option. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteOption.Type"> | |||||
| <summary> | |||||
| Gets the type of this option | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteOption.Name"> | |||||
| <summary> | |||||
| Gets the name of the option. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteOption.Value"> | |||||
| <summary> | |||||
| Gets the value of the option. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteOption.Focused"> | |||||
| <summary> | |||||
| Gets whether or not this option is focused by the executing user. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.AutocompleteResult"> | |||||
| <summary> | |||||
| Represents a result to an autocomplete interaction. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteResult.Name"> | |||||
| <summary> | |||||
| Gets or sets the name of the result. | |||||
| </summary> | |||||
| <remarks> | |||||
| Name cannot be null and has to be between 1-100 characters in length. | |||||
| </remarks> | |||||
| <exception cref="T:System.ArgumentNullException"/> | |||||
| <exception cref="T:System.ArgumentException"/> | |||||
| </member> | |||||
| <member name="P:Discord.AutocompleteResult.Value"> | |||||
| <summary> | |||||
| Gets or sets the value of the result. | |||||
| </summary> | |||||
| <remarks> | |||||
| Only <see cref="T:System.String"/>, <see cref="T:System.Int32"/>, and <see cref="T:System.Double"/> are allowed for a value. | |||||
| </remarks> | |||||
| <exception cref="T:System.ArgumentNullException"/> | |||||
| <exception cref="T:System.ArgumentException"/> | |||||
| </member> | |||||
| <member name="M:Discord.AutocompleteResult.#ctor"> | |||||
| <summary> | |||||
| Creates a new <see cref="T:Discord.AutocompleteResult"/>. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="M:Discord.AutocompleteResult.#ctor(System.String,System.Object)"> | |||||
| <summary> | |||||
| Creates a new <see cref="T:Discord.AutocompleteResult"/> with the passed in <paramref name="name"/> and <paramref name="value"/>. | |||||
| </summary> | |||||
| <exception cref="T:System.ArgumentNullException"/> | |||||
| <exception cref="T:System.ArgumentException"/> | |||||
| </member> | |||||
| <member name="T:Discord.MessageCommandBuilder"> | <member name="T:Discord.MessageCommandBuilder"> | ||||
| <summary> | <summary> | ||||
| A class used to build Message commands. | A class used to build Message commands. | ||||
| @@ -5029,12 +5096,17 @@ | |||||
| </member> | </member> | ||||
| <member name="F:Discord.InteractionResponseType.DeferredUpdateMessage"> | <member name="F:Discord.InteractionResponseType.DeferredUpdateMessage"> | ||||
| <summary> | <summary> | ||||
| for components: ACK an interaction and edit the original message later; the user does not see a loading state | |||||
| For components: ACK an interaction and edit the original message later; the user does not see a loading state | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.InteractionResponseType.UpdateMessage"> | <member name="F:Discord.InteractionResponseType.UpdateMessage"> | ||||
| <summary> | <summary> | ||||
| for components: edit the message the component was attached to | |||||
| For components: edit the message the component was attached to | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.InteractionResponseType.ApplicationCommandAutocompleteResult"> | |||||
| <summary> | |||||
| Respond with a set of choices to a autocomplete interaction | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.InteractionType"> | <member name="T:Discord.InteractionType"> | ||||
| @@ -5057,6 +5129,11 @@ | |||||
| A <see cref="T:Discord.IMessageComponent"/> sent from discord. | A <see cref="T:Discord.IMessageComponent"/> sent from discord. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.InteractionType.ApplicationCommandAutocomplete"> | |||||
| <summary> | |||||
| An autocomplete request sent from discord. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.ActionRowComponent"> | <member name="T:Discord.ActionRowComponent"> | ||||
| <summary> | <summary> | ||||
| Represents a <see cref="T:Discord.IMessageComponent"/> Row for child components to live in. | Represents a <see cref="T:Discord.IMessageComponent"/> Row for child components to live in. | ||||
| @@ -5934,7 +6011,7 @@ | |||||
| <param name="value">The default permission value to set.</param> | <param name="value">The default permission value to set.</param> | ||||
| <returns>The current builder.</returns> | <returns>The current builder.</returns> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.SlashCommandBuilder.AddOption(System.String,Discord.ApplicationCommandOptionType,System.String,System.Boolean,System.Boolean,System.Collections.Generic.List{Discord.SlashCommandOptionBuilder},Discord.ApplicationCommandOptionChoiceProperties[])"> | |||||
| <member name="M:Discord.SlashCommandBuilder.AddOption(System.String,Discord.ApplicationCommandOptionType,System.String,System.Boolean,System.Boolean,System.Boolean,System.Collections.Generic.List{Discord.SlashCommandOptionBuilder},Discord.ApplicationCommandOptionChoiceProperties[])"> | |||||
| <summary> | <summary> | ||||
| Adds an option to the current slash command. | Adds an option to the current slash command. | ||||
| </summary> | </summary> | ||||
| @@ -5987,37 +6064,42 @@ | |||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Name"> | <member name="P:Discord.SlashCommandOptionBuilder.Name"> | ||||
| <summary> | <summary> | ||||
| The name of this option. | |||||
| Gets or sets the name of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Description"> | <member name="P:Discord.SlashCommandOptionBuilder.Description"> | ||||
| <summary> | <summary> | ||||
| The description of this option. | |||||
| Gets or sets the description of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Type"> | <member name="P:Discord.SlashCommandOptionBuilder.Type"> | ||||
| <summary> | <summary> | ||||
| The type of this option. | |||||
| Gets or sets the type of this option. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Default"> | <member name="P:Discord.SlashCommandOptionBuilder.Default"> | ||||
| <summary> | <summary> | ||||
| The first required option for the user to complete. only one option can be default. | |||||
| Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Required"> | <member name="P:Discord.SlashCommandOptionBuilder.Required"> | ||||
| <summary> | <summary> | ||||
| <see langword="true"/> if this option is required for this command, otherwise <see langword="false"/>. | |||||
| Gets or sets if the option is required. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.SlashCommandOptionBuilder.Autocomplete"> | |||||
| <summary> | |||||
| Gets or sets whether or not this option supports autocomplete. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Choices"> | <member name="P:Discord.SlashCommandOptionBuilder.Choices"> | ||||
| <summary> | <summary> | ||||
| choices for string and int types for the user to pick from. | |||||
| Gets or sets the choices for string and int types for the user to pick from. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.SlashCommandOptionBuilder.Options"> | <member name="P:Discord.SlashCommandOptionBuilder.Options"> | ||||
| <summary> | <summary> | ||||
| If the option is a subcommand or subcommand group type, this nested options will be the parameters. | |||||
| Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.SlashCommandOptionBuilder.Build"> | <member name="M:Discord.SlashCommandOptionBuilder.Build"> | ||||
| @@ -8876,14 +8958,24 @@ | |||||
| authentication when used on a guild that has server-wide 2FA enabled. | authentication when used on a guild that has server-wide 2FA enabled. | ||||
| </remarks> | </remarks> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.GuildPermission.CreatePublicThreads"> | |||||
| <summary> | |||||
| Allows for creating public threads. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.GuildPermission.CreatePrivateThreads"> | |||||
| <summary> | |||||
| Allows for creating private threads. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.GuildPermission.UsePublicThreads"> | <member name="F:Discord.GuildPermission.UsePublicThreads"> | ||||
| <summary> | <summary> | ||||
| Allows for creating and participating in threads. | |||||
| Allows for creating public threads. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.GuildPermission.UsePrivateThreads"> | <member name="F:Discord.GuildPermission.UsePrivateThreads"> | ||||
| <summary> | <summary> | ||||
| Allows for creating and participating in private threads. | |||||
| Allows for creating private threads. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.GuildPermission.UseExternalStickers"> | <member name="F:Discord.GuildPermission.UseExternalStickers"> | ||||
| @@ -8891,6 +8983,16 @@ | |||||
| Allows the usage of custom stickers from other servers. | Allows the usage of custom stickers from other servers. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="F:Discord.GuildPermission.SendMessagesInThreads"> | |||||
| <summary> | |||||
| Allows for sending messages in threads. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.GuildPermission.StartEmbeddedActivities"> | |||||
| <summary> | |||||
| Allows for launching activities (applications with the EMBEDDED flag) in a voice channel. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="F:Discord.GuildPermissions.None"> | <member name="F:Discord.GuildPermissions.None"> | ||||
| <summary> Gets a blank <see cref="T:Discord.GuildPermissions"/> that grants no permissions. </summary> | <summary> Gets a blank <see cref="T:Discord.GuildPermissions"/> that grants no permissions. </summary> | ||||
| </member> | </member> | ||||
| @@ -9005,25 +9107,31 @@ | |||||
| <member name="P:Discord.GuildPermissions.ManageThreads"> | <member name="P:Discord.GuildPermissions.ManageThreads"> | ||||
| <summary> If <c>true</c>, a user may manage threads in this guild. </summary> | <summary> If <c>true</c>, a user may manage threads in this guild. </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.GuildPermissions.UsePublicThreads"> | |||||
| <member name="P:Discord.GuildPermissions.CreatePublicThreads"> | |||||
| <summary> If <c>true</c>, a user may create public threads in this guild. </summary> | <summary> If <c>true</c>, a user may create public threads in this guild. </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.GuildPermissions.UsePrivateThreads"> | |||||
| <member name="P:Discord.GuildPermissions.CreatePrivateThreads"> | |||||
| <summary> If <c>true</c>, a user may create private threads in this guild. </summary> | <summary> If <c>true</c>, a user may create private threads in this guild. </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.GuildPermissions.UseExternalStickers"> | <member name="P:Discord.GuildPermissions.UseExternalStickers"> | ||||
| <summary> If <c>true</c>, a user may use external stickers in this guild. </summary> | <summary> If <c>true</c>, a user may use external stickers in this guild. </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.GuildPermissions.SendMessagesInThreads"> | |||||
| <summary> If <c>true</c>, a user may send messages in threads in this guild. </summary> | |||||
| </member> | |||||
| <member name="P:Discord.GuildPermissions.StartEmbeddedActivities"> | |||||
| <summary> If <c>true</c>, a user launch application activites in voice channels in this guild. </summary> | |||||
| </member> | |||||
| <member name="M:Discord.GuildPermissions.#ctor(System.UInt64)"> | <member name="M:Discord.GuildPermissions.#ctor(System.UInt64)"> | ||||
| <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> with the provided packed value. </summary> | <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> with the provided packed value. </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.GuildPermissions.#ctor(System.String)"> | <member name="M:Discord.GuildPermissions.#ctor(System.String)"> | ||||
| <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> with the provided packed value after converting to ulong. </summary> | <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> with the provided packed value after converting to ulong. </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.GuildPermissions.#ctor(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)"> | |||||
| <member name="M:Discord.GuildPermissions.#ctor(System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean,System.Boolean)"> | |||||
| <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> structure with the provided permissions. </summary> | <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> structure with the provided permissions. </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.GuildPermissions.Modify(System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean})"> | |||||
| <member name="M:Discord.GuildPermissions.Modify(System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean},System.Nullable{System.Boolean})"> | |||||
| <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> from this one, changing the provided non-null permissions. </summary> | <summary> Creates a new <see cref="T:Discord.GuildPermissions"/> from this one, changing the provided non-null permissions. </summary> | ||||
| </member> | </member> | ||||
| <member name="M:Discord.GuildPermissions.Has(Discord.GuildPermission)"> | <member name="M:Discord.GuildPermissions.Has(Discord.GuildPermission)"> | ||||
| @@ -16,7 +16,7 @@ namespace Discord | |||||
| private string _description; | private string _description; | ||||
| /// <summary> | /// <summary> | ||||
| /// The name of this option. | |||||
| /// Gets or sets the name of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public string Name | public string Name | ||||
| { | { | ||||
| @@ -37,7 +37,7 @@ namespace Discord | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// The description of this option. | |||||
| /// Gets or sets the description of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public string Description | public string Description | ||||
| { | { | ||||
| @@ -53,27 +53,31 @@ namespace Discord | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// The type of this option. | |||||
| /// Gets or sets the type of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public ApplicationCommandOptionType Type { get; set; } | public ApplicationCommandOptionType Type { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// The first required option for the user to complete. only one option can be default. | |||||
| /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. | |||||
| /// </summary> | /// </summary> | ||||
| public bool? Default { get; set; } | public bool? Default { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// <see langword="true"/> if this option is required for this command, otherwise <see langword="false"/>. | |||||
| /// Gets or sets if the option is required. | |||||
| /// </summary> | /// </summary> | ||||
| public bool? Required { get; set; } | public bool? Required { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// choices for string and int types for the user to pick from. | |||||
| /// Gets or sets whether or not this option supports autocomplete. | |||||
| /// </summary> | |||||
| public bool Autocomplete { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the choices for string and int types for the user to pick from. | |||||
| /// </summary> | /// </summary> | ||||
| public List<ApplicationCommandOptionChoiceProperties> Choices { get; set; } | public List<ApplicationCommandOptionChoiceProperties> Choices { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. | |||||
| /// Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. | |||||
| /// </summary> | /// </summary> | ||||
| public List<ApplicationCommandOptionProperties> Options { get; set; } | public List<ApplicationCommandOptionProperties> Options { get; set; } | ||||
| @@ -0,0 +1,42 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord | |||||
| { | |||||
| /// <summary> | |||||
| /// Represents an autocomplete option. | |||||
| /// </summary> | |||||
| public class AutocompleteOption | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the type of this option | |||||
| /// </summary> | |||||
| public ApplicationCommandOptionType Type { get; } | |||||
| /// <summary> | |||||
| /// Gets the name of the option. | |||||
| /// </summary> | |||||
| public string Name { get; } | |||||
| /// <summary> | |||||
| /// Gets the value of the option. | |||||
| /// </summary> | |||||
| public object Value { get; } | |||||
| /// <summary> | |||||
| /// Gets whether or not this option is focused by the executing user. | |||||
| /// </summary> | |||||
| public bool Focused { get; } | |||||
| internal AutocompleteOption(ApplicationCommandOptionType type, string name, object value, bool focused) | |||||
| { | |||||
| this.Type = type; | |||||
| this.Name = name; | |||||
| this.Value = value; | |||||
| this.Focused = focused; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,90 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord | |||||
| { | |||||
| /// <summary> | |||||
| /// Represents a result to an autocomplete interaction. | |||||
| /// </summary> | |||||
| public class AutocompleteResult | |||||
| { | |||||
| private object _value { get; set; } | |||||
| private string _name { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the name of the result. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Name cannot be null and has to be between 1-100 characters in length. | |||||
| /// </remarks> | |||||
| /// <exception cref="ArgumentNullException"/> | |||||
| /// <exception cref="ArgumentException"/> | |||||
| public string Name | |||||
| { | |||||
| get => _name; | |||||
| set | |||||
| { | |||||
| if (value == null) | |||||
| throw new ArgumentException("Name cannot be null!"); | |||||
| if (value.Length > 100) | |||||
| throw new ArgumentException("Name length must be less than or equal to 100 characters in length!"); | |||||
| if (value.Length < 1) | |||||
| throw new ArgumentException("Name length must at least 1 character in length!"); | |||||
| _name = value; | |||||
| } | |||||
| } | |||||
| /// <summary> | |||||
| /// Gets or sets the value of the result. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Only <see cref="string"/>, <see cref="int"/>, and <see cref="double"/> are allowed for a value. | |||||
| /// </remarks> | |||||
| /// <exception cref="ArgumentNullException"/> | |||||
| /// <exception cref="ArgumentException"/> | |||||
| public object Value | |||||
| { | |||||
| get => _value; | |||||
| set | |||||
| { | |||||
| if (value == null) | |||||
| throw new ArgumentNullException("Value cannot be null"); | |||||
| switch (value) | |||||
| { | |||||
| case string str: | |||||
| _value = str; | |||||
| break; | |||||
| case int integer: | |||||
| _value = integer; | |||||
| break; | |||||
| case double number: | |||||
| _value = number; | |||||
| break; | |||||
| default: | |||||
| throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"); | |||||
| } | |||||
| } | |||||
| } | |||||
| /// <summary> | |||||
| /// Creates a new <see cref="AutocompleteResult"/>. | |||||
| /// </summary> | |||||
| public AutocompleteResult() { } | |||||
| /// <summary> | |||||
| /// Creates a new <see cref="AutocompleteResult"/> with the passed in <paramref name="name"/> and <paramref name="value"/>. | |||||
| /// </summary> | |||||
| /// <exception cref="ArgumentNullException"/> | |||||
| /// <exception cref="ArgumentException"/> | |||||
| public AutocompleteResult(string name, object value) | |||||
| { | |||||
| this.Name = name; | |||||
| this.Value = value; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -45,13 +45,18 @@ namespace Discord | |||||
| DeferredChannelMessageWithSource = 5, | DeferredChannelMessageWithSource = 5, | ||||
| /// <summary> | /// <summary> | ||||
| /// for components: ACK an interaction and edit the original message later; the user does not see a loading state | |||||
| /// For components: ACK an interaction and edit the original message later; the user does not see a loading state | |||||
| /// </summary> | /// </summary> | ||||
| DeferredUpdateMessage = 6, | DeferredUpdateMessage = 6, | ||||
| /// <summary> | /// <summary> | ||||
| /// for components: edit the message the component was attached to | |||||
| /// For components: edit the message the component was attached to | |||||
| /// </summary> | /// </summary> | ||||
| UpdateMessage = 7 | |||||
| UpdateMessage = 7, | |||||
| /// <summary> | |||||
| /// Respond with a set of choices to a autocomplete interaction | |||||
| /// </summary> | |||||
| ApplicationCommandAutocompleteResult = 8 | |||||
| } | } | ||||
| } | } | ||||
| @@ -25,5 +25,10 @@ namespace Discord | |||||
| /// A <see cref="IMessageComponent"/> sent from discord. | /// A <see cref="IMessageComponent"/> sent from discord. | ||||
| /// </summary> | /// </summary> | ||||
| MessageComponent = 3, | MessageComponent = 3, | ||||
| /// <summary> | |||||
| /// An autocomplete request sent from discord. | |||||
| /// </summary> | |||||
| ApplicationCommandAutocomplete = 4, | |||||
| } | } | ||||
| } | } | ||||
| @@ -165,7 +165,7 @@ namespace Discord | |||||
| /// <param name="choices">The choices of this option.</param> | /// <param name="choices">The choices of this option.</param> | ||||
| /// <returns>The current builder.</returns> | /// <returns>The current builder.</returns> | ||||
| public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, | public SlashCommandBuilder AddOption(string name, ApplicationCommandOptionType type, | ||||
| string description, bool required = true, bool isDefault = false, List<SlashCommandOptionBuilder> options = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| string description, bool required = true, bool isDefault = false, bool isAutocomplete = false, List<SlashCommandOptionBuilder> options = null, params ApplicationCommandOptionChoiceProperties[] choices) | |||||
| { | { | ||||
| // Make sure the name matches the requirements from discord | // Make sure the name matches the requirements from discord | ||||
| Preconditions.NotNullOrEmpty(name, nameof(name)); | Preconditions.NotNullOrEmpty(name, nameof(name)); | ||||
| @@ -197,6 +197,7 @@ namespace Discord | |||||
| option.Default = isDefault; | option.Default = isDefault; | ||||
| option.Options = options; | option.Options = options; | ||||
| option.Type = type; | option.Type = type; | ||||
| option.Autocomplete = isAutocomplete; | |||||
| option.Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null; | option.Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null; | ||||
| return AddOption(option); | return AddOption(option); | ||||
| @@ -288,7 +289,7 @@ namespace Discord | |||||
| private string _description; | private string _description; | ||||
| /// <summary> | /// <summary> | ||||
| /// The name of this option. | |||||
| /// Gets or sets the name of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public string Name | public string Name | ||||
| { | { | ||||
| @@ -309,7 +310,7 @@ namespace Discord | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// The description of this option. | |||||
| /// Gets or sets the description of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public string Description | public string Description | ||||
| { | { | ||||
| @@ -326,27 +327,32 @@ namespace Discord | |||||
| } | } | ||||
| /// <summary> | /// <summary> | ||||
| /// The type of this option. | |||||
| /// Gets or sets the type of this option. | |||||
| /// </summary> | /// </summary> | ||||
| public ApplicationCommandOptionType Type { get; set; } | public ApplicationCommandOptionType Type { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// The first required option for the user to complete. only one option can be default. | |||||
| /// Gets or sets whether or not this options is the first required option for the user to complete. only one option can be default. | |||||
| /// </summary> | /// </summary> | ||||
| public bool? Default { get; set; } | public bool? Default { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// <see langword="true"/> if this option is required for this command, otherwise <see langword="false"/>. | |||||
| /// Gets or sets if the option is required. | |||||
| /// </summary> | /// </summary> | ||||
| public bool Required { get; set; } | public bool Required { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// choices for string and int types for the user to pick from. | |||||
| /// Gets or sets whether or not this option supports autocomplete. | |||||
| /// </summary> | |||||
| public bool Autocomplete { get; set; } | |||||
| /// <summary> | |||||
| /// Gets or sets the choices for string and int types for the user to pick from. | |||||
| /// </summary> | /// </summary> | ||||
| public List<ApplicationCommandOptionChoiceProperties> Choices { get; set; } | public List<ApplicationCommandOptionChoiceProperties> Choices { get; set; } | ||||
| /// <summary> | /// <summary> | ||||
| /// If the option is a subcommand or subcommand group type, this nested options will be the parameters. | |||||
| /// Gets or sets if this option is a subcommand or subcommand group type, these nested options will be the parameters. | |||||
| /// </summary> | /// </summary> | ||||
| public List<SlashCommandOptionBuilder> Options { get; set; } | public List<SlashCommandOptionBuilder> Options { get; set; } | ||||
| @@ -372,7 +378,8 @@ namespace Discord | |||||
| Required = this.Required, | Required = this.Required, | ||||
| Type = this.Type, | Type = this.Type, | ||||
| Options = this.Options?.Count > 0 ? new List<ApplicationCommandOptionProperties>(this.Options.Select(x => x.Build())) : null, | Options = this.Options?.Count > 0 ? new List<ApplicationCommandOptionProperties>(this.Options.Select(x => x.Build())) : null, | ||||
| Choices = this.Choices | |||||
| Choices = this.Choices, | |||||
| Autocomplete = this.Autocomplete | |||||
| }; | }; | ||||
| } | } | ||||
| @@ -30,6 +30,9 @@ namespace Discord.API | |||||
| [JsonProperty("options")] | [JsonProperty("options")] | ||||
| public Optional<ApplicationCommandOption[]> Options { get; set; } | public Optional<ApplicationCommandOption[]> Options { get; set; } | ||||
| [JsonProperty("autocomplete")] | |||||
| public Optional<bool> Autocomplete { get; set; } | |||||
| public ApplicationCommandOption() { } | public ApplicationCommandOption() { } | ||||
| public ApplicationCommandOption(IApplicationCommandOption cmd) | public ApplicationCommandOption(IApplicationCommandOption cmd) | ||||
| @@ -78,6 +81,7 @@ namespace Discord.API | |||||
| this.Name = option.Name; | this.Name = option.Name; | ||||
| this.Type = option.Type; | this.Type = option.Type; | ||||
| this.Description = option.Description; | this.Description = option.Description; | ||||
| this.Autocomplete = option.Autocomplete; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,27 @@ | |||||
| using Newtonsoft.Json; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.API | |||||
| { | |||||
| internal class AutocompleteInteractionData : IDiscordInteractionData | |||||
| { | |||||
| [JsonProperty("id")] | |||||
| public ulong Id { get; set; } | |||||
| [JsonProperty("name")] | |||||
| public string Name { get; set; } | |||||
| [JsonProperty("type")] | |||||
| public ApplicationCommandType Type { get; set; } | |||||
| [JsonProperty("version")] | |||||
| public ulong Version { get; set; } | |||||
| [JsonProperty("options")] | |||||
| public AutocompleteInteractionDataOption[] Options { get; set; } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| using Newtonsoft.Json; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.API | |||||
| { | |||||
| internal class AutocompleteInteractionDataOption | |||||
| { | |||||
| [JsonProperty("type")] | |||||
| public ApplicationCommandOptionType Type { get; set; } | |||||
| [JsonProperty("name")] | |||||
| public string Name { get; set; } | |||||
| [JsonProperty("value")] | |||||
| public object Value { get; set; } | |||||
| [JsonProperty("focused")] | |||||
| public bool Focused { get; set; } | |||||
| } | |||||
| } | |||||
| @@ -21,5 +21,8 @@ namespace Discord.API | |||||
| [JsonProperty("components")] | [JsonProperty("components")] | ||||
| public Optional<API.ActionRowComponent[]> Components { get; set; } | public Optional<API.ActionRowComponent[]> Components { get; set; } | ||||
| [JsonProperty("choices")] | |||||
| public Optional<API.ApplicationCommandOptionChoice[]> Choices { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -418,6 +418,28 @@ namespace Discord.Rest | |||||
| public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) | public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null) | ||||
| => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); | => await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options); | ||||
| public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable<AutocompleteResult> result, ulong interactionId, | |||||
| string interactionToken, RequestOptions options) | |||||
| { | |||||
| if (result == null) | |||||
| result = new AutocompleteResult[0]; | |||||
| Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!"); | |||||
| var apiArgs = new InteractionResponse() | |||||
| { | |||||
| Type = InteractionResponseType.ApplicationCommandAutocompleteResult, | |||||
| Data = new InteractionCallbackData() | |||||
| { | |||||
| Choices = result.Any() | |||||
| ? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray() | |||||
| : new ApplicationCommandOptionChoice[0] | |||||
| } | |||||
| }; | |||||
| return client.ApiClient.CreateInteractionResponseAsync(apiArgs, interactionId, interactionToken, options); | |||||
| } | |||||
| #endregion | #endregion | ||||
| #region Guild permissions | #region Guild permissions | ||||
| @@ -53,6 +53,13 @@ namespace Discord.Net.Converters | |||||
| interaction.Data = messageComponent; | interaction.Data = messageComponent; | ||||
| } | } | ||||
| break; | break; | ||||
| case InteractionType.ApplicationCommandAutocomplete: | |||||
| { | |||||
| var autocompleteData = new API.AutocompleteInteractionData(); | |||||
| serializer.Populate(result.CreateReader(), autocompleteData); | |||||
| interaction.Data = autocompleteData; | |||||
| } | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -3961,6 +3961,98 @@ | |||||
| The value(s) of a <see cref="T:Discord.SelectMenuComponent"/> interaction response. | The value(s) of a <see cref="T:Discord.SelectMenuComponent"/> interaction response. | ||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="T:Discord.WebSocket.SocketAutocompleteInteraction"> | |||||
| <summary> | |||||
| Represents a <see cref="F:Discord.InteractionType.ApplicationCommandAutocomplete"/> received over the gateway. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteraction.Data"> | |||||
| <summary> | |||||
| The autocomplete data of this interaction. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.RespondAsync(System.Collections.Generic.IEnumerable{Discord.AutocompleteResult},Discord.RequestOptions)"> | |||||
| <summary> | |||||
| Responds to this interaction with a set of choices. | |||||
| </summary> | |||||
| <param name="result"> | |||||
| The set of choices for the user to pick from. | |||||
| <remarks> | |||||
| A max of 20 choices are allowed. Passing <see langword="null"/> for this argument will show the executing user that | |||||
| there is no choices for their autocompleted input. | |||||
| </remarks> | |||||
| </param> | |||||
| <param name="options">The request options for this response.</param> | |||||
| <returns> | |||||
| A task that represents the asynchronous operation of responding to this interaction. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.RespondAsync(Discord.RequestOptions,Discord.AutocompleteResult[])"> | |||||
| <summary> | |||||
| Responds to this interaction with a set of choices. | |||||
| </summary> | |||||
| <param name="options">The request options for this response.</param> | |||||
| <param name="result"> | |||||
| The set of choices for the user to pick from. | |||||
| <remarks> | |||||
| A max of 20 choices are allowed. Passing <see langword="null"/> for this argument will show the executing user that | |||||
| there is no choices for their autocompleted input. | |||||
| </remarks> | |||||
| </param> | |||||
| <returns> | |||||
| A task that represents the asynchronous operation of responding to this interaction. | |||||
| </returns> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.DeferAsync(System.Boolean,Discord.RequestOptions)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.String,System.IO.Stream,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.FollowupWithFileAsync(System.String,System.String,System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="M:Discord.WebSocket.SocketAutocompleteInteraction.RespondAsync(System.String,Discord.Embed[],System.Boolean,System.Boolean,Discord.AllowedMentions,Discord.RequestOptions,Discord.MessageComponent,Discord.Embed)"> | |||||
| <inheritdoc/> | |||||
| </member> | |||||
| <member name="T:Discord.WebSocket.SocketAutocompleteInteractionData"> | |||||
| <summary> | |||||
| Represents data for a slash commands autocomplete interaction. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.CommandName"> | |||||
| <summary> | |||||
| Gets the name of the invoked command. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.CommandId"> | |||||
| <summary> | |||||
| Gets the id of the invoked command. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.Type"> | |||||
| <summary> | |||||
| Gets the type of the invoked command. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.Version"> | |||||
| <summary> | |||||
| Gets the version of the invoked command. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.Current"> | |||||
| <summary> | |||||
| Gets the current autocomplete option that is activly being filled out. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketAutocompleteInteractionData.Options"> | |||||
| <summary> | |||||
| Gets a collection of all the other options the executing users has filled out. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="T:Discord.WebSocket.SocketSlashCommand"> | <member name="T:Discord.WebSocket.SocketSlashCommand"> | ||||
| <summary> | <summary> | ||||
| Represents a Websocket-based slash command received over the gateway. | Represents a Websocket-based slash command received over the gateway. | ||||
| @@ -4088,7 +4180,17 @@ | |||||
| </member> | </member> | ||||
| <member name="T:Discord.WebSocket.SocketCommandBase"> | <member name="T:Discord.WebSocket.SocketCommandBase"> | ||||
| <summary> | <summary> | ||||
| Base class for User, Message, and Slash command interactions | |||||
| Base class for User, Message, and Slash command interactions. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketCommandBase.CommandName"> | |||||
| <summary> | |||||
| Gets the name of the invoked command. | |||||
| </summary> | |||||
| </member> | |||||
| <member name="P:Discord.WebSocket.SocketCommandBase.CommandId"> | |||||
| <summary> | |||||
| Gets the id of the invoked command. | |||||
| </summary> | </summary> | ||||
| </member> | </member> | ||||
| <member name="P:Discord.WebSocket.SocketCommandBase.Data"> | <member name="P:Discord.WebSocket.SocketCommandBase.Data"> | ||||
| @@ -0,0 +1,97 @@ | |||||
| using Discord.Rest; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.IO; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| using Model = Discord.API.Interaction; | |||||
| using DataModel = Discord.API.AutocompleteInteractionData; | |||||
| namespace Discord.WebSocket | |||||
| { | |||||
| /// <summary> | |||||
| /// Represents a <see cref="InteractionType.ApplicationCommandAutocomplete"/> received over the gateway. | |||||
| /// </summary> | |||||
| public class SocketAutocompleteInteraction : SocketInteraction | |||||
| { | |||||
| /// <summary> | |||||
| /// The autocomplete data of this interaction. | |||||
| /// </summary> | |||||
| public new SocketAutocompleteInteractionData Data { get; } | |||||
| internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel) | |||||
| : base(client, model.Id, channel) | |||||
| { | |||||
| var dataModel = model.Data.IsSpecified | |||||
| ? (DataModel)model.Data.Value | |||||
| : null; | |||||
| if (dataModel != null) | |||||
| Data = new SocketAutocompleteInteractionData(dataModel); | |||||
| } | |||||
| internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel) | |||||
| { | |||||
| var entity = new SocketAutocompleteInteraction(client, model, channel); | |||||
| entity.Update(model); | |||||
| return entity; | |||||
| } | |||||
| /// <summary> | |||||
| /// Responds to this interaction with a set of choices. | |||||
| /// </summary> | |||||
| /// <param name="result"> | |||||
| /// The set of choices for the user to pick from. | |||||
| /// <remarks> | |||||
| /// A max of 20 choices are allowed. Passing <see langword="null"/> for this argument will show the executing user that | |||||
| /// there is no choices for their autocompleted input. | |||||
| /// </remarks> | |||||
| /// </param> | |||||
| /// <param name="options">The request options for this response.</param> | |||||
| /// <returns> | |||||
| /// A task that represents the asynchronous operation of responding to this interaction. | |||||
| /// </returns> | |||||
| public Task RespondAsync(IEnumerable<AutocompleteResult> result, RequestOptions options = null) | |||||
| => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); | |||||
| /// <summary> | |||||
| /// Responds to this interaction with a set of choices. | |||||
| /// </summary> | |||||
| /// <param name="options">The request options for this response.</param> | |||||
| /// <param name="result"> | |||||
| /// The set of choices for the user to pick from. | |||||
| /// <remarks> | |||||
| /// A max of 20 choices are allowed. Passing <see langword="null"/> for this argument will show the executing user that | |||||
| /// there is no choices for their autocompleted input. | |||||
| /// </remarks> | |||||
| /// </param> | |||||
| /// <returns> | |||||
| /// A task that represents the asynchronous operation of responding to this interaction. | |||||
| /// </returns> | |||||
| public Task RespondAsync(RequestOptions options = null, params AutocompleteResult[] result) | |||||
| => InteractionHelper.SendAutocompleteResult(Discord, result, this.Id, this.Token, options); | |||||
| /// <inheritdoc/> | |||||
| [Obsolete("Autocomplete interactions cannot be defered!", true)] | |||||
| public override Task DeferAsync(bool ephemeral = false, RequestOptions options = null) => throw new NotSupportedException(); | |||||
| /// <inheritdoc/> | |||||
| [Obsolete("Autocomplete interactions cannot have followups!", true)] | |||||
| public override Task<RestFollowupMessage> FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); | |||||
| /// <inheritdoc/> | |||||
| [Obsolete("Autocomplete interactions cannot have followups!", true)] | |||||
| public override Task<RestFollowupMessage> FollowupWithFileAsync(string text = null, Stream fileStream = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); | |||||
| /// <inheritdoc/> | |||||
| [Obsolete("Autocomplete interactions cannot have followups!", true)] | |||||
| public override Task<RestFollowupMessage> FollowupWithFileAsync(string text = null, string filePath = null, string fileName = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); | |||||
| /// <inheritdoc/> | |||||
| [Obsolete("Autocomplete interactions cannot have normal responses!", true)] | |||||
| public override Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null) => throw new NotSupportedException(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,60 @@ | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Collections.Immutable; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using System.Threading.Tasks; | |||||
| using DataModel = Discord.API.AutocompleteInteractionData; | |||||
| namespace Discord.WebSocket | |||||
| { | |||||
| /// <summary> | |||||
| /// Represents data for a slash commands autocomplete interaction. | |||||
| /// </summary> | |||||
| public class SocketAutocompleteInteractionData | |||||
| { | |||||
| /// <summary> | |||||
| /// Gets the name of the invoked command. | |||||
| /// </summary> | |||||
| public string CommandName { get; } | |||||
| /// <summary> | |||||
| /// Gets the id of the invoked command. | |||||
| /// </summary> | |||||
| public ulong CommandId { get; } | |||||
| /// <summary> | |||||
| /// Gets the type of the invoked command. | |||||
| /// </summary> | |||||
| public ApplicationCommandType Type { get; } | |||||
| /// <summary> | |||||
| /// Gets the version of the invoked command. | |||||
| /// </summary> | |||||
| public ulong Version { get; } | |||||
| /// <summary> | |||||
| /// Gets the current autocomplete option that is activly being filled out. | |||||
| /// </summary> | |||||
| public AutocompleteOption Current { get; } | |||||
| /// <summary> | |||||
| /// Gets a collection of all the other options the executing users has filled out. | |||||
| /// </summary> | |||||
| public IReadOnlyCollection<AutocompleteOption> Options { get; } | |||||
| internal SocketAutocompleteInteractionData(DataModel model) | |||||
| { | |||||
| var options = model.Options.Select(x => new AutocompleteOption(x.Type, x.Name, x.Value, x.Focused)); | |||||
| this.Current = options.FirstOrDefault(x => x.Focused); | |||||
| this.Options = options.ToImmutableArray(); | |||||
| this.CommandName = model.Name; | |||||
| this.CommandId = model.Id; | |||||
| this.Type = model.Type; | |||||
| this.Version = model.Version; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -12,10 +12,22 @@ using Model = Discord.API.Interaction; | |||||
| namespace Discord.WebSocket | namespace Discord.WebSocket | ||||
| { | { | ||||
| /// <summary> | /// <summary> | ||||
| /// Base class for User, Message, and Slash command interactions | |||||
| /// Base class for User, Message, and Slash command interactions. | |||||
| /// </summary> | /// </summary> | ||||
| public class SocketCommandBase : SocketInteraction | public class SocketCommandBase : SocketInteraction | ||||
| { | { | ||||
| /// <summary> | |||||
| /// Gets the name of the invoked command. | |||||
| /// </summary> | |||||
| public string CommandName | |||||
| => Data.Name; | |||||
| /// <summary> | |||||
| /// Gets the id of the invoked command. | |||||
| /// </summary> | |||||
| public ulong CommandId | |||||
| => Data.Id; | |||||
| /// <summary> | /// <summary> | ||||
| /// The data associated with this interaction. | /// The data associated with this interaction. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -65,23 +65,28 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| if (model.Type == InteractionType.ApplicationCommand) | if (model.Type == InteractionType.ApplicationCommand) | ||||
| { | { | ||||
| if (model.ApplicationId != null) | |||||
| { | |||||
| var dataModel = model.Data.IsSpecified ? | |||||
| var dataModel = model.Data.IsSpecified ? | |||||
| (DataModel)model.Data.Value | (DataModel)model.Data.Value | ||||
| : null; | : null; | ||||
| if (dataModel != null) | |||||
| { | |||||
| if (dataModel.Type.Equals(ApplicationCommandType.User)) | |||||
| return SocketUserCommand.Create(client, model, channel); | |||||
| if (dataModel.Type.Equals(ApplicationCommandType.Message)) | |||||
| return SocketMessageCommand.Create(client, model, channel); | |||||
| } | |||||
| if (dataModel == null) | |||||
| return null; | |||||
| switch (dataModel.Type) | |||||
| { | |||||
| case ApplicationCommandType.Slash: | |||||
| return SocketSlashCommand.Create(client, model, channel); | |||||
| case ApplicationCommandType.Message: | |||||
| return SocketMessageCommand.Create(client, model, channel); | |||||
| case ApplicationCommandType.User: | |||||
| return SocketUserCommand.Create(client, model, channel); | |||||
| default: return null; | |||||
| } | } | ||||
| return SocketSlashCommand.Create(client, model, channel); | |||||
| } | } | ||||
| if (model.Type == InteractionType.MessageComponent) | |||||
| else if (model.Type == InteractionType.MessageComponent) | |||||
| return SocketMessageComponent.Create(client, model, channel); | return SocketMessageComponent.Create(client, model, channel); | ||||
| else if (model.Type == InteractionType.ApplicationCommandAutocomplete) | |||||
| return SocketAutocompleteInteraction.Create(client, model, channel); | |||||
| else | else | ||||
| return null; | return null; | ||||
| } | } | ||||