Skip to content

Commit

Permalink
room user roles
Browse files Browse the repository at this point in the history
  • Loading branch information
gehongyan committed Oct 24, 2024
1 parent 79f2e3b commit d0e996a
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 1 deletion.
68 changes: 68 additions & 0 deletions src/HeyBox.Net.Core/Entities/Users/IRoomUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,72 @@ public interface IRoomUser : IUser
/// 获取此用户所属房间的 ID。
/// </summary>
ulong RoomId { get; }

#region Roles

/// <summary>
/// 在该房间内授予此用户指定的角色。
/// </summary>
/// <param name="roleId"> 要在该房间内为此用户授予的角色的 ID。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步授予操作的任务。 </returns>
Task AddRoleAsync(ulong roleId, RequestOptions? options = null);

/// <summary>
/// 在该房间内授予此用户指定的角色。
/// </summary>
/// <param name="role"> 要在该房间内为此用户授予的角色。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步授予操作的任务。 </returns>
Task AddRoleAsync(IRole role, RequestOptions? options = null);

/// <summary>
/// 在该房间内授予此用户指定的一些角色。
/// </summary>
/// <param name="roleIds"> 要在该房间内为此用户授予的所有角色的 ID。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步授予操作的任务。 </returns>
Task AddRolesAsync(IEnumerable<ulong> roleIds, RequestOptions? options = null);

/// <summary>
/// 在该房间内授予此用户指定的一些角色。
/// </summary>
/// <param name="roles"> 要在该房间内为此用户授予的所有角色。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步授予操作的任务。 </returns>
Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions? options = null);

/// <summary>
/// 在该房间内撤销此用户指定的角色。
/// </summary>
/// <param name="roleId"> 要在该房间内为此用户撤销的角色的 ID。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步撤销操作的任务。 </returns>
Task RemoveRoleAsync(ulong roleId, RequestOptions? options = null);

/// <summary>
/// 在该房间内撤销此用户指定的角色。
/// </summary>
/// <param name="role"> 要在该房间内为此用户撤销的角色。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步撤销操作的任务。 </returns>
Task RemoveRoleAsync(IRole role, RequestOptions? options = null);

/// <summary>
/// 在该房间内撤销此用户指定的一些角色。
/// </summary>
/// <param name="roleIds"> 要在该房间内为此用户撤销的所有角色的 ID。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步撤销操作的任务。 </returns>
Task RemoveRolesAsync(IEnumerable<ulong> roleIds, RequestOptions? options = null);

/// <summary>
/// 在该房间内撤销此用户指定的一些角色。
/// </summary>
/// <param name="roles"> 要在该房间内为此用户撤销的所有角色。 </param>
/// <param name="options"> 发送请求时要使用的选项。 </param>
/// <returns> 一个表示异步撤销操作的任务。 </returns>
Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions? options = null);

#endregion
}
44 changes: 43 additions & 1 deletion src/HeyBox.Net.WebSocket/Entitites/Users/SocketRoomUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public override int? Level
/// <summary>
/// 获取此用户在该房间内拥有的所有角色。
/// </summary>
public IReadOnlyCollection<SocketRole> Roles => [..Room.Roles.Where(x => _roleIds.Contains(x.Id))];
public IReadOnlyCollection<SocketRole> Roles => [.._roleIds.Select(x => Room.GetRole(x)).OfType<SocketRole>()];

/// <inheritdoc />
internal SocketRoomUser(SocketRoom room, SocketGlobalUser globalUser)
Expand Down Expand Up @@ -99,6 +99,48 @@ internal override void Update(ClientState state, API.RoomUser model)
_roleIds = [..model.Roles];
}

internal void AddRole(ulong roleId)
{
_roleIds = [.._roleIds, roleId];
}

internal void RemoveRole(ulong roleId)
{
_roleIds = _roleIds.Remove(roleId);
}

/// <inheritdoc />
public Task AddRoleAsync(ulong roleId, RequestOptions? options = null) =>
AddRolesAsync([roleId], options);

/// <inheritdoc />
public Task AddRoleAsync(IRole role, RequestOptions? options = null) =>
AddRoleAsync(role.Id, options);

/// <inheritdoc />
public Task AddRolesAsync(IEnumerable<ulong> roleIds, RequestOptions? options = null) =>
SocketUserHelper.AddRolesAsync(this, Client, roleIds, options);

/// <inheritdoc />
public Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions? options = null) =>
AddRolesAsync(roles.Select(x => x.Id), options);

/// <inheritdoc />
public Task RemoveRoleAsync(ulong roleId, RequestOptions? options = null) =>
RemoveRolesAsync([roleId], options);

/// <inheritdoc />
public Task RemoveRoleAsync(IRole role, RequestOptions? options = null) =>
RemoveRoleAsync(role.Id, options);

/// <inheritdoc />
public Task RemoveRolesAsync(IEnumerable<ulong> roleIds, RequestOptions? options = null) =>
SocketUserHelper.RemoveRolesAsync(this, Client, roleIds, options);

/// <inheritdoc />
public Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions? options = null) =>
RemoveRolesAsync(roles.Select(x => x.Id));

#region IRoomUser

/// <inheritdoc />
Expand Down
42 changes: 42 additions & 0 deletions src/HeyBox.Net.WebSocket/Entitites/Users/SocketUserHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using HeyBox.API.Rest;

namespace HeyBox.WebSocket;

internal static class SocketUserHelper
{
public static async Task AddRolesAsync(SocketRoomUser user, BaseSocketClient client,
IEnumerable<ulong> roleIds, RequestOptions? options)
{
IEnumerable<AddOrRemoveRoleParams> args = roleIds
.Distinct()
.Select(x => new AddOrRemoveRoleParams
{
RoomId = user.Room.Id,
RoleId = x,
UserId = user.Id
});
foreach (AddOrRemoveRoleParams arg in args)
{
await client.ApiClient.AddRoleAsync(arg, options).ConfigureAwait(false);
user.AddRole(arg.RoleId);
}
}

public static async Task RemoveRolesAsync(SocketRoomUser user, BaseSocketClient client,
IEnumerable<ulong> roleIds, RequestOptions? options)
{
IEnumerable<AddOrRemoveRoleParams> args = roleIds
.Distinct()
.Select(x => new AddOrRemoveRoleParams
{
RoomId = user.Room.Id,
RoleId = x,
UserId = user.Id
});
foreach (AddOrRemoveRoleParams arg in args)
{
await client.ApiClient.RemoveRoleAsync(arg, options).ConfigureAwait(false);
user.RemoveRole(arg.RoleId);
}
}
}

0 comments on commit d0e996a

Please sign in to comment.