This commit is contained in:
youngq 2025-02-12 10:58:39 +08:00
parent 9a7c0c61d0
commit 6106f06f8a
5 changed files with 145 additions and 45 deletions

View File

@ -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",

View File

@ -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<ChannelUserInfo>(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;
}
/// <summary>
@ -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
}
}
/// <summary>
/// 获取共享屏幕
/// </summary>
/// <returns></returns>
[HttpGet("shared-screen")]
public async Task<string> 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;
}
/// <summary>
/// 设置共享屏幕
/// </summary>
/// <returns></returns>
[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<User>().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
/// <summary>

View File

@ -154,5 +154,16 @@ namespace WGShare.API.Hubs
/// <param name="NickName"></param>
/// <returns></returns>
Task ModifyNickName(long UId, string NickName);
/// <summary>
/// 退出共享屏幕
/// </summary>
/// <returns></returns>
Task ExitSharedScreen();
/// <summary>
/// 加入频道回调
/// </summary>
Task JoinChannelCallback(bool isSuccess);
}
}

View File

@ -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
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
[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} ");
}
}
/// <summary>
/// 离开频道
/// </summary>

View File

@ -286,6 +286,18 @@
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.GetSharedScreen(System.String)">
<summary>
获取共享屏幕
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.SharedScreen(System.String)">
<summary>
设置共享屏幕
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.AddFile(WGShare.Domain.DTOs.File.ShareFileInputDTO)">
<summary>
分享上传文件
@ -702,6 +714,17 @@
<param name="NickName"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.IMessageClient.ExitSharedScreen">
<summary>
退出共享屏幕
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.IMessageClient.JoinChannelCallback(System.Boolean)">
<summary>
加入频道回调
</summary>
</member>
<member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean,System.Boolean)">
<summary>
加入频道