public static GuildPermissions GetPermissions(this RestMember user, RestGuild guild)
        {
            if (user.Id == guild.OwnerId)
            {
                return(GuildPermissions.All);
            }

            return(GetPermissions(user, guild.Roles));
        }
        /// <summary>
        /// Gets a users max position within a guild
        /// </summary>
        /// <param name="user"></param>
        /// <param name="guild"></param>
        /// <returns></returns>
        public static int GetPosition(this RestMember user, RestGuild guild)
        {
            if (guild == null)
            {
                return(-1);
            }
            if (guild.OwnerId == user.Id)
            {
                return(int.MaxValue);
            }

            return(GetPosition(user, guild.Roles));
        }
        public static GuildPermissions GetPermissions(this RestMember user, IReadOnlyDictionary <Snowflake, RestRole> roles)
        {
            GuildPermissions basePerms = GuildPermissions.None;

            foreach (var role in roles.OrderBy(x => x.Value.Position))
            {
                if (!user.RoleIds.Contains(role.Key))
                {
                    continue;
                }
                basePerms += role.Value.Permissions;
            }
            return(basePerms);
        }
        /// <summary>
        /// Gets a users max position within a list of roles.
        /// </summary>
        /// <param name="user"></param>
        /// <param name="roles"></param>
        /// <returns></returns>
        public static int GetPosition(this RestMember user, IReadOnlyDictionary <Snowflake, RestRole> roles)
        {
            int maxPos = 0;

            foreach (var roleId in user.RoleIds)
            {
                if (roles.TryGetValue(roleId, out var role))
                {
                    if (role.Position > maxPos)
                    {
                        maxPos = role.Position;
                    }
                }
            }
            return(maxPos);
        }
        /// <summary>
        /// Gets a users max position within their guild, fetching the guild
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public static async Task <int> GetPositionAsync(this RestMember user)
        {
            var guild = await user.Guild.FetchAsync();

            return(GetPosition(user, guild));
        }
        public static async Task <GuildPermissions> GetPermissions(this RestMember user)
        {
            var guild = await user.Guild.FetchAsync();

            return(GetPermissions(user, guild));
        }