diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 6eb98cd..2c5b25b 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -63,10 +63,11 @@ namespace WGShare.API.Controllers.Frontend [HttpPost("manager")] public async Task SetRoomManager([FromBody] RoomManagerInputDTO inputDTO) { + inputDTO.SettingUserId = UId; var users = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum)); - if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 32) + if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 20) { - throw Oops.Oh("房间已达到32个发言人限制。请移除一位发言人"); + throw Oops.Oh("当前房间已达最大发言人数!"); } var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId); if (user == null) @@ -74,11 +75,13 @@ namespace WGShare.API.Controllers.Frontend throw Oops.Oh("用户已不在房间内!"); } - user.IsRoomManager = true; + await _hubContext.Clients.User(inputDTO.UserId).SetSpeaker(inputDTO); - RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user); + //user.IsRoomManager = true; - await _hubContext.Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, UId); + //RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum), inputDTO.UserId, user); + + //await _hubContext.Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, UId); } /// @@ -636,7 +639,7 @@ namespace WGShare.API.Controllers.Frontend public async Task GetSharedScreen([FromQuery] string roomNum) { var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum); - if (showUserId.Length == 9) + if (!string.IsNullOrWhiteSpace(showUserId) && showUserId.Length == 9) { // 全员观看userid =9 表示共享屏幕 return showUserId; diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 2deb70d..3e5118c 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -1,4 +1,5 @@ using SignalRSwaggerGen.Attributes; +using WGShare.Domain.DTOs.Room; using WGShare.Domain.DTOs.User; using WGShare.Domain.Entities; @@ -165,5 +166,11 @@ namespace WGShare.API.Hubs /// 加入频道回调 /// Task JoinChannelCallback(bool isSuccess); + + /// + /// 发送设置发言人指令 + /// + /// + Task SetSpeaker(RoomManagerInputDTO inputDTO); } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index e93d8fe..39ed73a 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -2,6 +2,7 @@ using Masuit.Tools.DateTimeExt; using Masuit.Tools.Maths; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.SignalR; using SqlSugar; using SqlSugar.Extensions; @@ -9,9 +10,11 @@ using System; using System.Globalization; using System.Runtime.InteropServices; using System.Security.Claims; +using System.Security.Cryptography; using System.Text; using WGShare.API.Helpers; using WGShare.Domain.Constant; +using WGShare.Domain.DTOs.Room; using WGShare.Domain.Entities; using WGShare.Domain.Enums; using WGShare.Domain.FriendlyException; @@ -45,7 +48,7 @@ namespace WGShare.API.Hubs Context.Items.Add("uname", uname); Context.Items.Add("roleid", roleId); - Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}"); + _logger.LogInformation($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}"); //await ClearUserChannel(uid, tenant, account, ssid, false); // 存储在线信息 @@ -60,11 +63,11 @@ namespace WGShare.API.Hubs var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; - Console.WriteLine($"{DateTime.Now}断开连接 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId} exception:{exception?.Message} "); + _logger.LogInformation($"{DateTime.Now}断开连接 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId} exception:{exception?.Message} "); if (Context.ConnectionId == RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), uid)) { - Console.WriteLine($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息"); + _logger.LogInformation($"{DateTime.Now}断开连接 未重连,开始删除用户频道信息"); // 断开后未重连则清退频道 await ClearUserChannel(uid, tenant, account, ssid, true); @@ -74,12 +77,12 @@ namespace WGShare.API.Hubs private async Task ClearUserChannel(string uid, string tenant, string account, string ssid, bool isclose) { - Console.WriteLine($"{DateTime.Now} 执行删除开始"); + _logger.LogInformation($"{DateTime.Now} 执行删除开始"); // 获取用户参加得频道 var roomNum = RedisHelper.Instance.Get(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); using (var pipe = RedisHelper.Instance.StartPipe()) { - Console.WriteLine($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}"); + _logger.LogInformation($@"{DateTime.Now} account:{account} 退出以下频道:{string.Join(',', roomNum)}"); if (!string.IsNullOrEmpty(roomNum)) { // 所有房间移除该用户 @@ -107,7 +110,7 @@ namespace WGShare.API.Hubs // 通知房间其他用户,该用户退出 await Clients.Group(roomNum).UserLeave(uid); - Console.WriteLine($"{DateTime.Now} 执行删除完成"); + _logger.LogInformation($"{DateTime.Now} 执行删除完成"); } /// @@ -126,10 +129,10 @@ namespace WGShare.API.Hubs var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value; try - { - Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); - Console.WriteLine($"{DateTime.Now}加入频道 account:" + account); - Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant); + { + _logger.LogInformation($"{DateTime.Now}加入频道 会议号:" + roomNum); + _logger.LogInformation($"{DateTime.Now}加入频道 account:" + account); + _logger.LogInformation($"{DateTime.Now}加入频道 tenant:" + tenant); var userInfo = new ChannelUserInfo { @@ -185,7 +188,7 @@ namespace WGShare.API.Hubs await Clients.Caller.JoinChannelCallback(false); _logger.LogError(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} {Environment.NewLine}{ex.Message}"); - await ExceptionNotice.SendAsync(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} "); + await ExceptionNotice.SendAsync(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} "); } } /// @@ -203,9 +206,9 @@ namespace WGShare.API.Hubs var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value; - Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); - Console.WriteLine($" {DateTime.Now}离开频道 account:" + account); - Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant); + _logger.LogInformation($" {DateTime.Now}离开频道 会议号:" + roomNum); + _logger.LogInformation($" {DateTime.Now}离开频道 account:" + account); + _logger.LogInformation($" {DateTime.Now}离开频道 tenant:" + tenant); using (var pipe = RedisHelper.Instance.StartPipe()) { @@ -249,9 +252,9 @@ namespace WGShare.API.Hubs var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; - Console.WriteLine($" {DateTime.Now}发送消息 uname:" + uname); - Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum); - Console.WriteLine($" {DateTime.Now}发送消息 msg:" + msg); + _logger.LogInformation($" {DateTime.Now}发送消息 uname:" + uname); + _logger.LogInformation($" {DateTime.Now}发送消息 roomNum:" + rooNum); + _logger.LogInformation($" {DateTime.Now}发送消息 msg:" + msg); await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, uname, msg, DateTime.Now.GetTotalMilliseconds()); //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); } @@ -301,5 +304,32 @@ namespace WGShare.API.Hubs { await Clients.User(uid).SaveDriver(driversJsonString); } + + + /// + /// 发言人设置成功回调 + /// + /// + /// + [HubMethodName("setSpeakerCallback")] + public async Task SetSpeakerCallback(RoomManagerInputDTO inputDTO) + { + var tenantId = Context.Items["tenant"].ToString(); + + var users = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(tenantId, inputDTO.RoomNum)); + //if (users.Count(x => x.IsRoomManager || x.RoleId == ((int)RoleEnums.Admin).ToString() || x.RoleId == ((int)RoleEnums.RoomManager).ToString()) >= 20) + //{ + // throw Oops.Oh("房间已达到20个发言人限制。请移除一位发言人"); + //} + var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId); + if (user == null) + { + throw Oops.Oh("用户已不在房间内!"); + } + user.IsRoomManager = true; + RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenantId, inputDTO.RoomNum), inputDTO.UserId, user); + + await Clients.Group(inputDTO.RoomNum).ManagerRefresh(user, inputDTO.SettingUserId); + } } } diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index 58f777b..bfe4dfb 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -725,6 +725,12 @@ 加入频道回调 + + + 发送设置发言人指令 + + + 加入频道 @@ -774,6 +780,13 @@ + + + 发言人设置成功回调 + + + + 程序启动前,删除redis中得数据 diff --git a/WGShare.Domain/DTOs/Room/RoomManagerInputDTO.cs b/WGShare.Domain/DTOs/Room/RoomManagerInputDTO.cs index 07472ca..3236fea 100644 --- a/WGShare.Domain/DTOs/Room/RoomManagerInputDTO.cs +++ b/WGShare.Domain/DTOs/Room/RoomManagerInputDTO.cs @@ -12,5 +12,9 @@ namespace WGShare.Domain.DTOs.Room public string RoomId { get; set; } public string RoomNum { get; set; } public string UserId { get; set; } + /// + /// 设置人Id + /// + public string SettingUserId { get; set; } } }