From 45885363637445e13d050c2ea9b4d425c6528e14 Mon Sep 17 00:00:00 2001 From: youngq Date: Tue, 24 Sep 2024 14:27:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=92=8C=E7=A6=BB=E5=BC=80?= =?UTF-8?q?=E9=A2=91=E9=81=93=E4=BD=BF=E7=94=A8signalr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WGShare.API/AntDeploy.json | 4 +- .../Controllers/Frontend/RoomController.cs | 8 +- WGShare.API/Hubs/SessionManageHub.cs | 95 ++++++++++++++++++- WGShare.API/WGShare.API.xml | 2 +- 4 files changed, 99 insertions(+), 10 deletions(-) diff --git a/WGShare.API/AntDeploy.json b/WGShare.API/AntDeploy.json index 83bbf8a..20d2005 100644 --- a/WGShare.API/AntDeploy.json +++ b/WGShare.API/AntDeploy.json @@ -115,11 +115,11 @@ "DockerConfig": { "Prot": "5192:5192", "AspNetCoreEnv": "", - "LastEnvName": "marking001", + "LastEnvName": "29dev", "RemoveDaysFromPublished": "10", "WorkDir": "", "Volume": "", - "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai", + "Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai", "EnvPairList": [ { "EnvName": "29dev", diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index ba884ec..b936679 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -367,15 +367,16 @@ namespace WGShare.API.Controllers.Frontend } /// - /// 加入频道 + /// 加入频道 /// /// /// /// /// - [HttpGet("join")] + [HttpGet("join"), Obsolete("废弃,请使用Socker接口 JoinChannel")] public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false) { + //throw Oops.("接口已废弃"); //var isRoomManager = await _sqlSugar.Queryable() // .InnerJoin((rm, r) => r.Id == rm.RoomId) // .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId) @@ -433,9 +434,10 @@ namespace WGShare.API.Controllers.Frontend /// /// /// - [HttpGet("leave")] + [HttpGet("leave"), Obsolete("废弃,请使用Socker接口 leavelChannel")] public async Task LevelChannel([FromQuery] string roomNum) { + using (var pipe = RedisHelper.Instance.StartPipe()) { // 判断,如果有全员看ta,则删除 diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index 6d56080..6db8f98 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -4,6 +4,7 @@ using Masuit.Tools.Maths; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; using SqlSugar; +using SqlSugar.Extensions; using System; using System.Globalization; using System.Security.Claims; @@ -29,9 +30,18 @@ namespace WGShare.API.Hubs public async override Task OnConnectedAsync() { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; - var uid = Context.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; + var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value; 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; + + Context.Items.Add("tenant", tenant); + Context.Items.Add("uid", uid); + Context.Items.Add("account", account); + Context.Items.Add("ssid", ssid); + Context.Items.Add("uname", uname); + Context.Items.Add("roleid", roleId); Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account:{account} uid:{uid} connectId:{Context.ConnectionId}"); @@ -104,8 +114,8 @@ namespace WGShare.API.Hubs /// /// 是否关闭麦克风,默认是 /// 是否关闭摄像头,默认是 - [HubMethodName("joinChannel"), Obsolete("废弃,请使用Api接口 JoinChannel")] - public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true) + [HubMethodName("joinChannel")] + public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false) { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value; @@ -118,13 +128,60 @@ namespace WGShare.API.Hubs 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 = false + }; + 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] + + if redis.call('HEXISTS', hashKey, field) == 0 then + redis.call('HSET', hashKey, field, value) + return 1 + else + return 0 + end"; + 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); + } /// /// 离开频道 /// /// - [HubMethodName("levelChannel"), Obsolete("废弃,请使用Api接口 LevelChannel")] + [HubMethodName("levelChannel")] public async Task LevelChannel(string roomNum) { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; @@ -138,6 +195,36 @@ namespace WGShare.API.Hubs Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); Console.WriteLine($" {DateTime.Now}离开频道 account:" + account); Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant); + + using (var pipe = RedisHelper.Instance.StartPipe()) + { + // 判断,如果有全员看ta,则删除 + var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1]) + if value == ARGV[2] or value == ARGV[3] then + return redis.call('HDEL', KEYS[1], ARGV[1]) + else return -1 end"; + // 执行 eval 命令 + pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid); + // 删除频道中得该用户 + pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); + // 删除用户已参与频道 + pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); + var result = pipe.EndPipe(); + if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1) + { + 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) + { + // 通知全员看ta + await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty); + } + } + } + + await Clients.GroupExcept(roomNum, Context.ConnectionId).UserLeave(uid); + await Groups.RemoveFromGroupAsync(Context.ConnectionId, roomNum); + } /// diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index b86f7e0..ea04b0f 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -211,7 +211,7 @@ - 加入频道 + 加入频道 , Obsolete("废弃,请使用Socker接口 JoinChannel")