Example #1
0
        internal void UpdateServerPermissions()
        {
            var server = Server;

            if (server == null)
            {
                return;
            }

            uint newPermissions = 0x0;
            uint oldPermissions = _serverPermissions.RawValue;

            if (server.Owner == this)
            {
                newPermissions = ServerPermissions.All.RawValue;
            }
            else
            {
                //var roles = Roles.OrderBy(x => x.Id);
                var roles = Roles;
                foreach (var serverRole in roles)
                {
                    newPermissions |= serverRole.Permissions.RawValue;
                }
            }

            if (BitHelper.GetBit(newPermissions, (int)PermissionsBits.ManageRolesOrPermissions))
            {
                newPermissions = ServerPermissions.All.RawValue;
            }

            if (newPermissions != oldPermissions)
            {
                _serverPermissions.SetRawValueInternal(newPermissions);
                foreach (var channel in _channels)
                {
                    UpdateChannelPermissions(channel.Value);
                }
            }
        }
Example #2
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);
        }
Example #3
0
 internal bool GetBit(PermissionsBits pos) => BitHelper.GetBit(_rawValue, (int)pos);