diff --git a/src/Wumpus.Net.Rest/Net/IDiscordRestApi.cs b/src/Wumpus.Net.Rest/Net/IDiscordRestApi.cs index 5088bb0..de8a64a 100644 --- a/src/Wumpus.Net.Rest/Net/IDiscordRestApi.cs +++ b/src/Wumpus.Net.Rest/Net/IDiscordRestApi.cs @@ -43,9 +43,9 @@ internal interface IDiscordRestApi : IDisposable /// If modifying a category, individual Channel Update events will fire for each child channel that also changes. /// [Patch("channels/{channelId}")] - Task ModifyChannelAsync([Path] Snowflake channelId, [Body] ModifyChannelParams args); + Task ModifyChannelAsync([Path] Snowflake channelId, [Body] ModifyChannelParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("channels/{channelId}")] - Task DeleteChannelAsync([Path] Snowflake channelId); + Task DeleteChannelAsync([Path] Snowflake channelId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); /// /// Returns the for a . If operating on a , this endpoint requires the to be present on the current . @@ -68,7 +68,7 @@ internal interface IDiscordRestApi : IDisposable [Patch("channels/{channelId}/messages/{messageId}")] Task ModifyMessageAsync([Path] Snowflake channelId, [Path] Snowflake messageId, [Body] ModifyMessageParams args); [Delete("channels/{channelId}/messages/{messageId}")] - Task DeleteMessageAsync([Path] Snowflake channelId, [Path] Snowflake messageId); + Task DeleteMessageAsync([Path] Snowflake channelId, [Path] Snowflake messageId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Post("channels/{channelId}/messages/bulk-delete")] Task DeleteMessagesAsync([Path] Snowflake channelId, [Body] DeleteMessagesParams args); @@ -84,9 +84,9 @@ internal interface IDiscordRestApi : IDisposable Task DeleteAllReactionsAsync([Path] Snowflake channelId, [Path] Snowflake messageId); [Put("channels/{channelId}/permissions/{overwriteId}")] - Task EditChannelPermissionsAsync([Path] Snowflake channelId, [Path] Snowflake overwriteId, [Body] ModifyChannelPermissionsParams args); + Task EditChannelPermissionsAsync([Path] Snowflake channelId, [Path] Snowflake overwriteId, [Body] ModifyChannelPermissionsParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("channels/{channelId}/permissions/{overwriteId}")] - Task DeleteChannelPermissionsAsync([Path] Snowflake channelId, [Path] Snowflake overwriteId); + Task DeleteChannelPermissionsAsync([Path] Snowflake channelId, [Path] Snowflake overwriteId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Get("channels/{channelId}/invites")] Task GetChannelInvitesAsync([Path] Snowflake channelId); @@ -115,11 +115,11 @@ internal interface IDiscordRestApi : IDisposable [Get("guilds/{guildId}/emoji/{emojiId}")] Task GetGuildEmojiAsync([Path] Snowflake guildId, [Path] Snowflake emojiId); [Post("guilds/{guildId}/emojis")] - Task CreateGuildEmojiAsync([Path] Snowflake guildId, [Body] CreateGuildEmojiParams args); + Task CreateGuildEmojiAsync([Path] Snowflake guildId, [Body] CreateGuildEmojiParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("guilds/{guildId}/emoji/{emojiId}")] - Task ModifyGuildEmojiAsync([Path] Snowflake guildId, [Path] Snowflake emojiId, [Body] ModifyGuildEmojiParams args); + Task ModifyGuildEmojiAsync([Path] Snowflake guildId, [Path] Snowflake emojiId, [Body] ModifyGuildEmojiParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("guilds/{guildId}/emoji/{emojiId}")] - Task DeleteGuildEmojiAsync([Path] Snowflake guildId, [Path] Snowflake emojiId); + Task DeleteGuildEmojiAsync([Path] Snowflake guildId, [Path] Snowflake emojiId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); // Gateway @@ -135,14 +135,14 @@ internal interface IDiscordRestApi : IDisposable [Post("guilds")] Task CreateGuildAsync([Body] CreateGuildParams args); [Patch("guilds/{guildId}")] - Task ModifyGuildAsync([Path] Snowflake guildId, [Body] ModifyGuildParams args); + Task ModifyGuildAsync([Path] Snowflake guildId, [Body] ModifyGuildParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("guilds/{guildId}")] Task DeleteGuildAsync([Path] Snowflake guildId); [Get("guilds/{guildId}/channels")] Task GetGuildChannelsAsync([Path] Snowflake guildId); [Post("guilds/{guildId}/channels")] - Task CreateGuildChannelAsync([Path] Snowflake guildId, [Body] CreateGuildChannelParams args); + Task CreateGuildChannelAsync([Path] Snowflake guildId, [Body] CreateGuildChannelParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("guilds/{guildId}/channels")] Task ModifyGuildChannelPositionsAsync([Path] Snowflake guildId, [Body] ModifyGuildChannelPositionParams[] args); @@ -153,7 +153,7 @@ internal interface IDiscordRestApi : IDisposable [Put("guilds/{guildId}/members/{userId}")] Task AddGuildMemberAsync([Path] Snowflake guildId, [Path] Snowflake userId, [Body] AddGuildMemberParams args); [Delete("guilds/{guildId}/members/{userId}")] - Task RemoveGuildMemberAsync([Path] Snowflake guildId, [Path] Snowflake userId); + Task RemoveGuildMemberAsync([Path] Snowflake guildId, [Path] Snowflake userId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("guilds/{guildId}/members/{userId}")] Task ModifyGuildMemberAsync([Path] Snowflake guildId, [Path] Snowflake userId, [Body] ModifyGuildMemberParams args); [Patch("guilds/{guildId}/members/@me/nick")] @@ -167,25 +167,25 @@ internal interface IDiscordRestApi : IDisposable [Get("guilds/{guildId}/bans")] Task GetGuildBansAsync([Path] Snowflake guildId); [Put("guilds/{guildId}/bans/{userId}")] - Task CreateGuildBanAsync([Path] Snowflake guildId, [Path] Snowflake userId, [QueryMap] CreateGuildBanParams args); + Task CreateGuildBanAsync([Path] Snowflake guildId, [Path] Snowflake userId, [QueryMap] CreateGuildBanParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("guilds/{guildId}/bans/{userId}")] - Task DeleteGuildBanAsync([Path] Snowflake guildId, [Path] Snowflake userId); + Task DeleteGuildBanAsync([Path] Snowflake guildId, [Path] Snowflake userId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Get("guilds/{guildId}/roles")] Task GetGuildRolesAsync([Path] Snowflake guildId); [Post("guilds/{guildId}/roles")] - Task CreateGuildRoleAsync([Path] Snowflake guildId, [Body] CreateGuildRoleParams args); + Task CreateGuildRoleAsync([Path] Snowflake guildId, [Body] CreateGuildRoleParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("guilds/{guildId}/roles/{roleId}")] - Task DeleteGuildRoleAsync([Path] Snowflake guildId, [Path] Snowflake roleId); + Task DeleteGuildRoleAsync([Path] Snowflake guildId, [Path] Snowflake roleId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("guilds/{guildId}/roles/{roleId}")] - Task ModifyGuildRoleAsync([Path] Snowflake guildId, [Path] Snowflake roleId, [Body] ModifyGuildRoleParams args); + Task ModifyGuildRoleAsync([Path] Snowflake guildId, [Path] Snowflake roleId, [Body] ModifyGuildRoleParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("guilds/{guildId}/roles")] Task ModifyGuildRolePositionsAsync([Path] Snowflake guildId, [Body] ModifyGuildRolePositionParams[] args); [Get("guilds/{guildId}/prune")] Task GetGuildPruneCountAsync([Path] Snowflake guildId, [QueryMap] GuildPruneParams args); [Post("guilds/{guildId}/prune")] - Task PruneGuildMembersAsync([Path] Snowflake guildId, [QueryMap] GuildPruneParams args); + Task PruneGuildMembersAsync([Path] Snowflake guildId, [QueryMap] GuildPruneParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Get("guilds/{guildId}/regions")] Task GetGuildVoiceRegionsAsync([Path] Snowflake guildId); @@ -217,7 +217,7 @@ internal interface IDiscordRestApi : IDisposable [Get("invites/{code}")] Task GetInviteAsync([Path] Utf8String code, [QueryMap] GetInviteParams args); [Delete("invites/{code}")] - Task DeleteInviteAsync([Path] Utf8String code); + Task DeleteInviteAsync([Path] Utf8String code, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); // OAuth @@ -265,19 +265,19 @@ internal interface IDiscordRestApi : IDisposable Task GetWebhookAsync([Path] Snowflake webhookId, [Path] Utf8String webhookToken); [Post("channels/{channelId}/webhooks")] - Task CreateWebhookAsync([Path] Snowflake channelId, [Body] CreateWebhookParams args); + Task CreateWebhookAsync([Path] Snowflake channelId, [Body] CreateWebhookParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("webhooks/{webhookId}")] - Task DeleteWebhookAsync([Path] Snowflake webhookId); + Task DeleteWebhookAsync([Path] Snowflake webhookId, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Delete("webhooks/{webhookId}/{webhookToken}")] [Header("Authorization", null)] - Task DeleteWebhookAsync([Path] Snowflake webhookId, [Path] Utf8String webhookToken); + Task DeleteWebhookAsync([Path] Snowflake webhookId, [Path] Utf8String webhookToken, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("webhooks/{webhookId}")] - Task ModifyWebhookAsync([Path] Snowflake webhookId, ModifyWebhookParams args); + Task ModifyWebhookAsync([Path] Snowflake webhookId, ModifyWebhookParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Patch("webhooks/{webhookId}/{webhookToken}")] [Header("Authorization", null)] - Task ModifyWebhookAsync([Path] Snowflake webhookId, [Path] Utf8String webhookToken, ModifyWebhookParams args); + Task ModifyWebhookAsync([Path] Snowflake webhookId, [Path] Utf8String webhookToken, ModifyWebhookParams args, [Header(WumpusRestClient.ReasonHeader)] Utf8String reason = null); [Post("webhooks/{webhookId}/{webhookToken}")] [Header("Authorization", null)] diff --git a/src/Wumpus.Net.Rest/WumpusRestClient.cs b/src/Wumpus.Net.Rest/WumpusRestClient.cs index 8bbebf0..5575d73 100644 --- a/src/Wumpus.Net.Rest/WumpusRestClient.cs +++ b/src/Wumpus.Net.Rest/WumpusRestClient.cs @@ -16,6 +16,11 @@ namespace Wumpus public class WumpusRestClient : IDiscordRestApi, IDisposable { public const int ApiVersion = 6; + public const string ReasonHeader = "X-Audit-Log-Reason"; + /// + /// The maximum valid length of the audit log reason header string. + /// + public const int MaxReasonHeaderLength = 512; public static string Version { get; } = typeof(WumpusRestClient).GetTypeInfo().Assembly.GetCustomAttribute()?.InformationalVersion ?? typeof(WumpusRestClient).GetTypeInfo().Assembly.GetName().Version.ToString(3) ?? @@ -64,17 +69,19 @@ public Task ReplaceChannelAsync(Snowflake channelId, ModifyChannelParam args.Validate(); return _api.ReplaceChannelAsync(channelId, args); } - public Task ModifyChannelAsync(Snowflake channelId, ModifyChannelParams args) + public Task ModifyChannelAsync(Snowflake channelId, ModifyChannelParams args, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.ModifyChannelAsync(channelId, args); + return _api.ModifyChannelAsync(channelId, args, reason); } - public Task DeleteChannelAsync(Snowflake channelId) + public Task DeleteChannelAsync(Snowflake channelId, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); - return _api.DeleteChannelAsync(channelId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteChannelAsync(channelId, reason); } public Task GetChannelMessagesAsync(Snowflake channelId, GetChannelMessagesParams args) @@ -105,11 +112,12 @@ public Task ModifyMessageAsync(Snowflake channelId, Snowflake messageId args.Validate(); return _api.ModifyMessageAsync(channelId, messageId, args); } - public Task DeleteMessageAsync(Snowflake channelId, Snowflake messageId) + public Task DeleteMessageAsync(Snowflake channelId, Snowflake messageId, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); Preconditions.NotZero(messageId, nameof(messageId)); - return _api.DeleteMessageAsync(channelId, messageId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteMessageAsync(channelId, messageId, reason); } public Task DeleteMessagesAsync(Snowflake channelId, DeleteMessagesParams args) { @@ -155,19 +163,21 @@ public Task DeleteAllReactionsAsync(Snowflake channelId, Snowflake messageId) return _api.DeleteAllReactionsAsync(channelId, messageId); } - public Task EditChannelPermissionsAsync(Snowflake channelId, Snowflake overwriteId, ModifyChannelPermissionsParams args) + public Task EditChannelPermissionsAsync(Snowflake channelId, Snowflake overwriteId, ModifyChannelPermissionsParams args, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); Preconditions.NotZero(overwriteId, nameof(overwriteId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.EditChannelPermissionsAsync(channelId, overwriteId, args); + return _api.EditChannelPermissionsAsync(channelId, overwriteId, args, reason); } - public Task DeleteChannelPermissionsAsync(Snowflake channelId, Snowflake overwriteId) + public Task DeleteChannelPermissionsAsync(Snowflake channelId, Snowflake overwriteId, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); Preconditions.NotZero(overwriteId, nameof(overwriteId)); - return _api.DeleteChannelPermissionsAsync(channelId, overwriteId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteChannelPermissionsAsync(channelId, overwriteId, reason); } public Task GetChannelInvitesAsync(Snowflake channelId) @@ -235,24 +245,27 @@ public Task GetGuildEmojiAsync(Snowflake guildId, Snowflake emojiId) Preconditions.NotZero(emojiId, nameof(emojiId)); return _api.GetGuildEmojiAsync(guildId, emojiId); } - public Task CreateGuildEmojiAsync(Snowflake guildId, CreateGuildEmojiParams args) + public Task CreateGuildEmojiAsync(Snowflake guildId, CreateGuildEmojiParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotNull(args, nameof(args)); - return _api.CreateGuildEmojiAsync(guildId, args); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.CreateGuildEmojiAsync(guildId, args, reason); } - public Task ModifyGuildEmojiAsync(Snowflake guildId, Snowflake emojiId, ModifyGuildEmojiParams args) + public Task ModifyGuildEmojiAsync(Snowflake guildId, Snowflake emojiId, ModifyGuildEmojiParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(emojiId, nameof(emojiId)); Preconditions.NotNull(args, nameof(args)); - return _api.ModifyGuildEmojiAsync(guildId, emojiId, args); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.ModifyGuildEmojiAsync(guildId, emojiId, args, reason); } - public Task DeleteGuildEmojiAsync(Snowflake guildId, Snowflake emojiId) + public Task DeleteGuildEmojiAsync(Snowflake guildId, Snowflake emojiId, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(emojiId, nameof(emojiId)); - return _api.DeleteGuildEmojiAsync(guildId, emojiId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteGuildEmojiAsync(guildId, emojiId, reason); } // Gateway @@ -279,12 +292,13 @@ public Task CreateGuildAsync(CreateGuildParams args) args.Validate(); return _api.CreateGuildAsync(args); } - public Task ModifyGuildAsync(Snowflake guildId, ModifyGuildParams args) + public Task ModifyGuildAsync(Snowflake guildId, ModifyGuildParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.ModifyGuildAsync(guildId, args); + return _api.ModifyGuildAsync(guildId, args, reason); } public Task DeleteGuildAsync(Snowflake guildId) { @@ -297,12 +311,13 @@ public Task GetGuildChannelsAsync(Snowflake guildId) Preconditions.NotZero(guildId, nameof(guildId)); return _api.GetGuildChannelsAsync(guildId); } - public Task CreateGuildChannelAsync(Snowflake guildId, CreateGuildChannelParams args) + public Task CreateGuildChannelAsync(Snowflake guildId, CreateGuildChannelParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.CreateGuildChannelAsync(guildId, args); + return _api.CreateGuildChannelAsync(guildId, args, reason); } public Task ModifyGuildChannelPositionsAsync(Snowflake guildId, ModifyGuildChannelPositionParams[] args) { @@ -334,11 +349,12 @@ public Task AddGuildMemberAsync(Snowflake guildId, Snowflake userId args.Validate(); return _api.AddGuildMemberAsync(guildId, userId, args); } - public Task RemoveGuildMemberAsync(Snowflake guildId, Snowflake userId) + public Task RemoveGuildMemberAsync(Snowflake guildId, Snowflake userId, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(userId, nameof(userId)); - return _api.RemoveGuildMemberAsync(guildId, userId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.RemoveGuildMemberAsync(guildId, userId, reason); } public Task ModifyGuildMemberAsync(Snowflake guildId, Snowflake userId, ModifyGuildMemberParams args) { @@ -376,19 +392,21 @@ public Task GetGuildBansAsync(Snowflake guildId) Preconditions.NotZero(guildId, nameof(guildId)); return _api.GetGuildBansAsync(guildId); } - public Task CreateGuildBanAsync(Snowflake guildId, Snowflake userId, CreateGuildBanParams args) + public Task CreateGuildBanAsync(Snowflake guildId, Snowflake userId, CreateGuildBanParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(userId, nameof(userId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.CreateGuildBanAsync(guildId, userId, args); + return _api.CreateGuildBanAsync(guildId, userId, args, reason); } - public Task DeleteGuildBanAsync(Snowflake guildId, Snowflake userId) + public Task DeleteGuildBanAsync(Snowflake guildId, Snowflake userId, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(userId, nameof(userId)); - return _api.DeleteGuildBanAsync(guildId, userId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteGuildBanAsync(guildId, userId, reason); } public Task GetGuildRolesAsync(Snowflake guildId) @@ -396,26 +414,29 @@ public Task GetGuildRolesAsync(Snowflake guildId) Preconditions.NotZero(guildId, nameof(guildId)); return _api.GetGuildRolesAsync(guildId); } - public Task CreateGuildRoleAsync(Snowflake guildId, CreateGuildRoleParams args) + public Task CreateGuildRoleAsync(Snowflake guildId, CreateGuildRoleParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.CreateGuildRoleAsync(guildId, args); + return _api.CreateGuildRoleAsync(guildId, args, reason); } - public Task DeleteGuildRoleAsync(Snowflake guildId, Snowflake roleId) + public Task DeleteGuildRoleAsync(Snowflake guildId, Snowflake roleId, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(roleId, nameof(roleId)); - return _api.DeleteGuildRoleAsync(guildId, roleId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteGuildRoleAsync(guildId, roleId, reason); } - public Task ModifyGuildRoleAsync(Snowflake guildId, Snowflake roleId, ModifyGuildRoleParams args) + public Task ModifyGuildRoleAsync(Snowflake guildId, Snowflake roleId, ModifyGuildRoleParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotZero(roleId, nameof(roleId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.ModifyGuildRoleAsync(guildId, roleId, args); + return _api.ModifyGuildRoleAsync(guildId, roleId, args, reason); } public Task ModifyGuildRolePositionsAsync(Snowflake guildId, ModifyGuildRolePositionParams[] args) { @@ -433,12 +454,13 @@ public Task GetGuildPruneCountAsync(Snowflake guildId, args.Validate(); return _api.GetGuildPruneCountAsync(guildId, args); } - public Task PruneGuildMembersAsync(Snowflake guildId, GuildPruneParams args) + public Task PruneGuildMembersAsync(Snowflake guildId, GuildPruneParams args, Utf8String reason = null) { Preconditions.NotZero(guildId, nameof(guildId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.PruneGuildMembersAsync(guildId, args); + return _api.PruneGuildMembersAsync(guildId, args, reason); } public Task GetGuildVoiceRegionsAsync(Snowflake guildId) @@ -514,10 +536,11 @@ public Task GetInviteAsync(Utf8String code, GetInviteParams args) args.Validate(); return _api.GetInviteAsync(code, args); } - public Task DeleteInviteAsync(Utf8String code) + public Task DeleteInviteAsync(Utf8String code, Utf8String reason = null) { Preconditions.NotNullOrWhitespace(code, nameof(code)); - return _api.DeleteInviteAsync(code); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteInviteAsync(code, reason); } // User @@ -598,40 +621,45 @@ public Task GetWebhookAsync(Snowflake webhookId, Utf8String webhookToke return _api.GetWebhookAsync(webhookId, webhookToken); } - public Task CreateWebhookAsync(Snowflake channelId, CreateWebhookParams args) + public Task CreateWebhookAsync(Snowflake channelId, CreateWebhookParams args, Utf8String reason = null) { Preconditions.NotZero(channelId, nameof(channelId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.CreateWebhookAsync(channelId, args); + return _api.CreateWebhookAsync(channelId, args, reason); } - public Task DeleteWebhookAsync(Snowflake webhookId) + public Task DeleteWebhookAsync(Snowflake webhookId, Utf8String reason = null) { Preconditions.NotZero(webhookId, nameof(webhookId)); - return _api.DeleteWebhookAsync(webhookId); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteWebhookAsync(webhookId, reason); } - public Task DeleteWebhookAsync(Snowflake webhookId, Utf8String webhookToken) + public Task DeleteWebhookAsync(Snowflake webhookId, Utf8String webhookToken, Utf8String reason = null) { Preconditions.NotZero(webhookId, nameof(webhookId)); Preconditions.NotNullOrWhitespace(webhookToken, nameof(webhookToken)); - return _api.DeleteWebhookAsync(webhookId, webhookToken); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); + return _api.DeleteWebhookAsync(webhookId, webhookToken, reason); } - public Task ModifyWebhookAsync(Snowflake webhookId, ModifyWebhookParams args) + public Task ModifyWebhookAsync(Snowflake webhookId, ModifyWebhookParams args, Utf8String reason = null) { Preconditions.NotZero(webhookId, nameof(webhookId)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.ModifyWebhookAsync(webhookId, args); + return _api.ModifyWebhookAsync(webhookId, args, reason); } - public Task ModifyWebhookAsync(Snowflake webhookId, Utf8String webhookToken, ModifyWebhookParams args) + public Task ModifyWebhookAsync(Snowflake webhookId, Utf8String webhookToken, ModifyWebhookParams args, Utf8String reason = null) { Preconditions.NotZero(webhookId, nameof(webhookId)); Preconditions.NotNullOrWhitespace(webhookToken, nameof(webhookToken)); Preconditions.NotNull(args, nameof(args)); + Preconditions.LengthLessThan(reason, MaxReasonHeaderLength, nameof(reason)); args.Validate(); - return _api.ModifyWebhookAsync(webhookId, webhookToken, args); + return _api.ModifyWebhookAsync(webhookId, webhookToken, args, reason); } public Task ExecuteWebhookAsync(Snowflake webhookId, Utf8String webhookToken, ExecuteWebhookParams args)