diff --git a/src/Discord.Net/DiscordClient.API.cs b/src/Discord.Net/DiscordClient.API.cs index 6b3dacdfb..33ca1f2df 100644 --- a/src/Discord.Net/DiscordClient.API.cs +++ b/src/Discord.Net/DiscordClient.API.cs @@ -541,7 +541,7 @@ namespace Discord uint denyValue = deny?.RawValue ?? 0; bool changed = false; - var perms = channel.PermissionOverwrites.Where(x => x.Type != targetType || x.TargetId != targetId).FirstOrDefault(); + var perms = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).FirstOrDefault(); if (allowValue != 0 || denyValue != 0) { await _api.SetChannelPermissions(channel.Id, targetId, targetType, allowValue, denyValue); @@ -567,7 +567,7 @@ namespace Discord await _api.DeleteChannelPermissions(channel.Id, targetId); if (perms != null) { - channel._permissionOverwrites = channel.PermissionOverwrites.Where(x => x.Type != targetType || x.TargetId != targetId).ToArray(); + channel._permissionOverwrites = channel.PermissionOverwrites.Where(x => x.TargetType != targetType || x.TargetId != targetId).ToArray(); changed = true; } } @@ -614,11 +614,11 @@ namespace Discord try { - var perms = channel.PermissionOverwrites.Where(x => x.Type != idType || x.TargetId != userOrRoleId).FirstOrDefault(); + var perms = channel.PermissionOverwrites.Where(x => x.TargetType != idType || x.TargetId != userOrRoleId).FirstOrDefault(); await _api.DeleteChannelPermissions(channel.Id, userOrRoleId).ConfigureAwait(false); if (perms != null) { - channel.PermissionOverwrites.Where(x => x.Type != idType || x.TargetId != userOrRoleId).ToArray(); + channel.PermissionOverwrites.Where(x => x.TargetType != idType || x.TargetId != userOrRoleId).ToArray(); if (idType == PermissionTarget.Role) channel.InvalidatePermissionsCache(); diff --git a/src/Discord.Net/Models/Channel.cs b/src/Discord.Net/Models/Channel.cs index a9fc96b61..106335e8a 100644 --- a/src/Discord.Net/Models/Channel.cs +++ b/src/Discord.Net/Models/Channel.cs @@ -9,14 +9,14 @@ namespace Discord { public sealed class PermissionOverwrite { - public string Type { get; } + public string TargetType { get; } public string TargetId { get; } public PackedChannelPermissions Allow { get; } public PackedChannelPermissions Deny { get; } internal PermissionOverwrite(string type, string targetId, uint allow, uint deny) { - Type = type; + TargetType = type; TargetId = targetId; Allow = new PackedChannelPermissions(allow); Deny = new PackedChannelPermissions( deny); diff --git a/src/Discord.Net/Models/Member.cs b/src/Discord.Net/Models/Member.cs index c4fbd4ba8..57b85229d 100644 --- a/src/Discord.Net/Models/Member.cs +++ b/src/Discord.Net/Models/Member.cs @@ -176,9 +176,10 @@ namespace Discord PackedChannelPermissions permissions; if (!_permissions.TryGetValue(channelId, out permissions)) return; uint newPermissions = 0x0; + uint oldPermissions = permissions.RawValue; if (UserId == server.OwnerId) - newPermissions = PackedChannelPermissions.Mask; + newPermissions = PackedChannelPermissions.All.RawValue; else { if (channel == null) return; @@ -187,24 +188,26 @@ namespace Discord var orderedRoles = Roles.OrderBy(x => x.Id); foreach (var serverRole in orderedRoles) newPermissions |= serverRole.Permissions.RawValue; - foreach (var denyRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Deny.RawValue != 0 && orderedRoles.Any(y => y.Id == x.TargetId))) + foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Deny.RawValue != 0 && orderedRoles.Any(y => y.Id == x.TargetId))) newPermissions &= ~denyRole.Deny.RawValue; - foreach (var allowRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Allow.RawValue != 0 && orderedRoles.Any(y => y.Id == x.TargetId))) + foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && orderedRoles.Any(y => y.Id == x.TargetId))) newPermissions |= allowRole.Allow.RawValue; - foreach (var denyMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.TargetId == UserId && x.Deny.RawValue != 0)) + foreach (var denyMembers in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Member && x.TargetId == UserId && x.Deny.RawValue != 0)) newPermissions &= ~denyMembers.Deny.RawValue; - foreach (var allowMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.TargetId == UserId && x.Allow.RawValue != 0)) + foreach (var allowMembers in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Member && x.TargetId == UserId && x.Allow.RawValue != 0)) newPermissions |= allowMembers.Allow.RawValue; - if (((newPermissions >> (PackedChannelPermissions.GlobalBit - 1)) & 1) == 1) - newPermissions = PackedChannelPermissions.Mask; } - if (permissions.RawValue != newPermissions) - { - permissions.SetRawValue(newPermissions); + permissions.SetRawValue(newPermissions); + + if (permissions.General_ManagePermissions) + permissions.SetRawValue(PackedChannelPermissions.All.RawValue); + else if (server.DefaultChannelId == channelId) + permissions.Text_ReadMessages = true; + + if (permissions.RawValue != oldPermissions) channel.InvalidMembersCache(); - } } //TODO: Add GetServerPermissions public PackedChannelPermissions GetPermissions(Channel channel) diff --git a/src/Discord.Net/Models/PackedPermissions.cs b/src/Discord.Net/Models/PackedPermissions.cs index 8f1ea1e96..6bdc0a49f 100644 --- a/src/Discord.Net/Models/PackedPermissions.cs +++ b/src/Discord.Net/Models/PackedPermissions.cs @@ -4,8 +4,15 @@ namespace Discord { public sealed class PackedServerPermissions : PackedPermissions { - internal const int GlobalBit = 4; //ManagePermissions implicitly gives all permissions - public static readonly uint Mask = Convert.ToUInt32("00000011111100111111110000111111", 2); + public static PackedServerPermissions None { get; } + public static PackedServerPermissions All { get; } + static PackedServerPermissions() + { + None = new PackedServerPermissions(); + None.Lock(); + All = new PackedServerPermissions(Convert.ToUInt32("00000011111100111111110000111111", 2)); + All.Lock(); + } public PackedServerPermissions(uint rawValue = 0) : base(rawValue) { } @@ -25,8 +32,15 @@ namespace Discord public sealed class PackedChannelPermissions : PackedPermissions { - internal const int GlobalBit = 4; //ManagePermissions implicitly gives all permissions - public static readonly uint Mask = Convert.ToUInt32("00000011111100111111110000011001", 2); + public static PackedChannelPermissions None { get; } + public static PackedChannelPermissions All { get; } + static PackedChannelPermissions() + { + None = new PackedChannelPermissions(); + None.Lock(); + All = new PackedChannelPermissions(Convert.ToUInt32("00000011111100111111110000011001", 2)); + All.Lock(); + } public PackedChannelPermissions(uint rawValue = 0) : base(rawValue) { }