* Fix Modify calls of application commands * Fix modification of guild command to use optional name value * Fix RestApplicationCommand update to set type correctly * Add non generic ModifyAsync for application commands to determine type correctlypull/1923/head
@@ -4686,7 +4686,7 @@ | |||||
</member> | </member> | ||||
<member name="T:Discord.IApplicationCommand"> | <member name="T:Discord.IApplicationCommand"> | ||||
<summary> | <summary> | ||||
The base command model that belongs to an application. | |||||
The base command model that belongs to an application. | |||||
</summary> | </summary> | ||||
</member> | </member> | ||||
<member name="P:Discord.IApplicationCommand.ApplicationId"> | <member name="P:Discord.IApplicationCommand.ApplicationId"> | ||||
@@ -4729,6 +4729,17 @@ | |||||
A task that represents the asynchronous modification operation. | A task that represents the asynchronous modification operation. | ||||
</returns> | </returns> | ||||
</member> | </member> | ||||
<member name="M:Discord.IApplicationCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | |||||
<summary> | |||||
Modifies the current application command. | |||||
</summary> | |||||
<param name="func">The new properties to use when modifying the command.</param> | |||||
<param name="options">The options to be used when sending the request.</param> | |||||
<returns> | |||||
A task that represents the asynchronous modification operation. | |||||
</returns> | |||||
<exception cref="T:System.InvalidOperationException">Thrown when you pass in an invalid <see cref="T:Discord.ApplicationCommandProperties"/> type.</exception> | |||||
</member> | |||||
<member name="T:Discord.IApplicationCommandInteractionData"> | <member name="T:Discord.IApplicationCommandInteractionData"> | ||||
<summary> | <summary> | ||||
Represents data of an Interaction Command, see <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-applicationcommandinteractiondata"/>. | Represents data of an Interaction Command, see <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-applicationcommandinteractiondata"/>. | ||||
@@ -7,7 +7,7 @@ using System.Threading.Tasks; | |||||
namespace Discord | namespace Discord | ||||
{ | { | ||||
/// <summary> | /// <summary> | ||||
/// The base command model that belongs to an application. | |||||
/// The base command model that belongs to an application. | |||||
/// </summary> | /// </summary> | ||||
public interface IApplicationCommand : ISnowflakeEntity, IDeletable | public interface IApplicationCommand : ISnowflakeEntity, IDeletable | ||||
{ | { | ||||
@@ -50,5 +50,17 @@ namespace Discord | |||||
/// A task that represents the asynchronous modification operation. | /// A task that represents the asynchronous modification operation. | ||||
/// </returns> | /// </returns> | ||||
Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null); | Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null); | ||||
/// <summary> | |||||
/// Modifies the current application command. | |||||
/// </summary> | |||||
/// <param name="func">The new properties to use when modifying the command.</param> | |||||
/// <param name="options">The options to be used when sending the request.</param> | |||||
/// <returns> | |||||
/// A task that represents the asynchronous modification operation. | |||||
/// </returns> | |||||
/// <exception cref="InvalidOperationException">Thrown when you pass in an invalid <see cref="ApplicationCommandProperties"/> type.</exception> | |||||
Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) | |||||
where TArg : ApplicationCommandProperties; | |||||
} | } | ||||
} | } |
@@ -3910,6 +3910,9 @@ | |||||
<inheritdoc/> | <inheritdoc/> | ||||
</member> | </member> | ||||
<member name="M:Discord.Rest.RestApplicationCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | <member name="M:Discord.Rest.RestApplicationCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | ||||
<inheritdoc /> | |||||
</member> | |||||
<member name="M:Discord.Rest.RestApplicationCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | |||||
<inheritdoc/> | <inheritdoc/> | ||||
</member> | </member> | ||||
<member name="T:Discord.Rest.RestApplicationCommandChoice"> | <member name="T:Discord.Rest.RestApplicationCommandChoice"> | ||||
@@ -3961,7 +3964,7 @@ | |||||
<member name="M:Discord.Rest.RestGlobalCommand.DeleteAsync(Discord.RequestOptions)"> | <member name="M:Discord.Rest.RestGlobalCommand.DeleteAsync(Discord.RequestOptions)"> | ||||
<inheritdoc/> | <inheritdoc/> | ||||
</member> | </member> | ||||
<member name="M:Discord.Rest.RestGlobalCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||||
<member name="M:Discord.Rest.RestGlobalCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | |||||
<summary> | <summary> | ||||
Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | ||||
</summary> | </summary> | ||||
@@ -3984,7 +3987,7 @@ | |||||
<member name="M:Discord.Rest.RestGuildCommand.DeleteAsync(Discord.RequestOptions)"> | <member name="M:Discord.Rest.RestGuildCommand.DeleteAsync(Discord.RequestOptions)"> | ||||
<inheritdoc/> | <inheritdoc/> | ||||
</member> | </member> | ||||
<member name="M:Discord.Rest.RestGuildCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||||
<member name="M:Discord.Rest.RestGuildCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | |||||
<summary> | <summary> | ||||
Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | ||||
</summary> | </summary> | ||||
@@ -48,7 +48,7 @@ namespace Discord.Rest | |||||
RequestOptions options = null) | RequestOptions options = null) | ||||
{ | { | ||||
var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); | var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); | ||||
return RestGlobalCommand.Create(client, model); | return RestGlobalCommand.Create(client, model); | ||||
} | } | ||||
@@ -164,10 +164,28 @@ namespace Discord.Rest | |||||
return await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); | return await client.ApiClient.BulkOverwriteGuildApplicationCommands(guildId, models.ToArray(), options).ConfigureAwait(false); | ||||
} | } | ||||
private static TArg GetApplicationCommandProperties<TArg>(IApplicationCommand command) | |||||
where TArg : ApplicationCommandProperties | |||||
{ | |||||
bool isBaseClass = typeof(TArg) == typeof(ApplicationCommandProperties); | |||||
switch (true) | |||||
{ | |||||
case true when (typeof(TArg) == typeof(SlashCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.Slash: | |||||
return new SlashCommandProperties() as TArg; | |||||
case true when (typeof(TArg) == typeof(MessageCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.Message: | |||||
return new MessageCommandProperties() as TArg; | |||||
case true when (typeof(TArg) == typeof(UserCommandProperties) || isBaseClass) && command.Type == ApplicationCommandType.User: | |||||
return new UserCommandProperties() as TArg; | |||||
default: | |||||
throw new InvalidOperationException($"Cannot modify application command of type {command.Type} with the parameter type {typeof(TArg).FullName}"); | |||||
} | |||||
} | |||||
public static Task<ApplicationCommand> ModifyGlobalCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, | public static Task<ApplicationCommand> ModifyGlobalCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, | ||||
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||||
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||||
{ | { | ||||
var arg = (TArg)Activator.CreateInstance(typeof(TArg)); | |||||
var arg = GetApplicationCommandProperties<TArg>(command); | |||||
func(arg); | func(arg); | ||||
return ModifyGlobalCommand(client, command, arg, options); | return ModifyGlobalCommand(client, command, arg, options); | ||||
} | } | ||||
@@ -260,9 +278,9 @@ namespace Discord.Rest | |||||
} | } | ||||
public static Task<ApplicationCommand> ModifyGuildCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | public static Task<ApplicationCommand> ModifyGuildCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId, | ||||
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||||
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | |||||
{ | { | ||||
var arg = (TArg)Activator.CreateInstance(typeof(TArg)); | |||||
var arg = GetApplicationCommandProperties<TArg>(command); | |||||
func(arg); | func(arg); | ||||
return ModifyGuildCommand(client, command, guildId, arg, options); | return ModifyGuildCommand(client, command, guildId, arg, options); | ||||
} | } | ||||
@@ -272,7 +290,7 @@ namespace Discord.Rest | |||||
{ | { | ||||
var model = new ModifyApplicationCommandParams() | var model = new ModifyApplicationCommandParams() | ||||
{ | { | ||||
Name = arg.Name.Value, | |||||
Name = arg.Name, | |||||
}; | }; | ||||
if (arg is SlashCommandProperties slashProps) | if (arg is SlashCommandProperties slashProps) | ||||
@@ -57,6 +57,7 @@ namespace Discord.Rest | |||||
internal virtual void Update(Model model) | internal virtual void Update(Model model) | ||||
{ | { | ||||
this.Type = model.Type; | |||||
this.ApplicationId = model.ApplicationId; | this.ApplicationId = model.ApplicationId; | ||||
this.Name = model.Name; | this.Name = model.Name; | ||||
this.Description = model.Description; | this.Description = model.Description; | ||||
@@ -67,12 +68,18 @@ namespace Discord.Rest | |||||
: null; | : null; | ||||
} | } | ||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
public abstract Task DeleteAsync(RequestOptions options = null); | public abstract Task DeleteAsync(RequestOptions options = null); | ||||
/// <inheritdoc /> | |||||
public Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||||
{ | |||||
return ModifyAsync<ApplicationCommandProperties>(func, options); | |||||
} | |||||
/// <inheritdoc/> | /// <inheritdoc/> | ||||
public abstract Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null); | |||||
public abstract Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) | |||||
where TArg : ApplicationCommandProperties; | |||||
IReadOnlyCollection<IApplicationCommandOption> IApplicationCommand.Options => Options; | IReadOnlyCollection<IApplicationCommandOption> IApplicationCommand.Options => Options; | ||||
} | } | ||||
@@ -37,9 +37,9 @@ namespace Discord.Rest | |||||
/// <returns> | /// <returns> | ||||
/// The modified command. | /// The modified command. | ||||
/// </returns> | /// </returns> | ||||
public override async Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||||
public override async Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) | |||||
{ | { | ||||
var cmd = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); | |||||
var cmd = await InteractionHelper.ModifyGlobalCommand<TArg>(Discord, this, func, options).ConfigureAwait(false); | |||||
this.Update(cmd); | this.Update(cmd); | ||||
} | } | ||||
} | } | ||||
@@ -42,9 +42,9 @@ namespace Discord.Rest | |||||
/// <returns> | /// <returns> | ||||
/// The modified command | /// The modified command | ||||
/// </returns> | /// </returns> | ||||
public override async Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||||
public override async Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) | |||||
{ | { | ||||
var model = await InteractionHelper.ModifyGuildCommand(Discord, this, GuildId, func, options).ConfigureAwait(false); | |||||
var model = await InteractionHelper.ModifyGuildCommand<TArg>(Discord, this, GuildId, func, options).ConfigureAwait(false); | |||||
this.Update(model); | this.Update(model); | ||||
} | } | ||||
@@ -4028,16 +4028,11 @@ | |||||
<member name="M:Discord.WebSocket.SocketApplicationCommand.DeleteAsync(Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketApplicationCommand.DeleteAsync(Discord.RequestOptions)"> | ||||
<inheritdoc/> | <inheritdoc/> | ||||
</member> | </member> | ||||
<member name="M:Discord.WebSocket.SocketApplicationCommand.ModifyAsync(System.Action{Discord.ApplicationCommandProperties},Discord.RequestOptions)"> | |||||
<inheritdoc /> | |||||
</member> | |||||
<member name="M:Discord.WebSocket.SocketApplicationCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | <member name="M:Discord.WebSocket.SocketApplicationCommand.ModifyAsync``1(System.Action{``0},Discord.RequestOptions)"> | ||||
<summary> | |||||
Modifies the current application command. | |||||
</summary> | |||||
<param name="func">The new properties to use when modifying the command.</param> | |||||
<param name="options">The options to be used when sending the request.</param> | |||||
<returns> | |||||
A task that represents the asynchronous modification operation. | |||||
</returns> | |||||
<exception cref="T:System.InvalidOperationException">Thrown when you pass in an invalid <see cref="T:Discord.ApplicationCommandProperties"/> type.</exception> | |||||
<inheritdoc /> | |||||
</member> | </member> | ||||
<member name="T:Discord.WebSocket.SocketApplicationCommandChoice"> | <member name="T:Discord.WebSocket.SocketApplicationCommandChoice"> | ||||
<summary> | <summary> | ||||
@@ -91,34 +91,24 @@ namespace Discord.WebSocket | |||||
public Task DeleteAsync(RequestOptions options = null) | public Task DeleteAsync(RequestOptions options = null) | ||||
=> InteractionHelper.DeleteUnknownApplicationCommand(Discord, this.GuildId, this, options); | => InteractionHelper.DeleteUnknownApplicationCommand(Discord, this.GuildId, this, options); | ||||
/// <summary> | |||||
/// Modifies the current application command. | |||||
/// </summary> | |||||
/// <param name="func">The new properties to use when modifying the command.</param> | |||||
/// <param name="options">The options to be used when sending the request.</param> | |||||
/// <returns> | |||||
/// A task that represents the asynchronous modification operation. | |||||
/// </returns> | |||||
/// <exception cref="InvalidOperationException">Thrown when you pass in an invalid <see cref="ApplicationCommandProperties"/> type.</exception> | |||||
/// <inheritdoc /> | |||||
public Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||||
{ | |||||
return ModifyAsync<ApplicationCommandProperties>(func, options); | |||||
} | |||||
/// <inheritdoc /> | |||||
public async Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | public async Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties | ||||
{ | { | ||||
switch (typeof(TArg)) | |||||
{ | |||||
case Type messageCommand when messageCommand == typeof(MessageCommandProperties) && this.Type != ApplicationCommandType.Message: | |||||
case Type slashCommand when slashCommand == typeof(SlashCommandProperties) && this.Type != ApplicationCommandType.Slash: | |||||
case Type userCommand when userCommand == typeof(UserCommandProperties) && this.Type != ApplicationCommandType.User: | |||||
throw new InvalidOperationException($"Cannot modify this application command with the parameter type {nameof(TArg)}"); | |||||
} | |||||
Model command = null; | Model command = null; | ||||
if (this.IsGlobalCommand) | if (this.IsGlobalCommand) | ||||
{ | { | ||||
command = await InteractionHelper.ModifyGlobalCommand(Discord, this, func, options).ConfigureAwait(false); | |||||
command = await InteractionHelper.ModifyGlobalCommand<TArg>(Discord, this, func, options).ConfigureAwait(false); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
command = await InteractionHelper.ModifyGuildCommand(Discord, this, this.GuildId.Value, func, options); | |||||
command = await InteractionHelper.ModifyGuildCommand<TArg>(Discord, this, this.GuildId.Value, func, options); | |||||
} | } | ||||
this.Update(command); | this.Update(command); | ||||
@@ -126,7 +116,5 @@ namespace Discord.WebSocket | |||||
// IApplicationCommand | // IApplicationCommand | ||||
IReadOnlyCollection<IApplicationCommandOption> IApplicationCommand.Options => Options; | IReadOnlyCollection<IApplicationCommandOption> IApplicationCommand.Options => Options; | ||||
Task IApplicationCommand.ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options) | |||||
=> ModifyAsync(func, options); | |||||
} | } | ||||
} | } |