/// <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); }