| @@ -1198,12 +1198,13 @@ namespace Discord | |||
| /// Whether to include full localization dictionaries in the returned objects, | |||
| /// instead of the localized name and description fields. | |||
| /// </param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection | |||
| /// of application commands found within the guild. | |||
| /// </returns> | |||
| Task<IReadOnlyCollection<IApplicationCommand>> GetApplicationCommandsAsync(bool withLocalizations = false, RequestOptions options = null); | |||
| Task<IReadOnlyCollection<IApplicationCommand>> GetApplicationCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null); | |||
| /// <summary> | |||
| /// Gets an application command within this guild with the specified id. | |||
| @@ -156,12 +156,13 @@ namespace Discord | |||
| /// Gets a collection of all global commands. | |||
| /// </summary> | |||
| /// <param name="withLocalizations">Whether to include full localization dictionaries in the returned objects, instead of the name localized and description localized fields.</param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection of global | |||
| /// application commands. | |||
| /// </returns> | |||
| Task<IReadOnlyCollection<IApplicationCommand>> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, RequestOptions options = null); | |||
| Task<IReadOnlyCollection<IApplicationCommand>> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null); | |||
| /// <summary> | |||
| /// Creates a global application command. | |||
| @@ -243,7 +243,7 @@ namespace Discord.Rest | |||
| => Task.FromResult<IApplicationCommand>(null); | |||
| /// <inheritdoc /> | |||
| Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, RequestOptions options) | |||
| Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, string locale, RequestOptions options) | |||
| => Task.FromResult<IReadOnlyCollection<IApplicationCommand>>(ImmutableArray.Create<IApplicationCommand>()); | |||
| Task<IApplicationCommand> IDiscordClient.CreateGlobalApplicationCommand(ApplicationCommandProperties properties, RequestOptions options) | |||
| => Task.FromResult<IApplicationCommand>(null); | |||
| @@ -195,9 +195,9 @@ namespace Discord.Rest | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommandsAsync(BaseDiscordClient client, bool withLocalizations = false, | |||
| RequestOptions options = null) | |||
| string locale = null, RequestOptions options = null) | |||
| { | |||
| var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(withLocalizations, options).ConfigureAwait(false); | |||
| var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(withLocalizations, locale, options).ConfigureAwait(false); | |||
| if (!response.Any()) | |||
| return Array.Empty<RestGlobalCommand>(); | |||
| @@ -213,9 +213,9 @@ namespace Discord.Rest | |||
| } | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommandsAsync(BaseDiscordClient client, ulong guildId, bool withLocalizations = false, | |||
| RequestOptions options = null) | |||
| string locale = null, RequestOptions options = null) | |||
| { | |||
| var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, withLocalizations, options).ConfigureAwait(false); | |||
| var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, withLocalizations, locale, options).ConfigureAwait(false); | |||
| if (!response.Any()) | |||
| return ImmutableArray.Create<RestGuildCommand>(); | |||
| @@ -1213,10 +1213,18 @@ namespace Discord.API | |||
| #endregion | |||
| #region Interactions | |||
| public async Task<ApplicationCommand[]> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, RequestOptions options = null) | |||
| public async Task<ApplicationCommand[]> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| if (locale is not null) | |||
| { | |||
| if (!System.Text.RegularExpressions.Regex.IsMatch(locale, @"^\w{2}(?:-\w{2})?$")) | |||
| throw new ArgumentException($"{locale} is not a valid locale.", nameof(locale)); | |||
| options.RequestHeaders["X-Discord-Locale"] = new[] { locale }; | |||
| } | |||
| //with_localizations=false doesnt return localized names and descriptions | |||
| return await SendAsync<ApplicationCommand[]>("GET", () => $"applications/{CurrentApplicationId}/commands{(withLocalizations ? "?with_localizations=true" : string.Empty)}", | |||
| new BucketIds(), options: options).ConfigureAwait(false); | |||
| @@ -1284,12 +1292,20 @@ namespace Discord.API | |||
| return await SendJsonAsync<ApplicationCommand[]>("PUT", () => $"applications/{CurrentApplicationId}/commands", commands, new BucketIds(), options: options).ConfigureAwait(false); | |||
| } | |||
| public async Task<ApplicationCommand[]> GetGuildApplicationCommandsAsync(ulong guildId, bool withLocalizations = false, RequestOptions options = null) | |||
| public async Task<ApplicationCommand[]> GetGuildApplicationCommandsAsync(ulong guildId, bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| { | |||
| options = RequestOptions.CreateOrClone(options); | |||
| var bucket = new BucketIds(guildId: guildId); | |||
| if (locale is not null) | |||
| { | |||
| if (!System.Text.RegularExpressions.Regex.IsMatch(locale, @"^\w{2}(?:-\w{2})?$")) | |||
| throw new ArgumentException($"{locale} is not a valid locale.", nameof(locale)); | |||
| options.RequestHeaders["X-Discord-Locale"] = new[] { locale }; | |||
| } | |||
| //with_localizations=false doesnt return localized names and descriptions | |||
| return await SendAsync<ApplicationCommand[]>("GET", () => $"applications/{CurrentApplicationId}/commands{(withLocalizations ? "?with_localizations=true" : string.Empty)}", | |||
| bucket, options: options).ConfigureAwait(false); | |||
| @@ -205,10 +205,10 @@ namespace Discord.Rest | |||
| => ClientHelper.CreateGlobalApplicationCommandAsync(this, properties, options); | |||
| public Task<RestGuildCommand> CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null) | |||
| => ClientHelper.CreateGuildApplicationCommandAsync(this, guildId, properties, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(bool withLocalizations = false, RequestOptions options = null) | |||
| => ClientHelper.GetGlobalApplicationCommandsAsync(this, withLocalizations, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(ulong guildId, bool withLocalizations = false, RequestOptions options = null) | |||
| => ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, withLocalizations, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| => ClientHelper.GetGlobalApplicationCommandsAsync(this, withLocalizations, locale, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(ulong guildId, bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| => ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, withLocalizations, locale, options); | |||
| public Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null) | |||
| => ClientHelper.BulkOverwriteGlobalApplicationCommandAsync(this, commandProperties, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null) | |||
| @@ -319,8 +319,8 @@ namespace Discord.Rest | |||
| => await GetWebhookAsync(id, options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, RequestOptions options) | |||
| => await GetGlobalApplicationCommands(withLocalizations, options).ConfigureAwait(false); | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, string locale, RequestOptions options) | |||
| => await GetGlobalApplicationCommands(withLocalizations, locale, options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<IApplicationCommand> IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) | |||
| => await ClientHelper.GetGlobalApplicationCommandAsync(this, id, options).ConfigureAwait(false); | |||
| @@ -363,9 +363,9 @@ namespace Discord.Rest | |||
| #region Interactions | |||
| public static async Task<IReadOnlyCollection<RestGuildCommand>> GetSlashCommandsAsync(IGuild guild, BaseDiscordClient client, bool withLocalizations, | |||
| RequestOptions options) | |||
| string locale, RequestOptions options) | |||
| { | |||
| var models = await client.ApiClient.GetGuildApplicationCommandsAsync(guild.Id, withLocalizations, options); | |||
| var models = await client.ApiClient.GetGuildApplicationCommandsAsync(guild.Id, withLocalizations, locale, options); | |||
| return models.Select(x => RestGuildCommand.Create(client, x, guild.Id)).ToImmutableArray(); | |||
| } | |||
| public static async Task<RestGuildCommand> GetSlashCommandAsync(IGuild guild, ulong id, BaseDiscordClient client, | |||
| @@ -311,13 +311,15 @@ namespace Discord.Rest | |||
| /// <summary> | |||
| /// Gets a collection of slash commands created by the current user in this guild. | |||
| /// </summary> | |||
| /// <param name="withLocalizations">Whether to include full localization dictionaries in the returned objects, instead of the name localized and description localized fields.</param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection of | |||
| /// slash commands created by the current user. | |||
| /// </returns> | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetSlashCommandsAsync(bool withLocalizations = false, RequestOptions options = null) | |||
| => GuildHelper.GetSlashCommandsAsync(this, Discord, withLocalizations, options); | |||
| public Task<IReadOnlyCollection<RestGuildCommand>> GetSlashCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| => GuildHelper.GetSlashCommandsAsync(this, Discord, withLocalizations, locale, options); | |||
| /// <summary> | |||
| /// Gets a slash command in the current guild. | |||
| @@ -928,13 +930,15 @@ namespace Discord.Rest | |||
| /// <summary> | |||
| /// Gets this guilds slash commands | |||
| /// </summary> | |||
| /// <param name="withLocalizations">Whether to include full localization dictionaries in the returned objects, instead of the name localized and description localized fields.</param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection | |||
| /// of application commands found within the guild. | |||
| /// </returns> | |||
| public async Task<IReadOnlyCollection<RestGuildCommand>> GetApplicationCommandsAsync (bool withLocalizations = false, RequestOptions options = null) | |||
| => await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, withLocalizations, options).ConfigureAwait(false); | |||
| public async Task<IReadOnlyCollection<RestGuildCommand>> GetApplicationCommandsAsync (bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| => await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, withLocalizations, locale, options).ConfigureAwait(false); | |||
| /// <summary> | |||
| /// Gets an application command within this guild with the specified id. | |||
| /// </summary> | |||
| @@ -1467,8 +1471,8 @@ namespace Discord.Rest | |||
| async Task<IReadOnlyCollection<IWebhook>> IGuild.GetWebhooksAsync(RequestOptions options) | |||
| => await GetWebhooksAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (bool withLocalizations, RequestOptions options) | |||
| => await GetApplicationCommandsAsync(withLocalizations, options).ConfigureAwait(false); | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (bool withLocalizations, string locale, RequestOptions options) | |||
| => await GetApplicationCommandsAsync(withLocalizations, locale, options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options) | |||
| => await CreateStickerAsync(name, description, tags, image, options); | |||
| @@ -450,14 +450,16 @@ namespace Discord.WebSocket | |||
| /// <summary> | |||
| /// Gets a collection of all global commands. | |||
| /// </summary> | |||
| /// <param name="withLocalizations">Whether to include full localization dictionaries in the returned objects, instead of the name localized and description localized fields.</param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection of global | |||
| /// application commands. | |||
| /// </returns> | |||
| public async Task<IReadOnlyCollection<SocketApplicationCommand>> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, RequestOptions options = null) | |||
| public async Task<IReadOnlyCollection<SocketApplicationCommand>> GetGlobalApplicationCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| { | |||
| var commands = (await ApiClient.GetGlobalApplicationCommandsAsync(withLocalizations, options)).Select(x => SocketApplicationCommand.Create(this, x)); | |||
| var commands = (await ApiClient.GetGlobalApplicationCommandsAsync(withLocalizations, locale, options)).Select(x => SocketApplicationCommand.Create(this, x)); | |||
| foreach(var command in commands) | |||
| { | |||
| @@ -3230,8 +3232,8 @@ namespace Discord.WebSocket | |||
| async Task<IApplicationCommand> IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options) | |||
| => await GetGlobalApplicationCommandAsync(id, options); | |||
| /// <inheritdoc /> | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, RequestOptions options) | |||
| => await GetGlobalApplicationCommandsAsync(withLocalizations, options); | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IDiscordClient.GetGlobalApplicationCommandsAsync(bool withLocalizations, string locale, RequestOptions options) | |||
| => await GetGlobalApplicationCommandsAsync(withLocalizations, locale, options); | |||
| /// <inheritdoc /> | |||
| async Task IDiscordClient.StartAsync() | |||
| @@ -877,14 +877,16 @@ namespace Discord.WebSocket | |||
| /// <summary> | |||
| /// Gets a collection of slash commands created by the current user in this guild. | |||
| /// </summary> | |||
| /// <param name="withLocalizations">Whether to include full localization dictionaries in the returned objects, instead of the name localized and description localized fields.</param> | |||
| /// <param name="locale">The target locale of the localized name and description fields. Sets <c>X-Discord-Locale</c> header, which takes precedence over <c>Accept-Language</c>.</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 read-only collection of | |||
| /// slash commands created by the current user. | |||
| /// </returns> | |||
| public async Task<IReadOnlyCollection<SocketApplicationCommand>> GetApplicationCommandsAsync(bool withLocalizations = false, RequestOptions options = null) | |||
| public async Task<IReadOnlyCollection<SocketApplicationCommand>> GetApplicationCommandsAsync(bool withLocalizations = false, string locale = null, RequestOptions options = null) | |||
| { | |||
| var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(Id, withLocalizations, options)) | |||
| var commands = (await Discord.ApiClient.GetGuildApplicationCommandsAsync(Id, withLocalizations, locale, options)) | |||
| .Select(x => SocketApplicationCommand.Create(Discord, x, Id)); | |||
| foreach (var command in commands) | |||
| @@ -1981,8 +1983,8 @@ namespace Discord.WebSocket | |||
| async Task<IReadOnlyCollection<IWebhook>> IGuild.GetWebhooksAsync(RequestOptions options) | |||
| => await GetWebhooksAsync(options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (bool withLocalizations, RequestOptions options) | |||
| => await GetApplicationCommandsAsync(withLocalizations, options).ConfigureAwait(false); | |||
| async Task<IReadOnlyCollection<IApplicationCommand>> IGuild.GetApplicationCommandsAsync (bool withLocalizations, string locale, RequestOptions options) | |||
| => await GetApplicationCommandsAsync(withLocalizations, locale, options).ConfigureAwait(false); | |||
| /// <inheritdoc /> | |||
| async Task<ICustomSticker> IGuild.CreateStickerAsync(string name, string description, IEnumerable<string> tags, Image image, RequestOptions options) | |||
| => await CreateStickerAsync(name, description, tags, image, options); | |||