From 0d51178455ac67604cde5275d9793b4d938000b9 Mon Sep 17 00:00:00 2001 From: youngq Date: Wed, 21 Aug 2024 19:01:56 +0800 Subject: [PATCH] 1 --- .../Controllers/Frontend/RoomController.cs | 55 ++++++++++++++++--- WGShare.API/Hubs/IMessageClient.cs | 12 ++-- WGShare.API/Hubs/SessionManageHub.cs | 5 +- WGShare.API/Program.cs | 2 +- WGShare.API/WGShare.API.xml | 24 ++++++-- WGShare.Domain/Constant/RedisKeyConstant.cs | 15 ++++- 6 files changed, 86 insertions(+), 27 deletions(-) diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 6147726..8ac8d48 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -295,7 +295,7 @@ namespace WGShare.API.Controllers.Frontend _logger.LogInformation($@"开闭麦克分,推送一次,roomNum:{roomNum},enableMicr:{enableMicr},uid:{uid}"); // 通知所有人该用户麦克风状态 - await _hubContext.Clients.Group(roomNum).OperMicr(userInfo); + await _hubContext.Clients.Group(roomNum).OperMicr(userInfo, UId); } /// @@ -316,7 +316,7 @@ namespace WGShare.API.Controllers.Frontend RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo); // 通知所有人该用户摄像头状态 - await _hubContext.Clients.Group(roomNum).OperCamera(userInfo); + await _hubContext.Clients.Group(roomNum).OperCamera(userInfo, UId); } ///// @@ -359,7 +359,7 @@ namespace WGShare.API.Controllers.Frontend /// /// [HttpPost("show-user")] - public async Task SetShowUser([FromQuery] string roomNum, [FromQuery] string? uid) + public async Task SetShowUser([FromQuery] string roomNum, [FromQuery] string uid, [FromQuery] string uname) { // 设置房间全员观看用户 RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, uid); @@ -370,7 +370,7 @@ namespace WGShare.API.Controllers.Frontend // await _hubContext.Clients.GroupExcept(roomNum, connectId).ShowUser(); //} - await _hubContext.Clients.Group(roomNum).ShowUser(); + await _hubContext.Clients.Group(roomNum).ShowUser(uid, uname, UId, UserName); } /// @@ -403,11 +403,11 @@ namespace WGShare.API.Controllers.Frontend }; using (var pipe = RedisHelper.Instance.StartPipe()) { - // 进房第一人,则设置全员看ta - var script = $@"local exists = redis.call('HLEN', KEYS[1]) - if exists == 0 then redis.call('HSET', KEYS[2], ARGV[1], ARGV[2]) end - return exists"; - pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId); + //// 进房第一人,则设置全员看ta + //var script = $@"local exists = redis.call('HLEN', KEYS[1]) + // if exists == 0 then redis.call('HSET', KEYS[2], ARGV[1], ARGV[2]) end + // return exists"; + //pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId)], roomNum, UId); // 记录频道得用户信息 pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId, userInfo); @@ -474,6 +474,43 @@ namespace WGShare.API.Controllers.Frontend await _hubContext.Clients.Group(roomNum).AllLeave(); } + /// + /// 获取监控的轮询用户 + /// + /// + [HttpGet("polling")] + public async Task> GetPollingUser([FromQuery] string roomNum, [FromQuery] int count) + { + // 获取当前房间所有人id + var channelUserInfos = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); + var polledUserIds = RedisHelper.Instance.SMembers(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum)); + + // 排除已轮询的用户 + var userInfos = channelUserInfos.Where(x => !polledUserIds.Contains(x.UID)).Take(count).ToList(); + if (userInfos.Count < count) + { + // 数量不足,则从全部用户中取足 + var takeCount = count - userInfos.Count < 0 ? 0 : count - userInfos.Count; + userInfos.AddRange(channelUserInfos.Take(takeCount)); + // 删除记录,重新记录 + RedisHelper.Instance.Del(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum)); + } + + RedisHelper.Instance.SAdd(RedisKeyConstant.Data.GetPolledUserId(TenantId, roomNum), userInfos.Select(x => x.UID).ToArray()); + return userInfos; + } + + /// + /// 申请发言 + /// + /// + [HttpGet("apply-speak")] + public async Task ApplyToSpeak([FromQuery] string roomNum) + { + + } + + #region 文件分享 /// /// 分享上传文件 diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 0861b74..a512e75 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -14,7 +14,7 @@ namespace WGShare.API.Hubs /// /// /// - Task ReceiveMessage(string uid, string userName, string message); + Task ReceiveMessage(string uid, string userName, string message,long timestamp); /// @@ -56,7 +56,7 @@ namespace WGShare.API.Hubs /// 全员观看 /// /// - Task ShowUser(); + Task ShowUser(string uid, string uname,string operUid, string operUserName); /// /// 用户加入频道回调 @@ -68,7 +68,7 @@ namespace WGShare.API.Hubs /// 用户退出频道回调 /// /// - Task UserLeave(string uid); + Task UserLeave(string uid); /// /// 所有用户退出频道 @@ -82,21 +82,21 @@ namespace WGShare.API.Hubs /// /// 操作人UID /// - Task OperAllMicr(bool enableMicr,string operUid); + Task OperAllMicr(bool enableMicr, string operUid); /// /// 用户关闭开启麦克风 /// /// /// - Task OperMicr(ChannelUserInfo user); + Task OperMicr(ChannelUserInfo user, string operUid); /// /// 用户开启关闭摄像头 /// /// /// - Task OperCamera(ChannelUserInfo user); + Task OperCamera(ChannelUserInfo user,string operUid); /// /// 管理员用户信息刷新 diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index a334766..380c424 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -1,9 +1,11 @@ using Masuit.Tools; +using Masuit.Tools.DateTimeExt; using Masuit.Tools.Maths; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; using SqlSugar; using System; +using System.Globalization; using System.Security.Claims; using System.Text; using WGShare.API.Helpers; @@ -148,8 +150,7 @@ namespace WGShare.API.Hubs Console.WriteLine($" {DateTime.Now}发送消息 roomNum:" + rooNum); Console.WriteLine($" {DateTime.Now}发送消息 msg:" + msg); - await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, uname, msg); - //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); + await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, uname, msg, DateTime.Now.GetTotalMilliseconds()); //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); } /// diff --git a/WGShare.API/Program.cs b/WGShare.API/Program.cs index d99b658..c7507ab 100644 --- a/WGShare.API/Program.cs +++ b/WGShare.API/Program.cs @@ -113,7 +113,7 @@ namespace WGShare.API app.MapHub("/session-manage").RequireCors(q => q.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); app.Run(); - } + } /// /// ǰɾredisе diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index 6fcaf48..6355caf 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -117,7 +117,7 @@ - 查询房间中所有用户信息 + 查询房间中的单个用户信息 @@ -175,7 +175,7 @@ - + 设置全员观看 @@ -204,6 +204,18 @@ + + + 获取监控的轮询用户 + + + + + + 申请发言 + + + 分享上传文件 @@ -362,7 +374,7 @@ 客户端消息 - + 接受频道消息 @@ -405,7 +417,7 @@ - + 全员观看 @@ -437,14 +449,14 @@ 操作人UID - + 用户关闭开启麦克风 - + 用户开启关闭摄像头 diff --git a/WGShare.Domain/Constant/RedisKeyConstant.cs b/WGShare.Domain/Constant/RedisKeyConstant.cs index e226111..7b33549 100644 --- a/WGShare.Domain/Constant/RedisKeyConstant.cs +++ b/WGShare.Domain/Constant/RedisKeyConstant.cs @@ -52,21 +52,30 @@ namespace WGShare.Domain.Constant /// public class Data { + private static string _prefix = "data:"; /// /// 获取token /// /// /// - public static string GetRefreshTokenKey(string refreshToken) => $@"data:refresh_tk:{refreshToken}"; + public static string GetRefreshTokenKey(string refreshToken) => $@"{_prefix}refresh_tk:{refreshToken}"; - public static string GetScreenShareIdKey => $@"data:screen_share_id"; + public static string GetScreenShareIdKey => $@"{_prefix}screen_share_id"; /// /// 获取Accesstoken Redis Key /// /// /// - public static string GetAccessTokenKey(string uid) => $@"data:access_tk:{uid}"; + public static string GetAccessTokenKey(string uid) => $@"{_prefix}access_tk:{uid}"; + + /// + /// 获取已轮询过的用户 + /// + /// + /// + /// + public static string GetPolledUserId(string tenantId, string roomNum) => $@"{_prefix}polled_uid:te_{tenantId}ch_{roomNum}"; }