Ejemplo n.º 1
0
        /*public static ulong ResolveChannel(IGuildUser user, IGuildChannel channel)
         * {
         *  return ResolveChannel(user, channel, ResolveGuild(user));
         * }*/
        public static ulong ResolveChannel(IGuildUser user, IGuildChannel channel, ulong guildPermissions)
        {
            ulong resolvedPermissions = 0;

            ulong mask = ChannelPermissions.All(channel).RawValue;

            if (/*user.Id == user.Guild.OwnerId || */ GetValue(guildPermissions, GuildPermission.Administrator))
            {
                resolvedPermissions = mask; //Owners and administrators always have all permissions
            }
            else
            {
                //Start with this user's guild permissions
                resolvedPermissions = guildPermissions;

                OverwritePermissions?perms;
                var roles = user.Roles;
                if (roles.Count > 0)
                {
                    ulong deniedPermissions = 0UL, allowedPermissions = 0UL;
                    foreach (var role in roles)
                    {
                        perms = channel.GetPermissionOverwrite(role);
                        if (perms != null)
                        {
                            deniedPermissions  |= perms.Value.DenyValue;
                            allowedPermissions |= perms.Value.AllowValue;
                        }
                    }
                    resolvedPermissions = (resolvedPermissions & ~deniedPermissions) | allowedPermissions;
                }
                perms = channel.GetPermissionOverwrite(user);
                if (perms != null)
                {
                    resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue;
                }

                //TODO: C#7 Typeswitch candidate
                var textChannel  = channel as ITextChannel;
                var voiceChannel = channel as IVoiceChannel;
                if (textChannel != null && !GetValue(resolvedPermissions, ChannelPermission.ReadMessages))
                {
                    resolvedPermissions = 0; //No read permission on a text channel removes all other permissions
                }
                else if (voiceChannel != null && !GetValue(resolvedPermissions, ChannelPermission.Connect))
                {
                    resolvedPermissions = 0; //No connect permission on a voice channel removes all other permissions
                }
                resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example)
            }

            return(resolvedPermissions);
        }
Ejemplo n.º 2
0
 public void ChannelTypeResolution_Invalid()
 {
     Assert.Throws <ArgumentException>(() => ChannelPermissions.All(new MockedInvalidChannel()));
 }
Ejemplo n.º 3
0
 public void ChannelTypeResolution_DM()
 {
     Assert.Equal(ChannelPermissions.DM.RawValue, ChannelPermissions.All(new MockedDMChannel()).RawValue);
 }
Ejemplo n.º 4
0
 public void ChannelTypeResolution_Group()
 {
     Assert.Equal(ChannelPermissions.Group.RawValue, ChannelPermissions.All(new MockedGroupChannel()).RawValue);
 }
Ejemplo n.º 5
0
 public void ChannelTypeResolution_Voice()
 {
     Assert.Equal(ChannelPermissions.Voice.RawValue, ChannelPermissions.All(new MockedVoiceChannel()).RawValue);
 }
Ejemplo n.º 6
0
 public void ChannelTypeResolution_Category()
 {
     Assert.Equal(ChannelPermissions.Category.RawValue, ChannelPermissions.All(new MockedCategoryChannel()).RawValue);
 }
