예제 #1
0
        /// <summary>Checks if user has a specified privilege.</summary>
        /// <param name="context">Context of the command execution.</param>
        /// <param name="userID">ID of the user.</param>
        /// <param name="privileges">Required privileges flags.</param>
        /// <param name="cancellationToken">Cancellation token for cancelling the task.</param>
        /// <returns>True if user has at least one of specified privileges; otherwise false.</returns>
        public static async Task <bool> CheckPrivilegeAsync(ICommandContext context, uint userID, WolfGroupCapabilities privileges, CancellationToken cancellationToken = default)
        {
            WolfGroup group = await context.GetRecipientAsync <WolfGroup>(cancellationToken).ConfigureAwait(false);

            if (!group.Members.TryGetValue(userID, out WolfGroupMember member) && group.Members?.Any() != true)
            {
                GroupMembersListResponse membersResponse = await context.Client.SendAsync <GroupMembersListResponse>(
                    new GroupMembersListMessage(group.ID), cancellationToken).ConfigureAwait(false);

                member = membersResponse.GroupMembers.FirstOrDefault(u => u.UserID == userID);
            }
            if (member == null)
            {
                return(false);
            }
            return((privileges & member.Capabilities) == member.Capabilities);
        }
        /// <summary>Checks if group members are downloaded. If not, it'll attempt to repopulate it.</summary>
        /// <param name="client">Client to request group members with.</param>
        /// <param name="group">Group to validate members of.</param>
        /// <param name="cancellationToken">Token to cancel the task.</param>
        /// <returns>True if members list is valid after the operation; otherwise false.</returns>
        public static async Task <bool> RevalidateGroupMembersAsync(this IWolfClient client, WolfGroup group,
                                                                    CancellationToken cancellationToken = default)
        {
            if (group == null)
            {
                throw new ArgumentNullException(nameof(group));
            }
            if (group.Members?.Any() == true)
            {
                return(true);
            }

            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }
            try
            {
                GroupMembersListResponse membersResponse = await client.SendAsync <GroupMembersListResponse>(
                    new GroupMembersListMessage(group.ID), cancellationToken).ConfigureAwait(false);

                // client should be configured to intercept this response
                // however, just in case it's not (like when caching is disabled), do it here as well
                if (membersResponse?.GroupMembers?.Any() == true)
                {
                    try
                    {
                        EntityModificationHelper.ReplaceAllGroupMembers(group, membersResponse.GroupMembers);
                    }
                    catch (NotSupportedException) { return(false); }
                    return(true);
                }
            }
            // handle case when requesting profiles for group the user is not in
            catch (MessageSendingException ex) when(ex.StatusCode == System.Net.HttpStatusCode.Forbidden)
            {
            }
            return(false);
        }