优化发言人设置

This commit is contained in:
youngq 2025-02-13 16:48:41 +08:00
parent 6106f06f8a
commit 40bf8cc5ba
5 changed files with 80 additions and 23 deletions

View File

@ -63,10 +63,11 @@ namespace WGShare.API.Controllers.Frontend
[HttpPost("manager")] [HttpPost("manager")]
public async Task SetRoomManager([FromBody] RoomManagerInputDTO inputDTO) public async Task SetRoomManager([FromBody] RoomManagerInputDTO inputDTO)
{ {
inputDTO.SettingUserId = UId;
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, inputDTO.RoomNum)); var users = RedisHelper.Instance.HVals<ChannelUserInfo>(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); var user = users.FirstOrDefault(x => x.UID == inputDTO.UserId);
if (user == null) if (user == null)
@ -74,11 +75,13 @@ namespace WGShare.API.Controllers.Frontend
throw Oops.Oh("用户已不在房间内!"); 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);
} }
/// <summary> /// <summary>
@ -636,7 +639,7 @@ namespace WGShare.API.Controllers.Frontend
public async Task<string> GetSharedScreen([FromQuery] string roomNum) public async Task<string> GetSharedScreen([FromQuery] string roomNum)
{ {
var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum); var showUserId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum);
if (showUserId.Length == 9) if (!string.IsNullOrWhiteSpace(showUserId) && showUserId.Length == 9)
{ {
// 全员观看userid =9 表示共享屏幕 // 全员观看userid =9 表示共享屏幕
return showUserId; return showUserId;

View File

@ -1,4 +1,5 @@
using SignalRSwaggerGen.Attributes; using SignalRSwaggerGen.Attributes;
using WGShare.Domain.DTOs.Room;
using WGShare.Domain.DTOs.User; using WGShare.Domain.DTOs.User;
using WGShare.Domain.Entities; using WGShare.Domain.Entities;
@ -165,5 +166,11 @@ namespace WGShare.API.Hubs
/// 加入频道回调 /// 加入频道回调
/// </summary> /// </summary>
Task JoinChannelCallback(bool isSuccess); Task JoinChannelCallback(bool isSuccess);
/// <summary>
/// 发送设置发言人指令
/// </summary>
/// <returns></returns>
Task SetSpeaker(RoomManagerInputDTO inputDTO);
} }
} }

View File

