Browse Source

Added owner/managechannel implicit permission resolving

tags/docs-0.9
RogueException 9 years ago
parent
commit
d7da8d6e21
3 changed files with 29 additions and 14 deletions
  1. +2
    -2
      src/Discord.Net/Models/Channel.cs
  2. +21
    -12
      src/Discord.Net/Models/Member.cs
  3. +6
    -0
      src/Discord.Net/Models/PackedPermissions.cs

+ 2
- 2
src/Discord.Net/Models/Channel.cs 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


+ 21
- 12
src/Discord.Net/Models/Member.cs 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)
{


+ 6
- 0
src/Discord.Net/Models/PackedPermissions.cs 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) { }


Loading…
Cancel
Save