Ejemplo n.º 7
0
        /*public static ulong ResolveChannel(IGuildUser user, IGuildChannel channel)
         * {
         *  return ResolveChannel(user, channel, ResolveGuild(user));
         * }*/
        public static ulong ResolveChannel(IGuild guild, IGuildUser user, IGuildChannel channel, ulong guildPermissions)
        {
            ulong mask = ChannelPermissions.All(channel).RawValue;
            ulong resolvedPermissions;

            if (GetValue(guildPermissions, GuildPermission.Administrator)) //Includes owner
            {
                resolvedPermissions = mask;                                //Owners and administrators always have all permissions
            }
            else
            {
                //Start with this user's guild permissions
                resolvedPermissions = guildPermissions;

                //Give/Take Everyone permissions
                var perms = channel.GetPermissionOverwrite(guild.EveryoneRole);
                if (perms != null)
                {
                    resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue;
                }

                //Give/Take Role permissions
                ulong deniedPermissions = 0UL, allowedPermissions = 0UL;
                foreach (var roleId in user.RoleIds)
                {
                    IRole role;
                    if (roleId != guild.EveryoneRole.Id && (role = guild.GetRole(roleId)) != null)
                    {
                        perms = channel.GetPermissionOverwrite(role);
                        if (perms != null)
                        {
                            allowedPermissions |= perms.Value.AllowValue;
                            deniedPermissions  |= perms.Value.DenyValue;
                        }
                    }
                }
                resolvedPermissions = (resolvedPermissions & ~deniedPermissions) | allowedPermissions;

                //Give/Take User permissions
                perms = channel.GetPermissionOverwrite(user);
                if (perms != null)
                {
                    resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue;
                }

                if (channel is ITextChannel)
                {
                    if (!GetValue(resolvedPermissions, ChannelPermission.ViewChannel))
                    {
                        //No read permission on a text channel removes all other permissions
                        resolvedPermissions = 0;
                    }
                    else if (!GetValue(resolvedPermissions, ChannelPermission.SendMessages))
                    {
                        //No send permissions on a text channel removes all send-related permissions
                        resolvedPermissions &= ~(ulong)ChannelPermission.SendTTSMessages;
                        resolvedPermissions &= ~(ulong)ChannelPermission.MentionEveryone;
                        resolvedPermissions &= ~(ulong)ChannelPermission.EmbedLinks;
                        resolvedPermissions &= ~(ulong)ChannelPermission.AttachFiles;
                    }
                }
                resolvedPermissions &= mask; //Ensure we didn't get any permissions this channel doesn't support (from guildPerms, for example)
            }

            return(resolvedPermissions);
        }
Ejemplo n.º 8
0
 public void ChannelTypeResolution_Text()
 {
     Assert.Equal(ChannelPermissions.Text.RawValue, ChannelPermissions.All(new MockedTextChannel()).RawValue);
 }
Ejemplo n.º 9
0
 /// <summary> Gets a OverwritePermissions that denies all permissions for a given channelType. </summary>
 public static OverwritePermissions DenyAll(IChannel channel)
 => new OverwritePermissions(0, ChannelPermissions.All(channel).RawValue);
Ejemplo n.º 10
0
 public static ChannelPermissions ToChannelPerms(IGuildChannel channel, ulong guildPermissions)
 => new ChannelPermissions(guildPermissions & ChannelPermissions.All(channel).RawValue);
Ejemplo n.º 11
0
 /// <summary> Gets a OverwritePermissions that grants all permissions for a given channelType. </summary>
 public static OverwritePermissions AllowAll(IChannel channel)
 => new OverwritePermissions(ChannelPermissions.All(channel).RawValue, 0);
