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,
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

View File

@@ -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)
{

View File

@@ -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) { }