From 8c3290967c09cb954024cfda48ede28360bb37ff Mon Sep 17 00:00:00 2001 From: Hsu Still <341464@gmail.com> Date: Wed, 4 Apr 2018 12:26:57 +0800 Subject: [PATCH 1/4] Initial implementation --- .../Entities/Channels/GuildChannelProperties.cs | 6 +++++- src/Discord.Net.Rest/API/Common/Overwrite.cs | 10 +++++++++- .../API/Rest/ModifyGuildChannelParams.cs | 2 ++ .../Entities/Channels/ChannelHelper.cs | 12 ++++++++++-- .../Entities/Channels/RestGuildChannel.cs | 5 +++-- .../Entities/Channels/SocketGuildChannel.cs | 4 ++-- 6 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs index 2ac6c8d52..ebc778980 100644 --- a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs @@ -1,4 +1,4 @@ -namespace Discord +namespace Discord { /// /// Modify an IGuildChannel with the specified changes. @@ -30,5 +30,9 @@ /// Sets the category for this channel /// public Optional CategoryId { get; set; } + /// + /// Syncs the permission with the channel's parent (category). + /// + public Optional SyncWithParent { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Common/Overwrite.cs b/src/Discord.Net.Rest/API/Common/Overwrite.cs index 1ba836127..bf5e85fef 100644 --- a/src/Discord.Net.Rest/API/Common/Overwrite.cs +++ b/src/Discord.Net.Rest/API/Common/Overwrite.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API @@ -13,5 +13,13 @@ namespace Discord.API public ulong Deny { get; set; } [JsonProperty("allow"), Int53] public ulong Allow { get; set; } + + public Overwrite(ulong targetId, PermissionTarget targetType, ulong allowValue, ulong denyValue) + { + TargetId = targetId; + TargetType = targetType; + Allow = allowValue; + Deny = denyValue; + } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs index 120eeb3a8..41ae52eb8 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildChannelParams.cs @@ -12,5 +12,7 @@ namespace Discord.API.Rest public Optional Position { get; set; } [JsonProperty("parent_id")] public Optional CategoryId { get; set; } + [JsonProperty("permission_overwrites")] + public Optional Overwrites { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 6784f7f6a..f23577ea8 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -19,17 +19,25 @@ namespace Discord.Rest { await client.ApiClient.DeleteChannelAsync(channel.Id, options).ConfigureAwait(false); } + public static async Task ModifyAsync(IGuildChannel channel, BaseDiscordClient client, Action func, + IEnumerable overwrites, RequestOptions options) { var args = new GuildChannelProperties(); func(args); - var apiArgs = new API.Rest.ModifyGuildChannelParams + var apiArgs = new ModifyGuildChannelParams { Name = args.Name, Position = args.Position, - CategoryId = args.CategoryId + CategoryId = args.CategoryId, + Overwrites = args.SyncWithParent.Value + ? overwrites + .Select(overwrite => new API.Overwrite(overwrite.TargetId, overwrite.TargetType, + overwrite.Permissions.AllowValue, overwrite.Permissions.DenyValue)) + .ToArray() + : null }; return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index 026d03cc8..609153ea8 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -58,7 +58,8 @@ namespace Discord.Rest } public async Task ModifyAsync(Action func, RequestOptions options = null) { - var model = await ChannelHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); + var categoryChannel = await GetCategoryAsync().ConfigureAwait(false); + var model = await ChannelHelper.ModifyAsync(this, Discord, func, categoryChannel.PermissionOverwrites, options).ConfigureAwait(false); Update(model); } public Task DeleteAsync(RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 2163daf55..48c691e7f 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -1,4 +1,4 @@ -using Discord.Rest; +using Discord.Rest; using System; using System.Collections.Generic; using System.Collections.Immutable; @@ -58,7 +58,7 @@ namespace Discord.WebSocket } public Task ModifyAsync(Action func, RequestOptions options = null) - => ChannelHelper.ModifyAsync(this, Discord, func, options); + => ChannelHelper.ModifyAsync(this, Discord, func, Category.PermissionOverwrites, options); public Task DeleteAsync(RequestOptions options = null) => ChannelHelper.DeleteAsync(this, Discord, options); From 00f2a08bcbcc6218c780bc99ed85f94e1e874214 Mon Sep 17 00:00:00 2001 From: Hsu Still <341464@gmail.com> Date: Wed, 4 Apr 2018 12:38:34 +0800 Subject: [PATCH 2/4] Remove unnecessary call for REST if user didn't specify the bool --- .../Entities/Channels/ChannelHelper.cs | 17 +++++++++-------- .../Entities/Channels/RestGuildChannel.cs | 3 +-- .../Entities/Channels/SocketGuildChannel.cs | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index f23577ea8..f32a44f8a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -22,7 +22,6 @@ namespace Discord.Rest public static async Task ModifyAsync(IGuildChannel channel, BaseDiscordClient client, Action func, - IEnumerable overwrites, RequestOptions options) { var args = new GuildChannelProperties(); @@ -31,14 +30,16 @@ namespace Discord.Rest { Name = args.Name, Position = args.Position, - CategoryId = args.CategoryId, - Overwrites = args.SyncWithParent.Value - ? overwrites - .Select(overwrite => new API.Overwrite(overwrite.TargetId, overwrite.TargetType, - overwrite.Permissions.AllowValue, overwrite.Permissions.DenyValue)) - .ToArray() - : null + CategoryId = args.CategoryId }; + if (args.SyncWithParent.IsSpecified && args.SyncWithParent.Value) + { + var categoryChannel = await channel.GetCategoryAsync().ConfigureAwait(false); + apiArgs.Overwrites = categoryChannel.PermissionOverwrites + .Select(overwrite => new API.Overwrite(overwrite.TargetId, overwrite.TargetType, + overwrite.Permissions.AllowValue, overwrite.Permissions.DenyValue)) + .ToArray(); + } return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } public static async Task ModifyAsync(ITextChannel channel, BaseDiscordClient client, diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index 609153ea8..3dcb96354 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -58,8 +58,7 @@ namespace Discord.Rest } public async Task ModifyAsync(Action func, RequestOptions options = null) { - var categoryChannel = await GetCategoryAsync().ConfigureAwait(false); - var model = await ChannelHelper.ModifyAsync(this, Discord, func, categoryChannel.PermissionOverwrites, options).ConfigureAwait(false); + var model = await ChannelHelper.ModifyAsync(this, Discord, func, options).ConfigureAwait(false); Update(model); } public Task DeleteAsync(RequestOptions options = null) diff --git a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs index 48c691e7f..793248f88 100644 --- a/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs +++ b/src/Discord.Net.WebSocket/Entities/Channels/SocketGuildChannel.cs @@ -58,7 +58,7 @@ namespace Discord.WebSocket } public Task ModifyAsync(Action func, RequestOptions options = null) - => ChannelHelper.ModifyAsync(this, Discord, func, Category.PermissionOverwrites, options); + => ChannelHelper.ModifyAsync(this, Discord, func, options); public Task DeleteAsync(RequestOptions options = null) => ChannelHelper.DeleteAsync(this, Discord, options); From 023c33070479276510e9edd87c0a4cc62decf7bf Mon Sep 17 00:00:00 2001 From: Hsu Still <341464@gmail.com> Date: Wed, 4 Apr 2018 12:45:15 +0800 Subject: [PATCH 3/4] Fix NRE when a parent isn't found --- .../Entities/Channels/ChannelHelper.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index f32a44f8a..5e6886f3f 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -35,11 +35,13 @@ namespace Discord.Rest if (args.SyncWithParent.IsSpecified && args.SyncWithParent.Value) { var categoryChannel = await channel.GetCategoryAsync().ConfigureAwait(false); - apiArgs.Overwrites = categoryChannel.PermissionOverwrites - .Select(overwrite => new API.Overwrite(overwrite.TargetId, overwrite.TargetType, - overwrite.Permissions.AllowValue, overwrite.Permissions.DenyValue)) - .ToArray(); + if (categoryChannel != null) + apiArgs.Overwrites = categoryChannel.PermissionOverwrites + .Select(overwrite => new API.Overwrite(overwrite.TargetId, overwrite.TargetType, + overwrite.Permissions.AllowValue, overwrite.Permissions.DenyValue)) + .ToArray(); } + return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } public static async Task ModifyAsync(ITextChannel channel, BaseDiscordClient client, From 0fb4e1c71e2817fd7361a50136235ef2fb2d999f Mon Sep 17 00:00:00 2001 From: Hsu Still <341464@gmail.com> Date: Wed, 4 Apr 2018 12:52:21 +0800 Subject: [PATCH 4/4] Rename to SyncWithCategory --- .../Entities/Channels/GuildChannelProperties.cs | 2 +- src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs index ebc778980..1e789297b 100644 --- a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs @@ -33,6 +33,6 @@ namespace Discord /// /// Syncs the permission with the channel's parent (category). /// - public Optional SyncWithParent { get; set; } + public Optional SyncWithCategory { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 5e6886f3f..c22a3b77b 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -26,13 +26,13 @@ namespace Discord.Rest { var args = new GuildChannelProperties(); func(args); - var apiArgs = new ModifyGuildChannelParams + var apiArgs = new API.Rest.ModifyGuildChannelParams { Name = args.Name, Position = args.Position, CategoryId = args.CategoryId }; - if (args.SyncWithParent.IsSpecified && args.SyncWithParent.Value) + if (args.SyncWithCategory.IsSpecified && args.SyncWithCategory.Value) { var categoryChannel = await channel.GetCategoryAsync().ConfigureAwait(false); if (categoryChannel != null)