Added owner/managechannel implicit permission resolving
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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) { }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user