@ -2,6 +2,7 @@
using Masuit.Tools.DateTimeExt; using Masuit.Tools.DateTimeExt;
using Masuit.Tools.Maths; using Masuit.Tools.Maths;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using SqlSugar; using SqlSugar;
using SqlSugar.Extensions; using SqlSugar.Extensions;
@ -9,9 +10,11 @@ using System;
using System.Globalization; using System.Globalization;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security.Claims; using System.Security.Claims;
using System.Security.Cryptography;
using System.Text; using System.Text;
using WGShare.API.Helpers; using WGShare.API.Helpers;
using WGShare.Domain.Constant; using WGShare.Domain.Constant;
using WGShare.Domain.DTOs.Room;
using WGShare.Domain.Entities; using WGShare.Domain.Entities;
using WGShare.Domain.Enums; using WGShare.Domain.Enums;
using WGShare.Domain.FriendlyException; using WGShare.Domain.FriendlyException;
@ -45,7 +48,7 @@ namespace WGShare.API.Hubs
Context.Items.Add("uname", uname); 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}"); _logger.LogInformation($"{DateTime.Now}连接成功 当前租户:{tenant} account{account} uid:{uid} connectId:{Context.ConnectionId}");
//await ClearUserChannel(uid, tenant, account, ssid, false); //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; 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)) 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); 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) 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)); var roomNum = RedisHelper.Instance.Get(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
using (var pipe = RedisHelper.Instance.StartPipe()) 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)) if (!string.IsNullOrEmpty(roomNum))
{ {
// 所有房间移除该用户 // 所有房间移除该用户
@ -107,7 +110,7 @@ namespace WGShare.API.Hubs
// 通知房间其他用户,该用户退出 // 通知房间其他用户,该用户退出
await Clients.Group(roomNum).UserLeave(uid); await Clients.Group(roomNum).UserLeave(uid);
Console.WriteLine($"{DateTime.Now} 执行删除完成"); _logger.LogInformation($"{DateTime.Now} 执行删除完成");
} }
/// <summary> /// <summary>
@ -126,10 +129,10 @@ namespace WGShare.API.Hubs
var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value;
var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value; var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value;
try try
{ {
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum); _logger.LogInformation($"{DateTime.Now}加入频道 会议号:" + roomNum);
Console.WriteLine($"{DateTime.Now}加入频道 account" + account); _logger.LogInformation($"{DateTime.Now}加入频道 account" + account);
Console.WriteLine($"{DateTime.Now}加入频道 tenant" + tenant); _logger.LogInformation($"{DateTime.Now}加入频道 tenant" + tenant);
var userInfo = new ChannelUserInfo var userInfo = new ChannelUserInfo
{ {
@ -185,7 +188,7 @@ namespace WGShare.API.Hubs
await Clients.Caller.JoinChannelCallback(false); await Clients.Caller.JoinChannelCallback(false);
_logger.LogError(ex, $@"加入频道异常,tenant:{tenant},uid:{uid},ssid:{ssid},uname:{uname} {Environment.NewLine}{ex.Message}"); _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} ");
} }
} }
/// <summary> /// <summary>
@ -203,9 +206,9 @@ namespace WGShare.API.Hubs
var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value; var roleId = Context.User?.Claims.FirstOrDefault(x => x.Type == "roleid")?.Value;
Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum); _logger.LogInformation($" {DateTime.Now}离开频道 会议号:" + roomNum);
Console.WriteLine($" {DateTime.Now}离开频道 account" + account); _logger.LogInformation($" {DateTime.Now}离开频道 account" + account);
Console.WriteLine($" {DateTime.Now}离开频道 tenant" + tenant); _logger.LogInformation($" {DateTime.Now}离开频道 tenant" + tenant);
using (var pipe = RedisHelper.Instance.StartPipe()) 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 uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.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;
Console.WriteLine($" {DateTime.Now}发送消息 uname" + uname); _logger.LogInformation($" {DateTime.Now}发送消息 uname" + uname);
Console.WriteLine($" {DateTime.Now}发送消息 roomNum" + rooNum); _logger.LogInformation($" {DateTime.Now}发送消息 roomNum" + rooNum);
Console.WriteLine($" {DateTime.Now}发送消息 msg" + msg); _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); 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); await Clients.User(uid).SaveDriver(driversJsonString);
} }
/// <summary>
/// 发言人设置成功回调
/// </summary>
/// <param name="inputDTO"></param>
/// <returns></returns>
[HubMethodName("setSpeakerCallback")]
public async Task SetSpeakerCallback(RoomManagerInputDTO inputDTO)
{
var tenantId = Context.Items["tenant"].ToString();
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(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);
}
} }
} }

View File

@ -725,6 +725,12 @@
加入频道回调 加入频道回调
</summary> </summary>
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.SetSpeaker(WGShare.Domain.DTOs.Room.RoomManagerInputDTO)">
<summary>
发送设置发言人指令
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean,System.Boolean)"> <member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean,System.Boolean)">
<summary> <summary>
加入频道 加入频道
@ -774,6 +780,13 @@
<param name="driversJsonString"></param> <param name="driversJsonString"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.SessionManageHub.SetSpeakerCallback(WGShare.Domain.DTOs.Room.RoomManagerInputDTO)">
<summary>
发言人设置成功回调
</summary>
<param name="inputDTO"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Program.ResetRedisKey"> <member name="M:WGShare.API.Program.ResetRedisKey">
<summary> <summary>
程序启动前删除redis中得数据 程序启动前删除redis中得数据

View File

@ -12,5 +12,9 @@ namespace WGShare.Domain.DTOs.Room
public string RoomId { get; set; } public string RoomId { get; set; }
public string RoomNum { get; set; } public string RoomNum { get; set; }
public string UserId { get; set; } public string UserId { get; set; }
/// <summary>
/// 设置人Id
/// </summary>
public string SettingUserId { get; set; }
} }
} }