internal void UpdateChannelPermissions(Channel channel) { var server = Server; if (server == null) { return; } if (channel.Server != server) { throw new InvalidOperationException(); } ChannelPermissions permissions; if (!_permissions.TryGetValue(channel.Id, out permissions)) { return; } uint newPermissions = _serverPermissions.RawValue; uint oldPermissions = permissions.RawValue; if (server.Owner == this) { newPermissions = ChannelPermissions.All(channel).RawValue; } else { var channelOverwrites = channel.PermissionOverwrites; //var roles = Roles.OrderBy(x => x.Id); var roles = Roles; foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Deny.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) { newPermissions &= ~denyRole.Deny.RawValue; } foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) { newPermissions |= allowRole.Allow.RawValue; } foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Deny.RawValue != 0)) { newPermissions &= ~denyUser.Deny.RawValue; } foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Allow.RawValue != 0)) { newPermissions |= allowUser.Allow.RawValue; } } var mask = ChannelPermissions.All(channel).RawValue; if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions)) { newPermissions = ChannelPermissions.All(channel).RawValue; } else { newPermissions &= mask; } if (newPermissions != oldPermissions) { permissions.SetRawValueInternal(newPermissions); channel.InvalidateMembersCache(); } permissions.SetRawValueInternal(newPermissions); }
internal void UpdateChannelPermissions(Channel channel) { var server = Server; if (server == null) return; if (channel.Server != server) throw new InvalidOperationException(); ChannelPermissions permissions; if (!_permissions.TryGetValue(channel.Id, out permissions)) return; uint newPermissions = _serverPermissions.RawValue; uint oldPermissions = permissions.RawValue; if (server.Owner == this) newPermissions = ChannelPermissions.All(channel).RawValue; else { var channelOverwrites = channel.PermissionOverwrites; //var roles = Roles.OrderBy(x => x.Id); var roles = Roles; foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Deny.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) newPermissions &= ~denyRole.Deny.RawValue; foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId))) newPermissions |= allowRole.Allow.RawValue; foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Deny.RawValue != 0)) newPermissions &= ~denyUser.Deny.RawValue; foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Allow.RawValue != 0)) newPermissions |= allowUser.Allow.RawValue; } var mask = ChannelPermissions.All(channel).RawValue; if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions)) newPermissions = ChannelPermissions.All(channel).RawValue; else newPermissions &= mask; if (newPermissions != oldPermissions) { permissions.SetRawValueInternal(newPermissions); channel.InvalidateMembersCache(); } permissions.SetRawValueInternal(newPermissions); }