Added owner/managechannel implicit permission resolving

This commit is contained in:
RogueException
2015-10-03 19:38:21 -03:00
parent 4a3fe20007
commit d7da8d6e21
3 changed files with 29 additions and 14 deletions

View File

@@ -100,8 +100,8 @@ namespace Discord
{ {
Type = x.Type, Type = x.Type,
Id = x.Id, Id = x.Id,
Deny = new PackedChannelPermissions(true, x.Deny), Deny = new PackedChannelPermissions(true, x.Deny),
Allow = new PackedChannelPermissions(true, x.Allow) Allow = new PackedChannelPermissions(true, x.Allow)
}).ToArray(); }).ToArray();
} }
else else

View File

@@ -157,23 +157,32 @@ namespace Discord
var server = Server; var server = Server;
if (server == null) return; if (server == null) return;
var channel = _client.Channels[channelId]; var channel = _client.Channels[channelId];
if (channel == null) return;
var channelOverwrites = channel.PermissionOverwrites;
PackedChannelPermissions permissions; PackedChannelPermissions permissions;
if (!_permissions.TryGetValue(channelId, out permissions)) return; if (!_permissions.TryGetValue(channelId, out permissions)) return;
uint newPermissions = 0x0; uint newPermissions = 0x0;
foreach (var serverRole in Roles) if (UserId == server.OwnerId)
newPermissions |= serverRole.Permissions.RawValue; newPermissions = PackedChannelPermissions.Mask;
foreach (var denyRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Deny.RawValue != 0 && RoleIds.Contains(x.Id))) else
newPermissions &= ~denyRole.Deny.RawValue; {
foreach (var allowRole in channelOverwrites.Where(x => x.Type == PermissionTarget.Role && x.Allow.RawValue != 0 && RoleIds.Contains(x.Id))) if (channel == null) return;
newPermissions |= allowRole.Allow.RawValue; var channelOverwrites = channel.PermissionOverwrites;
foreach (var denyMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Deny.RawValue != 0))
newPermissions &= ~denyMembers.Deny.RawValue; foreach (var serverRole in Roles)
foreach (var allowMembers in channelOverwrites.Where(x => x.Type == PermissionTarget.Member && x.Id == UserId && x.Allow.RawValue != 0)) newPermissions |= serverRole.Permissions.RawValue;
newPermissions |= allowMembers.Allow.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) if (permissions.RawValue != newPermissions)
{ {

View File

@@ -4,6 +4,9 @@ namespace Discord
{ {
public sealed class PackedServerPermissions : PackedPermissions 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) { } public PackedServerPermissions() : base(false, 0) { }
internal PackedServerPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { } internal PackedServerPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { }
@@ -23,6 +26,9 @@ namespace Discord
public sealed class PackedChannelPermissions : PackedPermissions 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) { } public PackedChannelPermissions() : base(false, 0) { }
internal PackedChannelPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { } internal PackedChannelPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { }