diff --git a/src/Discord.Net/Models/Channel.cs b/src/Discord.Net/Models/Channel.cs index 6c9ee8af3..109758502 100644 --- a/src/Discord.Net/Models/Channel.cs +++ b/src/Discord.Net/Models/Channel.cs @@ -100,8 +100,8 @@ namespace Discord { Type = x.Type, Id = x.Id, - Deny = new PackedChannelPermissions(true, x.Deny), - Allow = new PackedChannelPermissions(true, x.Allow) + Deny = new PackedChannelPermissions(true, x.Deny), + Allow = new PackedChannelPermissions(true, x.Allow) }).ToArray(); } else diff --git a/src/Discord.Net/Models/Member.cs b/src/Discord.Net/Models/Member.cs index ff616a8f1..a030326b3 100644 --- a/src/Discord.Net/Models/Member.cs +++ b/src/Discord.Net/Models/Member.cs @@ -157,23 +157,32 @@ namespace Discord var server = Server; if (server == null) return; var channel = _client.Channels[channelId]; - if (channel == null) return; - var channelOverwrites = channel.PermissionOverwrites; PackedChannelPermissions permissions; if (!_permissions.TryGetValue(channelId, out permissions)) return; uint newPermissions = 0x0; - foreach (var serverRole in Roles) - newPermissions |= serverRole.Permissions.RawValue; - foreach (var denyRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Deny.RawValue != 0 && RoleIds.Contains(x.Id))) - newPermissions &= ~denyRole.Deny.RawValue; - foreach (var allowRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Allow.RawValue != 0 && RoleIds.Contains(x.Id))) - newPermissions |= allowRole.Allow.RawValue; - foreach (var denyMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Deny.RawValue != 0)) - newPermissions &= ~denyMembers.Deny.RawValue; - foreach (var allowMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Allow.RawValue != 0)) - newPermissions |= allowMembers.Allow.RawValue; + if (UserId == server.OwnerId) + newPermissions = PackedChannelPermissions.Mask; + else + { + if (channel == null) return; + var channelOverwrites = channel.PermissionOverwrites; + + foreach (var serverRole in Roles) + newPermissions |= serverRole.Permissions.RawValue; + foreach (var denyRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Deny.RawValue != 0 && RoleIds.Contains(x.Id))) + newPermissions &= ~denyRole.Deny.RawValue; + foreach (var allowRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Allow.RawValue != 0 && RoleIds.Contains(x.Id))) + newPermissions |= allowRole.Allow.RawValue; + foreach (var denyMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Deny.RawValue != 0)) + newPermissions &= ~denyMembers.Deny.RawValue; + foreach (var allowMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Allow.RawValue != 0)) + newPermissions |= allowMembers.Allow.RawValue; + + if (((newPermissions >> (PackedChannelPermissions.GlobalBit - 1)) & 1) == 1) + newPermissions = PackedChannelPermissions.Mask; + } if (permissions.RawValue != newPermissions) { diff --git a/src/Discord.Net/Models/PackedPermissions.cs b/src/Discord.Net/Models/PackedPermissions.cs index 57602806b..13905cb03 100644 --- a/src/Discord.Net/Models/PackedPermissions.cs +++ b/src/Discord.Net/Models/PackedPermissions.cs @@ -4,6 +4,9 @@ namespace Discord { public sealed class PackedServerPermissions : PackedPermissions { + internal const int GlobalBit = 4; //ManagePermissions implicitly gives all permissions + internal static uint Mask = Convert.ToUInt32("00000011111100111111110000111111", 2); + public PackedServerPermissions() : base(false, 0) { } internal PackedServerPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { } @@ -23,6 +26,9 @@ namespace Discord public sealed class PackedChannelPermissions : PackedPermissions { + internal const int GlobalBit = 4; //ManagePermissions implicitly gives all permissions + internal static uint Mask = Convert.ToUInt32("00000011111100111111110000011001", 2); + public PackedChannelPermissions() : base(false, 0) { } internal PackedChannelPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { }