* 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 name="T:Discord.IApplicationCommand"> | |||
<summary> | |||
The base command model that belongs to an application. | |||
The base command model that belongs to an application. | |||
</summary> | |||
</member> | |||
<member name="P:Discord.IApplicationCommand.ApplicationId"> | |||
@@ -4729,6 +4729,17 @@ | |||
A task that represents the asynchronous modification operation. | |||
</returns> | |||
</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"> | |||
<summary> | |||
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 | |||
{ | |||
/// <summary> | |||
/// The base command model that belongs to an application. | |||
/// The base command model that belongs to an application. | |||
/// </summary> | |||
public interface IApplicationCommand : ISnowflakeEntity, IDeletable | |||
{ | |||
@@ -50,5 +50,17 @@ namespace Discord | |||
/// A task that represents the asynchronous modification operation. | |||
/// </returns> | |||
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/> | |||
</member> | |||
<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/> | |||
</member> | |||
<member name="T:Discord.Rest.RestApplicationCommandChoice"> | |||
@@ -3961,7 +3964,7 @@ | |||
<member name="M:Discord.Rest.RestGlobalCommand.DeleteAsync(Discord.RequestOptions)"> | |||
<inheritdoc/> | |||
</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> | |||
Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
</summary> | |||
@@ -3984,7 +3987,7 @@ | |||
<member name="M:Discord.Rest.RestGuildCommand.DeleteAsync(Discord.RequestOptions)"> | |||
<inheritdoc/> | |||
</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> | |||
Modifies this <see cref="T:Discord.Rest.RestApplicationCommand"/>. | |||
</summary> | |||
@@ -48,7 +48,7 @@ namespace Discord.Rest | |||
RequestOptions options = null) | |||
{ | |||
var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false); | |||
return RestGlobalCommand.Create(client, model); | |||
} | |||
@@ -164,10 +164,28 @@ namespace Discord.Rest | |||
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, | |||
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); | |||
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, | |||
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); | |||
return ModifyGuildCommand(client, command, guildId, arg, options); | |||
} | |||
@@ -272,7 +290,7 @@ namespace Discord.Rest | |||
{ | |||
var model = new ModifyApplicationCommandParams() | |||
{ | |||
Name = arg.Name.Value, | |||
Name = arg.Name, | |||
}; | |||
if (arg is SlashCommandProperties slashProps) | |||
@@ -57,6 +57,7 @@ namespace Discord.Rest | |||
internal virtual void Update(Model model) | |||
{ | |||
this.Type = model.Type; | |||
this.ApplicationId = model.ApplicationId; | |||
this.Name = model.Name; | |||
this.Description = model.Description; | |||
@@ -67,12 +68,18 @@ namespace Discord.Rest | |||
: null; | |||
} | |||
/// <inheritdoc/> | |||
public abstract Task DeleteAsync(RequestOptions options = null); | |||
/// <inheritdoc /> | |||
public Task ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options = null) | |||
{ | |||
return ModifyAsync<ApplicationCommandProperties>(func, options); | |||
} | |||
/// <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; | |||
} | |||
@@ -37,9 +37,9 @@ namespace Discord.Rest | |||
/// <returns> | |||
/// The modified command. | |||
/// </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); | |||
} | |||
} | |||
@@ -42,9 +42,9 @@ namespace Discord.Rest | |||
/// <returns> | |||
/// The modified command | |||
/// </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); | |||
} | |||
@@ -4028,16 +4028,11 @@ | |||
<member name="M:Discord.WebSocket.SocketApplicationCommand.DeleteAsync(Discord.RequestOptions)"> | |||
<inheritdoc/> | |||
</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)"> | |||
<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 name="T:Discord.WebSocket.SocketApplicationCommandChoice"> | |||
<summary> | |||
@@ -91,34 +91,24 @@ namespace Discord.WebSocket | |||
public Task DeleteAsync(RequestOptions options = null) | |||
=> 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 | |||
{ | |||
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; | |||
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 | |||
{ | |||
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); | |||
@@ -126,7 +116,5 @@ namespace Discord.WebSocket | |||
// IApplicationCommand | |||
IReadOnlyCollection<IApplicationCommandOption> IApplicationCommand.Options => Options; | |||
Task IApplicationCommand.ModifyAsync(Action<ApplicationCommandProperties> func, RequestOptions options) | |||
=> ModifyAsync(func, options); | |||
} | |||
} |