diff --git a/WGShare.API/AntDeploy.json b/WGShare.API/AntDeploy.json index 20d2005..e977165 100644 --- a/WGShare.API/AntDeploy.json +++ b/WGShare.API/AntDeploy.json @@ -24,7 +24,7 @@ "LinuxServerList": [ { "UserName": "marking", - "Pwd": "0610DBF49053E6779393A74BE1ED4FD2", + "Pwd": "CE09921E2AD09E56095579DF1F7C614B", "Host": "47.109.67.254:10022", "NickName": "marking001", "IIsFireUrl": null, @@ -115,11 +115,11 @@ "DockerConfig": { "Prot": "5192:5192", "AspNetCoreEnv": "", - "LastEnvName": "29dev", + "LastEnvName": "marking001", "RemoveDaysFromPublished": "10", "WorkDir": "", "Volume": "", - "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai", + "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai", "EnvPairList": [ { "EnvName": "29dev", diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 6d9fdba..6eb98cd 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -380,13 +380,25 @@ namespace WGShare.API.Controllers.Frontend } // 获取全部用户 - var uids = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); - if (uids.IsNullOrEmpty()) + var userInfos = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); + if (userInfos.IsNullOrEmpty()) { throw Oops.Oh("无效会议号!"); } - return uids.FirstOrDefault(); + var managers = userInfos.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()); + if (managers.IsNullOrEmpty()) + { + return userInfos.FirstOrDefault().UID; + } + + var user = managers.FirstOrDefault(x => x.EnableCamera = true); + if (user == null) + { + return managers.FirstOrDefault().UID; + } + + return user.UID; } /// @@ -396,7 +408,7 @@ namespace WGShare.API.Controllers.Frontend [HttpPost("show-user")] public async Task SetShowUser([FromQuery] string roomNum, [FromQuery] string uid, [FromQuery] string uname) { - + if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) == uid) { // 如果已经是全员观看他了,则不做处理 @@ -616,6 +628,49 @@ namespace WGShare.API.Controllers.Frontend } } + /// + /// 获取共享屏幕 + /// + /// + [HttpGet("shared-screen")] + public async Task GetSharedScreen([FromQuery] string roomNum) + { + var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum); + if (showUserId.Length == 9) + { + // 全员观看userid =9 表示共享屏幕 + return showUserId; + } + return string.Empty; + } + + /// + /// 设置共享屏幕 + /// + /// + [HttpPost("shared-screen")] + public async Task SharedScreen([FromQuery] string roomNum) + { + //var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum); + //if (showUserId.Length == 9) + //{ + // var user = await _sqlSugar.Queryable().FirstAsync(x => x.ScreenShareId == showUserId); + // if (user != null) + // { + // // + // await _hubContext.Clients.User(user.Id).ExitSharedScreen(); + // } + //} + + var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), UId); + // 通知其他所有共享屏幕用户退出 + await _hubContext.Clients.GroupExcept(roomNum, connectId).ExitSharedScreen(); + + // 设置新的共享屏幕 + RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, ScreenShareId); + // 通知全员观看新的共享屏幕 + await _hubContext.Clients.Group(roomNum).ShowUser(UId, UserName, string.Empty, string.Empty); + } #region 文件分享 /// diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 506bb40..2deb70d 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -154,5 +154,16 @@ namespace WGShare.API.Hubs /// /// Task ModifyNickName(long UId, string NickName); + + /// + /// 退出共享屏幕 + /// + /// + Task ExitSharedScreen(); + + /// + /// 加入频道回调 + /// + Task JoinChannelCallback(bool isSuccess); } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index 90d1b49..e93d8fe 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -7,12 +7,14 @@ using SqlSugar; using SqlSugar.Extensions; using System; using System.Globalization; +using System.Runtime.InteropServices; using System.Security.Claims; using System.Text; using WGShare.API.Helpers; using WGShare.Domain.Constant; using WGShare.Domain.Entities; using WGShare.Domain.Enums; +using WGShare.Domain.FriendlyException; using ZstdSharp.Unsafe; namespace WGShare.API.Hubs @@ -41,7 +43,7 @@ namespace WGShare.API.Hubs Context.Items.Add("account", account); Context.Items.Add("ssid", ssid); Context.Items.Add("uname", uname); - Context.Items.Add("roleid", roleId); + Context.Items.Add("roleid", roleId); Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}"); @@ -115,7 +117,7 @@ namespace WGShare.API.Hubs /// 是否关闭麦克风,默认是 /// 是否关闭摄像头,默认是 [HubMethodName("joinChannel")] - public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false,bool isRoomManager = false) + public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false, bool isRoomManager = false) { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; @@ -123,32 +125,32 @@ namespace WGShare.API.Hubs var ssid = Context.User?.Claims.FirstOrDefault(x => x.Type == "ssid")?.Value; 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); - - Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); - Console.WriteLine($"{DateTime.Now}加入频道 account:" + account); - Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant); - - var userInfo = new ChannelUserInfo - { - UID = uid, - UserName = uname, - EnableCamera = enableCamera, - EnableMicr = enableMicr, - ConnectId = Context.ConnectionId, - Account = account, - ScreenShareId = ssid, - RoleId = roleId, - RoleName = ((RoleEnums)roleId.ToInt32()).GetDescription(), - IsRoomManager = isRoomManager - }; - using (var pipe = RedisHelper.Instance.StartPipe()) - { - - if (((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) + var userInfo = new ChannelUserInfo { - // 管理员进房,如果没有全员看ta,则设置 - var script = @"local hashKey = KEYS[1] + UID = uid, + UserName = uname, + EnableCamera = enableCamera, + EnableMicr = enableMicr, + ConnectId = Context.ConnectionId, + Account = account, + ScreenShareId = ssid, + RoleId = roleId, + RoleName = ((RoleEnums)roleId.ToInt32()).GetDescription(), + IsRoomManager = isRoomManager + }; + using (var pipe = RedisHelper.Instance.StartPipe()) + { + + if (((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) + { + // 管理员进房,如果没有全员看ta,则设置 + var script = @"local hashKey = KEYS[1] local field = ARGV[1] local value = ARGV[2] @@ -158,25 +160,34 @@ namespace WGShare.API.Hubs else return 0 end"; - pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid); + pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid); + } + + // 记录频道得用户信息 + pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo); + // 记录用户已参与频道 + pipe.Set(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum); + var results = pipe.EndPipe(); + + // 判断,如果有全员看ta,则通知 + if ((((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) && !results.IsNullOrEmpty() && results[0].ObjToInt() == 1) + await Clients.Group(roomNum).ShowUser(uid, uname, string.Empty, string.Empty); } + await Groups.AddToGroupAsync(Context.ConnectionId, roomNum); + await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(userInfo); - // 记录频道得用户信息 - pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo); - // 记录用户已参与频道 - pipe.Set(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum); - var results = pipe.EndPipe(); + await Clients.Caller.JoinChannelCallback(true); - // 判断,如果有全员看ta,则通知 - if ((((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager) && !results.IsNullOrEmpty() && results[0].ObjToInt() == 1) - await Clients.Group(roomNum).ShowUser(uid, uname, string.Empty, string.Empty); } - await Groups.AddToGroupAsync(Context.ConnectionId, roomNum); - await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(userInfo); + catch (Exception ex) + { + 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} "); + } } - /// /// 离开频道 /// diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index 797888f..58f777b 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -286,6 +286,18 @@ + + + 获取共享屏幕 + + + + + + 设置共享屏幕 + + + 分享上传文件 @@ -702,6 +714,17 @@ + + + 退出共享屏幕 + + + + + + 加入频道回调 + + 加入频道