Ejemplo n.º 12
0
        internal bool UpdatePermissions(User user, ref ChannelPermissions permissions)
        {
            uint newPermissions = 0;
            var  server         = Server;

            //Load the mask of all permissions supported by this channel type
            var mask = ChannelPermissions.All(this).RawValue;

            if (server != null)
            {
                //Start with this user's server permissions
                newPermissions = server.GetPermissions(user).RawValue;

                if (IsPrivate || user == Server.Owner || newPermissions.HasBit((byte)PermissionBits.Administrator))
                {
                    newPermissions = mask; //Owners and Administrators always have all permissions
                }
                else
                {
                    var channelOverwrites = PermissionOverwrites;

                    var roles = user.Roles;
                    foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.DenyValue != 0 && roles.Any(y => y.Id == x.TargetId)))
                    {
                        newPermissions &= ~denyRole.Permissions.DenyValue;
                    }
                    foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.AllowValue != 0 && roles.Any(y => y.Id == x.TargetId)))
                    {
                        newPermissions |= allowRole.Permissions.AllowValue;
                    }
                    foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == user.Id && x.Permissions.DenyValue != 0))
                    {
                        newPermissions &= ~denyUser.Permissions.DenyValue;
                    }
                    foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == user.Id && x.Permissions.AllowValue != 0))
                    {
                        newPermissions |= allowUser.Permissions.AllowValue;
                    }

                    if (Type == ChannelType.Text && !newPermissions.HasBit((byte)PermissionBits.ReadMessages))
                    {
                        newPermissions = 0; //No read permission on a text channel removes all other permissions
                    }
                    else if (Type == ChannelType.Voice && !newPermissions.HasBit((byte)PermissionBits.Connect))
                    {
                        newPermissions = 0; //No connect permissions on a voice channel removes all other permissions
                    }
                    else
                    {
                        newPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from serverPerms, for example)
                    }
                }
            }
            else
            {
                newPermissions = mask; //Private messages always have all permissions
            }
            if (newPermissions != permissions.RawValue)
            {
                permissions = new ChannelPermissions(newPermissions);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 13
0
        public bool ResolvePermissions(User user, ref ChannelPermissions permissions)
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            uint newPermissions = 0;
            var  server         = user.Server;

            var mask = ChannelPermissions.All(_channel.Type).RawValue;

            if (_channel.IsPrivate || user.IsOwner)
            {
                newPermissions = mask; //Private messages and owners always have all permissions
            }
            else
            {
                //Start with this user's server permissions
                newPermissions = server.GetPermissions(user).RawValue;
                var rules = _rules;

                Channel.PermissionRule rule;
                var roles = user.Roles.ToArray();
                if (roles.Length > 0)
                {
                    for (int i = 0; i < roles.Length; i++)
                    {
                        if (rules.TryGetValue(roles[i].Id, out rule))
                        {
                            newPermissions &= ~rule.Permissions.DenyValue;
                        }
                    }
                    for (int i = 0; i < roles.Length; i++)
                    {
                        if (rules.TryGetValue(roles[i].Id, out rule))
                        {
                            newPermissions |= rule.Permissions.AllowValue;
                        }
                    }
                }
                if (rules.TryGetValue(user.Id, out rule))
                {
                    newPermissions = (newPermissions & ~rule.Permissions.DenyValue) | rule.Permissions.AllowValue;
                }

                if (newPermissions.HasBit((byte)PermissionBits.ManageRolesOrPermissions))
                {
                    newPermissions = mask; //ManageRolesOrPermissions gives all permisions
                }
                else if (_channel.IsText && !newPermissions.HasBit((byte)PermissionBits.ReadMessages))
                {
                    newPermissions = 0; //No read permission on a text channel removes all other permissions
                }
                else if (_channel.IsVoice && !newPermissions.HasBit((byte)PermissionBits.Connect))
                {
                    newPermissions = 0; //No connect permissions on a voice channel removes all other permissions
                }
                else
                {
                    newPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from serverPerms, for example)
                }
            }

            if (newPermissions != permissions.RawValue)
            {
                permissions = new ChannelPermissions(newPermissions);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 14
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);
        }
Ejemplo n.º 15
0
        internal void UpdatePermissions(User user, ChannelPermissions permissions)
        {
            uint newPermissions = 0;
            var  server         = Server;

            //Load the mask of all permissions supported by this channel type
            var mask = ChannelPermissions.All(this).RawValue;

            if (server != null)
            {
                //Start with this user's server permissions
                newPermissions = server.GetPermissions(user).RawValue;

                if (IsPrivate || user == Server.Owner)
                {
                    newPermissions = mask; //Owners always have all permissions
                }
                else
                {
                    var channelOverwrites = PermissionOverwrites;

                    var roles = user.Roles;
                    foreach (var denyRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.Deny.RawValue != 0 && roles.Any(y => y.Id == x.TargetId)))
                    {
                        newPermissions &= ~denyRole.Permissions.Deny.RawValue;
                    }
                    foreach (var allowRole in channelOverwrites.Where(x => x.TargetType == PermissionTarget.Role && x.Permissions.Allow.RawValue != 0 && roles.Any(y => y.Id == x.TargetId)))
                    {
                        newPermissions |= allowRole.Permissions.Allow.RawValue;
                    }
                    foreach (var denyUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Permissions.Deny.RawValue != 0))
                    {
                        newPermissions &= ~denyUser.Permissions.Deny.RawValue;
                    }
                    foreach (var allowUser in channelOverwrites.Where(x => x.TargetType == PermissionTarget.User && x.TargetId == Id && x.Permissions.Allow.RawValue != 0))
                    {
                        newPermissions |= allowUser.Permissions.Allow.RawValue;
                    }

                    if (newPermissions.HasBit((byte)PermissionsBits.ManageRolesOrPermissions))
                    {
                        newPermissions = mask; //ManageRolesOrPermissions gives all permisions
                    }
                    else if (Type == ChannelType.Text && !newPermissions.HasBit((byte)PermissionsBits.ReadMessages))
                    {
                        newPermissions = 0; //No read permission on a text channel removes all other permissions
                    }
                    else
                    {
                        newPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from serverPerms, for example)
                    }
                }
            }
            else
            {
                newPermissions = mask; //Private messages always have all permissions
            }
            if (newPermissions != permissions.RawValue)
            {
                permissions.SetRawValueInternal(newPermissions);
            }
        }