Added ApplicationCommand types: Slash : 1 User: 2 Message: 3 And the appropriate CRUD methods.pull/1923/head
| @@ -1,6 +1,6 @@ | |||
| Microsoft Visual Studio Solution File, Format Version 12.00 | |||
| # Visual Studio Version 16 | |||
| VisualStudioVersion = 16.0.28407.52 | |||
| # Visual Studio Version 17 | |||
| VisualStudioVersion = 17.0.31521.260 | |||
| MinimumVisualStudioVersion = 10.0.40219.1 | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Core", "src\Discord.Net.Core\Discord.Net.Core.csproj", "{91E9E7BD-75C9-4E98-84AA-2C271922E5C2}" | |||
| EndProject | |||
| @@ -40,7 +40,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Analyzers.Tests | |||
| EndProject | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Discord.Net.Examples", "src\Discord.Net.Examples\Discord.Net.Examples.csproj", "{47820065-3CFB-401C-ACEA-862BD564A404}" | |||
| EndProject | |||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "idn", "samples\idn\idn.csproj", "{4A03840B-9EBE-47E3-89AB-E0914DF21AFB}" | |||
| EndProject | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FeatureTesting", "..\FeatureTesting\FeatureTesting\FeatureTesting.csproj", "{0CC57A32-3AC7-489D-8DF5-C431925E4675}" | |||
| EndProject | |||
| Global | |||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| @@ -232,6 +234,18 @@ Global | |||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x64.Build.0 = Release|Any CPU | |||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.ActiveCfg = Release|Any CPU | |||
| {4A03840B-9EBE-47E3-89AB-E0914DF21AFB}.Release|x86.Build.0 = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x64.Build.0 = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Debug|x86.Build.0 = Debug|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.ActiveCfg = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x64.Build.0 = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.ActiveCfg = Release|Any CPU | |||
| {0CC57A32-3AC7-489D-8DF5-C431925E4675}.Release|x86.Build.0 = Release|Any CPU | |||
| EndGlobalSection | |||
| GlobalSection(SolutionProperties) = preSolution | |||
| HideSolutionNode = FALSE | |||
| @@ -8,7 +8,7 @@ | |||
| <TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net461;netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netstandard2.0;netstandard2.1</TargetFrameworks> | |||
| <PackageId>Discord.Net.Labs.Core</PackageId> | |||
| <Version>3.0.0-pre</Version> | |||
| <Version>3.3.1.0</Version> | |||
| <Product>Discord.Net.Labs.Core</Product> | |||
| <RepositoryUrl>https://github.com/Discord-Net-Labs/Discord.Net-Labs</RepositoryUrl> | |||
| <PackageIcon>Temporary.png</PackageIcon> | |||
| @@ -4452,6 +4452,11 @@ | |||
| Gets or sets the discription of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.ApplicationCommandProperties.Type"> | |||
| <summary> | |||
| Gets or sets the type for this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.ApplicationCommandProperties.Options"> | |||
| <summary> | |||
| Gets or sets the options for this command. | |||
| @@ -4472,6 +4477,11 @@ | |||
| Gets the unique id of the parent application. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.IApplicationCommand.Type"> | |||
| <summary> | |||
| The type of the command | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.IApplicationCommand.Name"> | |||
| <summary> | |||
| The name of the command. | |||
| @@ -5444,6 +5454,73 @@ | |||
| Will render this option as selected by default. | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.MessageCommandBuilder"> | |||
| <summary> | |||
| A class used to build slash commands. | |||
| </summary> | |||
| </member> | |||
| <member name="F:Discord.MessageCommandBuilder.MaxNameLength"> | |||
| <summary> | |||
| Returns the maximun length a commands name allowed by Discord | |||
| </summary> | |||
| </member> | |||
| <member name="F:Discord.MessageCommandBuilder.MaxDescriptionLength"> | |||
| <summary> | |||
| Returns the maximum length of a commands description allowed by Discord. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.MessageCommandBuilder.Name"> | |||
| <summary> | |||
| The name of this slash command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.MessageCommandBuilder.Description"> | |||
| <summary> | |||
| A 1-100 length description of this slash command | |||
| </summary> | |||
| </member> | |||
| <member name="M:Discord.MessageCommandBuilder.Build"> | |||
| <summary> | |||
| Build the current builder into a <see cref="T:Discord.MessageCommandCreationProperties"/> class. | |||
| </summary> | |||
| <returns>A <see cref="T:Discord.MessageCommandCreationProperties"/> that can be used to create user commands over rest.</returns> | |||
| </member> | |||
| <member name="M:Discord.MessageCommandBuilder.WithName(System.String)"> | |||
| <summary> | |||
| Sets the field name. | |||
| </summary> | |||
| <param name="name">The value to set the field name to.</param> | |||
| <returns> | |||
| The current builder. | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.MessageCommandBuilder.WithDescription(System.String)"> | |||
| <summary> | |||
| Sets the description of the current command. | |||
| </summary> | |||
| <param name="description">The description of this command.</param> | |||
| <returns>The current builder.</returns> | |||
| </member> | |||
| <member name="T:Discord.MessageCommandCreationProperties"> | |||
| <summary> | |||
| A class used to create Message commands. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.MessageCommandCreationProperties.Name"> | |||
| <summary> | |||
| The name of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.MessageCommandCreationProperties.Description"> | |||
| <summary> | |||
| The discription of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.MessageCommandCreationProperties.Type"> | |||
| <summary> | |||
| Gets or sets the type for this command. | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.SlashCommandBuilder"> | |||
| <summary> | |||
| A class used to build slash commands. | |||
| @@ -5691,6 +5768,11 @@ | |||
| The discription of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.SlashCommandCreationProperties.Type"> | |||
| <summary> | |||
| Gets or sets the type for this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.SlashCommandCreationProperties.Options"> | |||
| <summary> | |||
| Gets or sets the options for this command. | |||
| @@ -5701,6 +5783,73 @@ | |||
| Whether the command is enabled by default when the app is added to a guild. Default is <see langword="true"/> | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.UserCommandBuilder"> | |||
| <summary> | |||
| A class used to build slash commands. | |||
| </summary> | |||
| </member> | |||
| <member name="F:Discord.UserCommandBuilder.MaxNameLength"> | |||
| <summary> | |||
| Returns the maximun length a commands name allowed by Discord | |||
| </summary> | |||
| </member> | |||
| <member name="F:Discord.UserCommandBuilder.MaxDescriptionLength"> | |||
| <summary> | |||
| Returns the maximum length of a commands description allowed by Discord. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.UserCommandBuilder.Name"> | |||
| <summary> | |||
| The name of this slash command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.UserCommandBuilder.Description"> | |||
| <summary> | |||
| A 1-100 length description of this slash command | |||
| </summary> | |||
| </member> | |||
| <member name="M:Discord.UserCommandBuilder.Build"> | |||
| <summary> | |||
| Build the current builder into a <see cref="T:Discord.UserCommandCreationProperties"/> class. | |||
| </summary> | |||
| <returns>A <see cref="T:Discord.UserCommandCreationProperties"/> that can be used to create user commands over rest.</returns> | |||
| </member> | |||
| <member name="M:Discord.UserCommandBuilder.WithName(System.String)"> | |||
| <summary> | |||
| Sets the field name. | |||
| </summary> | |||
| <param name="name">The value to set the field name to.</param> | |||
| <returns> | |||
| The current builder. | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.UserCommandBuilder.WithDescription(System.String)"> | |||
| <summary> | |||
| Sets the description of the current command. | |||
| </summary> | |||
| <param name="description">The description of this command.</param> | |||
| <returns>The current builder.</returns> | |||
| </member> | |||
| <member name="T:Discord.UserCommandCreationProperties"> | |||
| <summary> | |||
| A class used to create User commands. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.UserCommandCreationProperties.Name"> | |||
| <summary> | |||
| The name of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.UserCommandCreationProperties.Description"> | |||
| <summary> | |||
| The discription of this command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.UserCommandCreationProperties.Type"> | |||
| <summary> | |||
| Gets or sets the type for this command. | |||
| </summary> | |||
| </member> | |||
| <member name="T:Discord.IInvite"> | |||
| <summary> | |||
| Represents a generic invite object. | |||
| @@ -20,7 +20,11 @@ namespace Discord | |||
| /// Gets or sets the discription of this command. | |||
| /// </summary> | |||
| public Optional<string> Description { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the type for this command. | |||
| /// </summary> | |||
| public Optional<ApplicationCommandType> Type { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the options for this command. | |||
| @@ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| public enum ApplicationCommandType : byte | |||
| { | |||
| Slash = 1, | |||
| User = 2, | |||
| Message = 3 | |||
| } | |||
| } | |||
| @@ -16,6 +16,11 @@ namespace Discord | |||
| /// </summary> | |||
| ulong ApplicationId { get; } | |||
| /// <summary> | |||
| /// The type of the command | |||
| /// </summary> | |||
| ApplicationCommandType Type { get; } | |||
| /// <summary> | |||
| /// The name of the command. | |||
| /// </summary> | |||
| @@ -0,0 +1,109 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// A class used to build slash commands. | |||
| /// </summary> | |||
| public class MessageCommandBuilder | |||
| { | |||
| /// <summary> | |||
| /// Returns the maximun length a commands name allowed by Discord | |||
| /// </summary> | |||
| public const int MaxNameLength = 32; | |||
| /// <summary> | |||
| /// Returns the maximum length of a commands description allowed by Discord. | |||
| /// </summary> | |||
| public const int MaxDescriptionLength = 0; | |||
| /// <summary> | |||
| /// The name of this slash command. | |||
| /// </summary> | |||
| public string Name | |||
| { | |||
| get | |||
| { | |||
| return _name; | |||
| } | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Name)); | |||
| Preconditions.AtLeast(value.Length, 3, nameof(Name)); | |||
| Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); | |||
| // Discord updated the docs, this regex prevents special characters like @!$%(... etc, | |||
| // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand | |||
| if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) | |||
| throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); | |||
| _name = value; | |||
| } | |||
| } | |||
| /// <summary> | |||
| /// A 1-100 length description of this slash command | |||
| /// </summary> | |||
| public string Description | |||
| { | |||
| get | |||
| { | |||
| return _description; | |||
| } | |||
| set | |||
| { | |||
| Preconditions.Equals(value, ""); | |||
| _description = value; | |||
| } | |||
| } | |||
| private string _name { get; set; } | |||
| private string _description { get; set; } | |||
| /// <summary> | |||
| /// Build the current builder into a <see cref="MessageCommandCreationProperties"/> class. | |||
| /// </summary> | |||
| /// <returns>A <see cref="MessageCommandCreationProperties"/> that can be used to create user commands over rest.</returns> | |||
| public MessageCommandCreationProperties Build() | |||
| { | |||
| MessageCommandCreationProperties props = new MessageCommandCreationProperties() | |||
| { | |||
| Name = this.Name, | |||
| Description = this.Description, | |||
| Type=ApplicationCommandType.Message | |||
| }; | |||
| return props; | |||
| } | |||
| /// <summary> | |||
| /// Sets the field name. | |||
| /// </summary> | |||
| /// <param name="name">The value to set the field name to.</param> | |||
| /// <returns> | |||
| /// The current builder. | |||
| /// </returns> | |||
| public MessageCommandBuilder WithName(string name) | |||
| { | |||
| this.Name = name; | |||
| return this; | |||
| } | |||
| /// <summary> | |||
| /// Sets the description of the current command. | |||
| /// </summary> | |||
| /// <param name="description">The description of this command.</param> | |||
| /// <returns>The current builder.</returns> | |||
| public MessageCommandBuilder WithDescription(string description) | |||
| { | |||
| this.Description = description; | |||
| return this; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// A class used to create Message commands. | |||
| /// </summary> | |||
| public class MessageCommandCreationProperties | |||
| { | |||
| /// <summary> | |||
| /// The name of this command. | |||
| /// </summary> | |||
| public string Name { get; set; } | |||
| /// <summary> | |||
| /// The discription of this command. | |||
| /// </summary> | |||
| public string Description { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the type for this command. | |||
| /// </summary> | |||
| public ApplicationCommandType Type { get; set; } | |||
| } | |||
| } | |||
| @@ -102,7 +102,8 @@ namespace Discord | |||
| { | |||
| Name = this.Name, | |||
| Description = this.Description, | |||
| DefaultPermission = this.DefaultPermission | |||
| DefaultPermission = this.DefaultPermission, | |||
| Type = ApplicationCommandType.Slash | |||
| }; | |||
| if (this.Options != null && this.Options.Any()) | |||
| @@ -21,6 +21,10 @@ namespace Discord | |||
| /// </summary> | |||
| public string Description { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the type for this command. | |||
| /// </summary> | |||
| public ApplicationCommandType Type { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the options for this command. | |||
| @@ -0,0 +1,109 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Text.RegularExpressions; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// A class used to build slash commands. | |||
| /// </summary> | |||
| public class UserCommandBuilder | |||
| { | |||
| /// <summary> | |||
| /// Returns the maximun length a commands name allowed by Discord | |||
| /// </summary> | |||
| public const int MaxNameLength = 32; | |||
| /// <summary> | |||
| /// Returns the maximum length of a commands description allowed by Discord. | |||
| /// </summary> | |||
| public const int MaxDescriptionLength = 0; | |||
| /// <summary> | |||
| /// The name of this slash command. | |||
| /// </summary> | |||
| public string Name | |||
| { | |||
| get | |||
| { | |||
| return _name; | |||
| } | |||
| set | |||
| { | |||
| Preconditions.NotNullOrEmpty(value, nameof(Name)); | |||
| Preconditions.AtLeast(value.Length, 3, nameof(Name)); | |||
| Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name)); | |||
| // Discord updated the docs, this regex prevents special characters like @!$%(... etc, | |||
| // https://discord.com/developers/docs/interactions/slash-commands#applicationcommand | |||
| if (!Regex.IsMatch(value, @"^[\w -]{3,32}$")) | |||
| throw new ArgumentException("Command name cannot contain any special characters or whitespaces!"); | |||
| _name = value; | |||
| } | |||
| } | |||
| /// <summary> | |||
| /// A 1-100 length description of this slash command | |||
| /// </summary> | |||
| public string Description | |||
| { | |||
| get | |||
| { | |||
| return _description; | |||
| } | |||
| set | |||
| { | |||
| Preconditions.Equals(value, ""); | |||
| _description = value; | |||
| } | |||
| } | |||
| private string _name { get; set; } | |||
| private string _description { get; set; } | |||
| /// <summary> | |||
| /// Build the current builder into a <see cref="UserCommandCreationProperties"/> class. | |||
| /// </summary> | |||
| /// <returns>A <see cref="UserCommandCreationProperties"/> that can be used to create user commands over rest.</returns> | |||
| public UserCommandCreationProperties Build() | |||
| { | |||
| UserCommandCreationProperties props = new UserCommandCreationProperties() | |||
| { | |||
| Name = this.Name, | |||
| Description = this.Description, | |||
| Type=ApplicationCommandType.User | |||
| }; | |||
| return props; | |||
| } | |||
| /// <summary> | |||
| /// Sets the field name. | |||
| /// </summary> | |||
| /// <param name="name">The value to set the field name to.</param> | |||
| /// <returns> | |||
| /// The current builder. | |||
| /// </returns> | |||
| public UserCommandBuilder WithName(string name) | |||
| { | |||
| this.Name = name; | |||
| return this; | |||
| } | |||
| /// <summary> | |||
| /// Sets the description of the current command. | |||
| /// </summary> | |||
| /// <param name="description">The description of this command.</param> | |||
| /// <returns>The current builder.</returns> | |||
| public UserCommandBuilder WithDescription(string description) | |||
| { | |||
| this.Description = description; | |||
| return this; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,30 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Discord | |||
| { | |||
| /// <summary> | |||
| /// A class used to create User commands. | |||
| /// </summary> | |||
| public class UserCommandCreationProperties | |||
| { | |||
| /// <summary> | |||
| /// The name of this command. | |||
| /// </summary> | |||
| public string Name { get; set; } | |||
| /// <summary> | |||
| /// The discription of this command. | |||
| /// </summary> | |||
| public string Description { get; set; } | |||
| /// <summary> | |||
| /// Gets or sets the type for this command. | |||
| /// </summary> | |||
| public ApplicationCommandType Type { get; set; } | |||
| } | |||
| } | |||
| @@ -13,6 +13,9 @@ namespace Discord.API.Rest | |||
| [JsonProperty("name")] | |||
| public string Name { get; set; } | |||
| [JsonProperty("type")] | |||
| public ApplicationCommandType Type { get; set; } | |||
| [JsonProperty("description")] | |||
| public string Description { get; set; } | |||
| @@ -23,11 +26,12 @@ namespace Discord.API.Rest | |||
| public Optional<bool> DefaultPermission { get; set; } | |||
| public CreateApplicationCommandParams() { } | |||
| public CreateApplicationCommandParams(string name, string description, ApplicationCommandOption[] options = null) | |||
| public CreateApplicationCommandParams(string name, string description, ApplicationCommandType type, ApplicationCommandOption[] options = null) | |||
| { | |||
| this.Name = name; | |||
| this.Description = description; | |||
| this.Options = Optional.Create<ApplicationCommandOption[]>(options); | |||
| this.Type = type; | |||
| } | |||
| } | |||
| } | |||
| @@ -15,6 +15,9 @@ namespace Discord.API.Rest | |||
| [JsonProperty("description")] | |||
| public Optional<string> Description { get; set; } | |||
| [JsonProperty("type")] | |||
| public Optional<ApplicationCommandType> Type { get; set; } | |||
| [JsonProperty("options")] | |||
| public Optional<ApplicationCommandOption[]> Options { get; set; } | |||
| @@ -3732,6 +3732,9 @@ | |||
| <member name="P:Discord.Rest.RestApplicationCommand.ApplicationId"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestApplicationCommand.Type"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestApplicationCommand.Name"> | |||
| <inheritdoc/> | |||
| </member> | |||
| @@ -3831,6 +3834,32 @@ | |||
| The modified command. | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGlobalMessageCommand.DeleteAsync(Discord.RequestOptions)"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGlobalMessageCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||
| <summary> | |||
| Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
| </summary> | |||
| <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| The modified command. | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGlobalUserCommand.DeleteAsync(Discord.RequestOptions)"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGlobalUserCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||
| <summary> | |||
| Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
| </summary> | |||
| <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| The modified command. | |||
| </returns> | |||
| </member> | |||
| <member name="T:Discord.Rest.RestGuildCommand"> | |||
| <summary> | |||
| Represents a Rest-based guild command. | |||
| @@ -3886,6 +3915,74 @@ | |||
| <see cref="T:Discord.Rest.RestGuild"/>. | |||
| </returns> | |||
| </member> | |||
| <member name="T:Discord.Rest.RestGuildMessageCommand"> | |||
| <summary> | |||
| Represents a Rest-based guild command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestGuildMessageCommand.GuildId"> | |||
| <summary> | |||
| The guild Id where this command originates. | |||
| </summary> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildMessageCommand.DeleteAsync(Discord.RequestOptions)"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildMessageCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||
| <summary> | |||
| Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
| </summary> | |||
| <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| The modified command | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildMessageCommand.GetGuild(System.Boolean,Discord.RequestOptions)"> | |||
| <summary> | |||
| Gets the guild that this slash command resides in. | |||
| </summary> | |||
| <param name="withCounts"><see langword="true"/> if you want the approximate member and presence counts for the guild, otherwise <see langword="false"/>.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| A task that represents the asynchronous get operation. The task result contains a | |||
| <see cref="T:Discord.Rest.RestGuild"/>. | |||
| </returns> | |||
| </member> | |||
| <member name="T:Discord.Rest.RestGuildUserCommand"> | |||
| <summary> | |||
| Represents a Rest-based guild command. | |||
| </summary> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestGuildUserCommand.GuildId"> | |||
| <summary> | |||
| The guild Id where this command originates. | |||
| </summary> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildUserCommand.DeleteAsync(Discord.RequestOptions)"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildUserCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||
| <summary> | |||
| Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
| </summary> | |||
| <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| The modified command | |||
| </returns> | |||
| </member> | |||
| <member name="M:Discord.Rest.RestGuildUserCommand.GetGuild(System.Boolean,Discord.RequestOptions)"> | |||
| <summary> | |||
| Gets the guild that this slash command resides in. | |||
| </summary> | |||
| <param name="withCounts"><see langword="true"/> if you want the approximate member and presence counts for the guild, otherwise <see langword="false"/>.</param> | |||
| <param name="options">The options to be used when sending the request.</param> | |||
| <returns> | |||
| A task that represents the asynchronous get operation. The task result contains a | |||
| <see cref="T:Discord.Rest.RestGuild"/>. | |||
| </returns> | |||
| </member> | |||
| <member name="P:Discord.Rest.RestInvite.ChannelName"> | |||
| <inheritdoc /> | |||
| </member> | |||
| @@ -235,6 +235,7 @@ namespace Discord.API | |||
| options.BucketId = bucketId; | |||
| string json = payload != null ? SerializeJson(payload) : null; | |||
| Console.WriteLine($"Sending JSON....\n{json}"); | |||
| var request = new JsonRestRequest(RestClient, method, endpoint, json, options); | |||
| return DeserializeJson<TResponse>(await SendInternalAsync(method, endpoint, request).ConfigureAwait(false)); | |||
| } | |||
| @@ -1082,6 +1083,18 @@ namespace Discord.API | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> ModifyGlobalApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> ModifyGlobalApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong commandId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("PATCH", () => $"applications/{this.CurrentUserId}/commands/{commandId}", command, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task DeleteGlobalApplicationCommandAsync(ulong commandId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| @@ -1095,6 +1108,46 @@ namespace Discord.API | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> CreateGlobalApplicationUserCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); | |||
| Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); | |||
| Preconditions.Equals(command.Description, ""); | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> CreateGlobalApplicationMessageCommandAsync(CreateApplicationCommandParams command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.AtMost(command.Name.Length, 32, nameof(command.Name)); | |||
| Preconditions.AtLeast(command.Name.Length, 3, nameof(command.Name)); | |||
| Preconditions.Equals(command.Description, ""); | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("POST", () => $"applications/{this.CurrentUserId}/commands", command, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand[]> BulkOverwriteGlobalApplicationUserCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand[]> BulkOverwriteGlobalApplicationMessageCommands(CreateApplicationCommandParams[] commands, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/commands", commands, new BucketIds(), options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand[]> GetGuildApplicationCommandsAsync(ulong guildId, RequestOptions options = null) | |||
| { | |||
| @@ -1163,6 +1216,87 @@ namespace Discord.API | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> CreateGuildApplicationUserCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> ModifyGuildApplicationUserCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| try | |||
| { | |||
| return await SendJsonAsync<ApplicationCommand>("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); | |||
| } | |||
| catch (HttpException x) | |||
| { | |||
| if (x.HttpCode == HttpStatusCode.BadRequest) | |||
| { | |||
| var json = (x.Request as JsonRestRequest).Json; | |||
| throw new ApplicationCommandException(json, x); | |||
| } | |||
| // Re-throw the http exception | |||
| throw; | |||
| } | |||
| } | |||
| public async Task<ApplicationCommand[]> BulkOverwriteGuildApplicationUserCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> CreateGuildApplicationMessageCommandAsync(CreateApplicationCommandParams command, ulong guildId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand>("POST", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", command, bucket, options: options)).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand> ModifyGuildApplicationMessageCommandAsync(ModifyApplicationCommandParams command, ulong guildId, ulong commandId, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| try | |||
| { | |||
| return await SendJsonAsync<ApplicationCommand>("PATCH", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands/{commandId}", command, bucket, options: options).ConfigureAwait(false); | |||
| } | |||
| catch (HttpException x) | |||
| { | |||
| if (x.HttpCode == HttpStatusCode.BadRequest) | |||
| { | |||
| var json = (x.Request as JsonRestRequest).Json; | |||
| throw new ApplicationCommandException(json, x); | |||
| } | |||
| // Re-throw the http exception | |||
| throw; | |||
| } | |||
| } | |||
| public async Task<ApplicationCommand[]> BulkOverwriteGuildApplicationMessageCommands(ulong guildId, CreateApplicationCommandParams[] commands, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| return await TrySendApplicationCommand(SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{this.CurrentUserId}/guilds/{guildId}/commands", commands, bucket, options: options)).ConfigureAwait(false); | |||
| } | |||
| //Interaction Responses | |||
| public async Task CreateInteractionResponse(InteractionResponse response, ulong interactionId, string interactionToken, RequestOptions options = null) | |||
| { | |||
| @@ -1,3 +1,4 @@ | |||
| //using Discord.Rest.Entities.Interactions; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Collections.Immutable; | |||
| @@ -111,10 +112,26 @@ namespace Discord.Rest | |||
| => InteractionHelper.CreateGlobalCommand(this, properties, options); | |||
| public Task<RestGlobalCommand> CreateGlobalCommand(Action<SlashCommandCreationProperties> func, RequestOptions options = null) | |||
| => InteractionHelper.CreateGlobalCommand(this, func, options); | |||
| public Task<RestGlobalUserCommand> CreateGlobalUserCommand(UserCommandCreationProperties properties, RequestOptions options = null) | |||
| => InteractionHelper.CreateGlobalUserCommand(this, properties, options); | |||
| public Task<RestGlobalUserCommand> CreateGlobalUserCommand(Action<UserCommandCreationProperties> func, RequestOptions options = null) | |||
| => InteractionHelper.CreateGlobalUserCommand(this, func, options); | |||
| public Task<RestGlobalMessageCommand> CreateGlobalMessageCommand(MessageCommandCreationProperties properties, RequestOptions options = null) | |||
| => InteractionHelper.CreateGlobalMessageCommand(this, properties, options); | |||
| public Task<RestGlobalMessageCommand> CreateGlobalMessageCommand(Action<MessageCommandCreationProperties> func, RequestOptions options = null) | |||
| => InteractionHelper.CreateGlobalMessageCommand(this, func, options); | |||
| public Task<RestGuildCommand> CreateGuildCommand(SlashCommandCreationProperties properties, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildCommand(this, guildId, properties, options); | |||
| public Task<RestGuildCommand> CreateGuildCommand(Action<SlashCommandCreationProperties> func, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildCommand(this, guildId, func, options); | |||
| public Task<RestGuildUserCommand> CreateGuildUserCommand(UserCommandCreationProperties properties, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildUserCommand(this, guildId, properties, options); | |||
| public Task<RestGuildUserCommand> CreateGuildUserCommand(Action<UserCommandCreationProperties> func, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildUserCommand(this, guildId, func, options); | |||
| public Task<RestGuildMessageCommand> CreateGuildMessageCommand(MessageCommandCreationProperties properties, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildMessageCommand(this, guildId, properties, options); | |||
| public Task<RestGuildMessageCommand> CreateGuildMessageCommand(Action<MessageCommandCreationProperties> func, ulong guildId, RequestOptions options = null) | |||
| => InteractionHelper.CreateGuildMessageCommand(this, guildId, func, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(RequestOptions options = null) | |||
| => ClientHelper.GetGlobalApplicationCommands(this, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null) | |||
| @@ -1,6 +1,7 @@ | |||
| using Discord.API; | |||
| using Discord.API.Rest; | |||
| using Discord.Net; | |||
| //using Discord.Rest.Entities.Interactions; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| @@ -63,6 +64,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type= arg.Type, | |||
| Options = arg.Options.IsSpecified | |||
| ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -94,6 +96,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type, | |||
| Options = arg.Options.IsSpecified | |||
| ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -129,6 +132,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type, | |||
| Options = arg.Options.IsSpecified | |||
| ? arg.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -173,6 +177,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description, | |||
| Type = args.Type, | |||
| Options = args.Options.IsSpecified | |||
| ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -195,6 +200,174 @@ namespace Discord.Rest | |||
| await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGlobalUserCommand> CreateGlobalUserCommand(BaseDiscordClient client, Action<UserCommandCreationProperties> func, RequestOptions options = null) | |||
| { | |||
| var args = new UserCommandCreationProperties(); | |||
| func(args); | |||
| return await CreateGlobalUserCommand(client, args, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGlobalUserCommand> CreateGlobalUserCommand(BaseDiscordClient client, UserCommandCreationProperties arg, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.Equals(arg.Description, ""); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| var cmd = await client.ApiClient.CreateGlobalApplicationUserCommandAsync(model, options).ConfigureAwait(false); | |||
| return RestGlobalUserCommand.Create(client, cmd); | |||
| } | |||
| public static async Task<RestGlobalMessageCommand> CreateGlobalMessageCommand(BaseDiscordClient client, Action<MessageCommandCreationProperties> func, RequestOptions options = null) | |||
| { | |||
| var args = new MessageCommandCreationProperties(); | |||
| func(args); | |||
| return await CreateGlobalMessageCommand(client, args, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGlobalMessageCommand> CreateGlobalMessageCommand(BaseDiscordClient client, MessageCommandCreationProperties arg, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.Equals(arg.Description, ""); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| var cmd = await client.ApiClient.CreateGlobalApplicationMessageCommandAsync(model, options).ConfigureAwait(false); | |||
| return RestGlobalMessageCommand.Create(client, cmd); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGlobalUserCommand>> BulkOverwriteGlobalUserCommands(BaseDiscordClient client, UserCommandCreationProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); | |||
| Preconditions.Equals(arg.Type, ApplicationCommandType.User); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| models.Add(model); | |||
| } | |||
| var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationUserCommands(models.ToArray(), options); | |||
| return apiModels.Select(x => RestGlobalUserCommand.Create(client, x)).ToArray(); | |||
| } | |||
| public static async Task<RestGlobalUserCommand> ModifyGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, | |||
| Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| { | |||
| ApplicationCommandProperties args = new ApplicationCommandProperties(); | |||
| func(args); | |||
| if (args.Name.IsSpecified) | |||
| { | |||
| Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); | |||
| Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); | |||
| } | |||
| if (args.Description.IsSpecified) | |||
| { | |||
| Preconditions.Equals(args.Description.Value, ""); | |||
| } | |||
| var model = new Discord.API.Rest.ModifyApplicationCommandParams() | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description | |||
| }; | |||
| var msg = await client.ApiClient.ModifyGlobalApplicationUserCommandAsync(model, command.Id, options).ConfigureAwait(false); | |||
| command.Update(msg); | |||
| return command; | |||
| } | |||
| public static async Task DeleteGlobalUserCommand(BaseDiscordClient client, RestGlobalUserCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGlobalMessageCommand>> BulkOverwriteGlobalMessageCommands(BaseDiscordClient client, MessageCommandCreationProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); | |||
| Preconditions.Equals(arg.Type, ApplicationCommandType.Message); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| models.Add(model); | |||
| } | |||
| var apiModels = await client.ApiClient.BulkOverwriteGlobalApplicationMessageCommands(models.ToArray(), options); | |||
| return apiModels.Select(x => RestGlobalMessageCommand.Create(client, x)).ToArray(); | |||
| } | |||
| public static async Task<RestGlobalMessageCommand> ModifyGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, | |||
| Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| { | |||
| ApplicationCommandProperties args = new ApplicationCommandProperties(); | |||
| func(args); | |||
| if (args.Name.IsSpecified) | |||
| { | |||
| Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); | |||
| Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); | |||
| } | |||
| if (args.Description.IsSpecified) | |||
| { | |||
| Preconditions.Equals(args.Description.Value, ""); | |||
| } | |||
| var model = new Discord.API.Rest.ModifyApplicationCommandParams() | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description | |||
| }; | |||
| var msg = await client.ApiClient.ModifyGlobalApplicationMessageCommandAsync(model, command.Id, options).ConfigureAwait(false); | |||
| command.Update(msg); | |||
| return command; | |||
| } | |||
| public static async Task DeleteGlobalMessageCommand(BaseDiscordClient client, RestGlobalMessageCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| await client.ApiClient.DeleteGlobalApplicationCommandAsync(command.Id, options).ConfigureAwait(false); | |||
| } | |||
| // Guild Commands | |||
| public static async Task<RestGuildCommand> CreateGuildCommand(BaseDiscordClient client, ulong guildId, | |||
| Action<SlashCommandCreationProperties> func, RequestOptions options = null) | |||
| @@ -231,6 +404,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description, | |||
| Type = args.Type, | |||
| Options = args.Options.IsSpecified | |||
| ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -269,6 +443,7 @@ namespace Discord.Rest | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description, | |||
| Type = args.Type, | |||
| Options = args.Options.IsSpecified | |||
| ? args.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray() | |||
| : Optional<Discord.API.ApplicationCommandOption[]>.Unspecified, | |||
| @@ -290,6 +465,177 @@ namespace Discord.Rest | |||
| await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGuildUserCommand> CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, Action<UserCommandCreationProperties> func, RequestOptions options = null) | |||
| { | |||
| var args = new UserCommandCreationProperties(); | |||
| func(args); | |||
| return await CreateGuildUserCommand(client, guildId, args, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGuildUserCommand> CreateGuildUserCommand(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties arg, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.Equals(arg.Description, ""); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| var cmd = await client.ApiClient.CreateGuildApplicationUserCommandAsync(model, guildId, options).ConfigureAwait(false); | |||
| return RestGuildUserCommand.Create(client, cmd, guildId); | |||
| } | |||
| public static async Task<RestGuildMessageCommand> CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, Action<MessageCommandCreationProperties> func, RequestOptions options = null) | |||
| { | |||
| var args = new MessageCommandCreationProperties(); | |||
| func(args); | |||
| return await CreateGuildMessageCommand(client, guildId, args, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<RestGuildMessageCommand> CreateGuildMessageCommand(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties arg, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.Equals(arg.Description, ""); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| var cmd = await client.ApiClient.CreateGuildApplicationMessageCommandAsync(model, guildId, options).ConfigureAwait(false); | |||
| return RestGuildMessageCommand.Create(client, cmd, guildId); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGuildUserCommand>> BulkOverwriteGuildUserCommands(BaseDiscordClient client, ulong guildId, UserCommandCreationProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); | |||
| Preconditions.Equals(arg.Type, ApplicationCommandType.User); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| models.Add(model); | |||
| } | |||
| var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationUserCommands(guildId, models.ToArray(), options); | |||
| return apiModels.Select(x => RestGuildUserCommand.Create(client, x, guildId)).ToArray(); | |||
| } | |||
| public static async Task<RestGuildUserCommand> ModifyGuildUserCommand(BaseDiscordClient client, RestGuildUserCommand command, | |||
| Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| { | |||
| ApplicationCommandProperties args = new ApplicationCommandProperties(); | |||
| func(args); | |||
| if (args.Name.IsSpecified) | |||
| { | |||
| Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); | |||
| Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); | |||
| } | |||
| if (args.Description.IsSpecified) | |||
| { | |||
| Preconditions.Equals(args.Description.Value, ""); | |||
| } | |||
| var model = new Discord.API.Rest.ModifyApplicationCommandParams() | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description, | |||
| Type=args.Type | |||
| }; | |||
| var msg = await client.ApiClient.ModifyGuildApplicationUserCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); | |||
| command.Update(msg); | |||
| return command; | |||
| } | |||
| public static async Task DeleteGuildUserCommand(BaseDiscordClient client, ulong guildId, RestGuildUserCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGuildMessageCommand>> BulkOverwriteGuildMessageCommands(BaseDiscordClient client, ulong guildId, MessageCommandCreationProperties[] args, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(args, nameof(args)); | |||
| List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>(); | |||
| foreach (var arg in args) | |||
| { | |||
| Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name)); | |||
| Preconditions.NotNullOrEmpty(arg.Description, nameof(arg.Description)); | |||
| Preconditions.Equals(arg.Type, ApplicationCommandType.Message); | |||
| var model = new CreateApplicationCommandParams() | |||
| { | |||
| Name = arg.Name, | |||
| Description = arg.Description, | |||
| Type = arg.Type | |||
| }; | |||
| models.Add(model); | |||
| } | |||
| var apiModels = await client.ApiClient.BulkOverwriteGuildApplicationMessageCommands(guildId, models.ToArray(), options); | |||
| return apiModels.Select(x => RestGuildMessageCommand.Create(client, x, guildId)).ToArray(); | |||
| } | |||
| public static async Task<RestGuildMessageCommand> ModifyGuildMessageCommand(BaseDiscordClient client, RestGuildMessageCommand command, | |||
| Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| { | |||
| ApplicationCommandProperties args = new ApplicationCommandProperties(); | |||
| func(args); | |||
| if (args.Name.IsSpecified) | |||
| { | |||
| Preconditions.AtMost(args.Name.Value.Length, 32, nameof(args.Name)); | |||
| Preconditions.AtLeast(args.Name.Value.Length, 3, nameof(args.Name)); | |||
| } | |||
| if (args.Description.IsSpecified) | |||
| { | |||
| Preconditions.Equals(args.Description.Value, ""); | |||
| } | |||
| var model = new Discord.API.Rest.ModifyApplicationCommandParams() | |||
| { | |||
| Name = args.Name, | |||
| Description = args.Description, | |||
| Type = args.Type | |||
| }; | |||
| var msg = await client.ApiClient.ModifyGuildApplicationMessageCommandAsync(model, command.GuildId, command.Id, options).ConfigureAwait(false); | |||
| command.Update(msg); | |||
| return command; | |||
| } | |||
| public static async Task DeleteGuildMessageCommand(BaseDiscordClient client, ulong guildId, RestGuildMessageCommand command, RequestOptions options = null) | |||
| { | |||
| Preconditions.NotNull(command, nameof(command)); | |||
| Preconditions.NotEqual(command.Id, 0, nameof(command.Id)); | |||
| await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false); | |||
| } | |||
| public static async Task<Discord.API.Message> ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action<MessageProperties> func, | |||
| RequestOptions options = null) | |||
| { | |||
| @@ -16,6 +16,9 @@ namespace Discord.Rest | |||
| /// <inheritdoc/> | |||
| public ulong ApplicationId { get; private set; } | |||
| /// <inheritdoc/> | |||
| public ApplicationCommandType Type { get; private set; } | |||
| /// <inheritdoc/> | |||
| public string Name { get; private set; } | |||
| @@ -47,13 +50,30 @@ namespace Discord.Rest | |||
| internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, RestApplicationCommandType type, ulong guildId = 0) | |||
| { | |||
| if (type == RestApplicationCommandType.GlobalCommand) | |||
| return RestGlobalCommand.Create(client, model); | |||
| if (type == RestApplicationCommandType.GuildCommand) | |||
| return RestGuildCommand.Create(client, model, guildId); | |||
| return null; | |||
| switch (type) | |||
| { | |||
| case RestApplicationCommandType.GlobalCommand: | |||
| return RestGlobalCommand.Create(client, model); | |||
| break; | |||
| case RestApplicationCommandType.GlobalUserCommand: | |||
| return RestGlobalUserCommand.Create(client, model); | |||
| break; | |||
| case RestApplicationCommandType.GlobalMessageCommand: | |||
| return RestGlobalMessageCommand.Create(client, model); | |||
| break; | |||
| case RestApplicationCommandType.GuildCommand: | |||
| return RestGuildCommand.Create(client, model, guildId); | |||
| break; | |||
| case RestApplicationCommandType.GuildUserCommand: | |||
| return RestGuildUserCommand.Create(client, model, guildId); | |||
| break; | |||
| case RestApplicationCommandType.GuildMessageCommand: | |||
| return RestGuildMessageCommand.Create(client, model, guildId); | |||
| break; | |||
| default: | |||
| return null; | |||
| break; | |||
| } | |||
| } | |||
| internal virtual void Update(Model model) | |||
| @@ -15,10 +15,14 @@ namespace Discord.Rest | |||
| /// Specifies that this command is a Global command. | |||
| /// </summary> | |||
| GlobalCommand, | |||
| GlobalUserCommand, | |||
| GlobalMessageCommand, | |||
| /// <summary> | |||
| /// Specifies that this command is a Guild specific command. | |||
| /// </summary> | |||
| GuildCommand | |||
| GuildCommand, | |||
| GuildUserCommand, | |||
| GuildMessageCommand | |||
| } | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Reflection; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommand; | |||
| namespace Discord.Rest | |||
| { | |||
| public class RestGlobalMessageCommand : RestApplicationCommand | |||
| { | |||
| internal RestGlobalMessageCommand(BaseDiscordClient client, ulong id) | |||
| : base(client, id) | |||
| { | |||
| this.CommandType = RestApplicationCommandType.GlobalMessageCommand; | |||
| } | |||
| internal static RestGlobalMessageCommand Create(BaseDiscordClient client, Model model) | |||
| { | |||
| var entity = new RestGlobalMessageCommand(client, model.Id); | |||
| entity.Update(model); | |||
| return entity; | |||
| } | |||
| /// <inheritdoc/> | |||
| public override async Task DeleteAsync(RequestOptions options = null) | |||
| => await InteractionHelper.DeleteGlobalMessageCommand(Discord, this).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Modifies this <see cref="RestApplicationCommand"/>. | |||
| /// </summary> | |||
| /// <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// The modified command. | |||
| /// </returns> | |||
| public async Task<RestGlobalMessageCommand> ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| => await InteractionHelper.ModifyGlobalMessageCommand(Discord, this, func, options).ConfigureAwait(false); | |||
| } | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Reflection; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommand; | |||
| namespace Discord.Rest | |||
| { | |||
| public class RestGlobalUserCommand : RestApplicationCommand | |||
| { | |||
| internal RestGlobalUserCommand(BaseDiscordClient client, ulong id) | |||
| : base(client, id) | |||
| { | |||
| this.CommandType = RestApplicationCommandType.GlobalUserCommand; | |||
| } | |||
| internal static RestGlobalUserCommand Create(BaseDiscordClient client, Model model) | |||
| { | |||
| var entity = new RestGlobalUserCommand(client, model.Id); | |||
| entity.Update(model); | |||
| return entity; | |||
| } | |||
| /// <inheritdoc/> | |||
| public override async Task DeleteAsync(RequestOptions options = null) | |||
| => await InteractionHelper.DeleteGlobalUserCommand(Discord, this).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Modifies this <see cref="RestApplicationCommand"/>. | |||
| /// </summary> | |||
| /// <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// The modified command. | |||
| /// </returns> | |||
| public async Task<RestGlobalUserCommand> ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| => await InteractionHelper.ModifyGlobalUserCommand(Discord, this, func, options).ConfigureAwait(false); | |||
| } | |||
| } | |||
| @@ -0,0 +1,61 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommand; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Represents a Rest-based guild command. | |||
| /// </summary> | |||
| public class RestGuildMessageCommand : RestApplicationCommand | |||
| { | |||
| /// <summary> | |||
| /// The guild Id where this command originates. | |||
| /// </summary> | |||
| public ulong GuildId { get; private set; } | |||
| internal RestGuildMessageCommand(BaseDiscordClient client, ulong id, ulong guildId) | |||
| : base(client, id) | |||
| { | |||
| this.CommandType = RestApplicationCommandType.GuildMessageCommand; | |||
| this.GuildId = guildId; | |||
| } | |||
| internal static RestGuildMessageCommand Create(BaseDiscordClient client, Model model, ulong guildId) | |||
| { | |||
| var entity = new RestGuildMessageCommand(client, model.Id, guildId); | |||
| entity.Update(model); | |||
| return entity; | |||
| } | |||
| /// <inheritdoc/> | |||
| public override async Task DeleteAsync(RequestOptions options = null) | |||
| => await InteractionHelper.DeleteGuildMessageCommand(Discord, GuildId, this).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Modifies this <see cref="RestApplicationCommand"/>. | |||
| /// </summary> | |||
| /// <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// The modified command | |||
| /// </returns> | |||
| public async Task<RestGuildMessageCommand> ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| => await InteractionHelper.ModifyGuildMessageCommand(Discord, this, func, options).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Gets the guild that this slash command resides in. | |||
| /// </summary> | |||
| /// <param name="withCounts"><see langword="true"/> if you want the approximate member and presence counts for the guild, otherwise <see langword="false"/>.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous get operation. The task result contains a | |||
| /// <see cref="RestGuild"/>. | |||
| /// </returns> | |||
| public Task<RestGuild> GetGuild(bool withCounts = false, RequestOptions options = null) | |||
| => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); | |||
| } | |||
| } | |||
| @@ -0,0 +1,61 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| using Model = Discord.API.ApplicationCommand; | |||
| namespace Discord.Rest | |||
| { | |||
| /// <summary> | |||
| /// Represents a Rest-based guild command. | |||
| /// </summary> | |||
| public class RestGuildUserCommand : RestApplicationCommand | |||
| { | |||
| /// <summary> | |||
| /// The guild Id where this command originates. | |||
| /// </summary> | |||
| public ulong GuildId { get; private set; } | |||
| internal RestGuildUserCommand(BaseDiscordClient client, ulong id, ulong guildId) | |||
| : base(client, id) | |||
| { | |||
| this.CommandType = RestApplicationCommandType.GuildUserCommand; | |||
| this.GuildId = guildId; | |||
| } | |||
| internal static RestGuildUserCommand Create(BaseDiscordClient client, Model model, ulong guildId) | |||
| { | |||
| var entity = new RestGuildUserCommand(client, model.Id, guildId); | |||
| entity.Update(model); | |||
| return entity; | |||
| } | |||
| /// <inheritdoc/> | |||
| public override async Task DeleteAsync(RequestOptions options = null) | |||
| => await InteractionHelper.DeleteGuildUserCommand(Discord, GuildId, this).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Modifies this <see cref="RestApplicationCommand"/>. | |||
| /// </summary> | |||
| /// <param name="func">The delegate containing the properties to modify the command with.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// The modified command | |||
| /// </returns> | |||
| public async Task<RestGuildUserCommand> ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
| => await InteractionHelper.ModifyGuildUserCommand(Discord, this, func, options).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Gets the guild that this slash command resides in. | |||
| /// </summary> | |||
| /// <param name="withCounts"><see langword="true"/> if you want the approximate member and presence counts for the guild, otherwise <see langword="false"/>.</param> | |||
| /// <param name="options">The options to be used when sending the request.</param> | |||
| /// <returns> | |||
| /// A task that represents the asynchronous get operation. The task result contains a | |||
| /// <see cref="RestGuild"/>. | |||
| /// </returns> | |||
| public Task<RestGuild> GetGuild(bool withCounts = false, RequestOptions options = null) | |||
| => ClientHelper.GetGuildAsync(this.Discord, this.GuildId, withCounts, options); | |||
| } | |||
| } | |||
| @@ -3668,6 +3668,9 @@ | |||
| <member name="P:Discord.WebSocket.SocketApplicationCommand.Name"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="P:Discord.WebSocket.SocketApplicationCommand.Type"> | |||
| <inheritdoc/> | |||
| </member> | |||
| <member name="P:Discord.WebSocket.SocketApplicationCommand.Description"> | |||
| <inheritdoc/> | |||
| </member> | |||
| @@ -20,6 +20,9 @@ namespace Discord.WebSocket | |||
| /// <inheritdoc/> | |||
| public string Name { get; private set; } | |||
| /// <inheritdoc/> | |||
| public ApplicationCommandType Type { get; private set; } | |||
| /// <inheritdoc/> | |||
| public string Description { get; private set; } | |||