コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: User.cs プロジェクト: hermanocabral/Discord.Net
		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);
		}