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);