diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 2c5b25b..d540e62 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -627,7 +627,13 @@ namespace WGShare.API.Controllers.Frontend if (connectionIds.Any()) { - await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, UserName); + var userInfo = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId); + var userName = UserName; + if (userInfo != null) + { + userName = userInfo.UserName; + } + await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, userName); } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index ebf24c6..a2905e0 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -84,10 +84,7 @@ namespace WGShare.API.Hubs { _logger.LogInformation($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}"); if (!string.IsNullOrEmpty(roomNum)) - { - // 所有房间移除该用户 - pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); - + { // 判断是否全员看他,是则移除 var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1]) if value == ARGV[2] or value == ARGV[3] then @@ -95,6 +92,9 @@ namespace WGShare.API.Hubs else return -1 end"; // 执行 eval 命令 pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid); + + // 房间移除该用户 + pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); } // 删除用户在线状态 @@ -103,7 +103,24 @@ namespace WGShare.API.Hubs // 删除用户已加入频道信息 pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); - pipe.EndPipe(); + var result = pipe.EndPipe(); + + if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1) + { + // 如果离开的是全员看ta,则重新设置管理员为全员看ta + var users = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum)); + var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList(); + if (!showUsers.IsNullOrEmpty()) + { + var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true); + if (showUser == null) + { + showUser = showUsers.FirstOrDefault(); + } + // 通知全员看ta + await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty); + } + } } if (!string.IsNullOrEmpty(roomNum)) @@ -226,10 +243,16 @@ namespace WGShare.API.Hubs var result = pipe.EndPipe(); if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1) { + // 如果离开的是全员看ta,则重新设置管理员为全员看ta var users = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum)); - var showUser = users.FirstOrDefault(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()); - if (showUser != null) + var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList(); + if (!showUsers.IsNullOrEmpty()) { + var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true); + if (showUser == null) + { + showUser = showUsers.FirstOrDefault(); + } // 通知全员看ta await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty); } @@ -277,7 +300,7 @@ namespace WGShare.API.Hubs /// [HubMethodName("sendOper2User")] public async Task SendOperationToUser(string uid, string contentString) - { + { await Clients.User(uid).ReceivedOperation(contentString); } diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index a575368..78bf812 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -737,6 +737,13 @@ + + + 客户端接收到消息 + + + + 加入频道 @@ -764,6 +771,14 @@ + + + 发送客户端指令到指定用户 + + + + + 获取设备列表