This commit is contained in:
parent
9a7c0c61d0
commit
6106f06f8a
|
|
@ -24,7 +24,7 @@
|
||||||
"LinuxServerList": [
|
"LinuxServerList": [
|
||||||
{
|
{
|
||||||
"UserName": "marking",
|
"UserName": "marking",
|
||||||
"Pwd": "0610DBF49053E6779393A74BE1ED4FD2",
|
"Pwd": "CE09921E2AD09E56095579DF1F7C614B",
|
||||||
"Host": "47.109.67.254:10022",
|
"Host": "47.109.67.254:10022",
|
||||||
"NickName": "marking001",
|
"NickName": "marking001",
|
||||||
"IIsFireUrl": null,
|
"IIsFireUrl": null,
|
||||||
|
|
@ -115,11 +115,11 @@
|
||||||
"DockerConfig": {
|
"DockerConfig": {
|
||||||
"Prot": "5192:5192",
|
"Prot": "5192:5192",
|
||||||
"AspNetCoreEnv": "",
|
"AspNetCoreEnv": "",
|
||||||
"LastEnvName": "29dev",
|
"LastEnvName": "marking001",
|
||||||
"RemoveDaysFromPublished": "10",
|
"RemoveDaysFromPublished": "10",
|
||||||
"WorkDir": "",
|
"WorkDir": "",
|
||||||
"Volume": "",
|
"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": [
|
"EnvPairList": [
|
||||||
{
|
{
|
||||||
"EnvName": "29dev",
|
"EnvName": "29dev",
|
||||||
|
|
|
||||||
|
|
@ -380,13 +380,25 @@ namespace WGShare.API.Controllers.Frontend
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取全部用户
|
// 获取全部用户
|
||||||
var uids = RedisHelper.Instance.HKeys(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
|
var userInfos = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum));
|
||||||
if (uids.IsNullOrEmpty())
|
if (userInfos.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
throw Oops.Oh("无效会议号!");
|
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>
|
/// <summary>
|
||||||
|
|
@ -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 文件分享
|
#region 文件分享
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -154,5 +154,16 @@ namespace WGShare.API.Hubs
|
||||||
/// <param name="NickName"></param>
|
/// <param name="NickName"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task ModifyNickName(long UId, string NickName);
|
Task ModifyNickName(long UId, string NickName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退出共享屏幕
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task ExitSharedScreen();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加入频道回调
|
||||||
|
/// </summary>
|
||||||
|
Task JoinChannelCallback(bool isSuccess);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,14 @@ using SqlSugar;
|
||||||
using SqlSugar.Extensions;
|
using SqlSugar.Extensions;
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
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.Entities;
|
using WGShare.Domain.Entities;
|
||||||
using WGShare.Domain.Enums;
|
using WGShare.Domain.Enums;
|
||||||
|
using WGShare.Domain.FriendlyException;
|
||||||
using ZstdSharp.Unsafe;
|
using ZstdSharp.Unsafe;
|
||||||
|
|
||||||
namespace WGShare.API.Hubs
|
namespace WGShare.API.Hubs
|
||||||
|
|
@ -115,7 +117,7 @@ namespace WGShare.API.Hubs
|
||||||
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
|
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
|
||||||
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
|
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
|
||||||
[HubMethodName("joinChannel")]
|
[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 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;
|
||||||
|
|
@ -123,32 +125,32 @@ 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;
|
||||||
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
|
||||||
|
|
||||||
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())
|
|
||||||
{
|
{
|
||||||
|
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
|
||||||
|
Console.WriteLine($"{DateTime.Now}加入频道 account:" + account);
|
||||||
|
Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant);
|
||||||
|
|
||||||
if (((RoleEnums)roleId.ToInt32()) == RoleEnums.Admin || ((RoleEnums)roleId.ToInt32()) == RoleEnums.RoomManager)
|
var userInfo = new ChannelUserInfo
|
||||||
{
|
{
|
||||||
// 管理员进房,如果没有全员看ta,则设置
|
UID = uid,
|
||||||
var script = @"local hashKey = KEYS[1]
|
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 field = ARGV[1]
|
||||||
local value = ARGV[2]
|
local value = ARGV[2]
|
||||||
|
|
||||||
|
|
@ -158,25 +160,34 @@ namespace WGShare.API.Hubs
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
end";
|
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);
|
||||||
|
|
||||||
// 记录频道得用户信息
|
await Clients.Caller.JoinChannelCallback(true);
|
||||||
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);
|
catch (Exception ex)
|
||||||
await Clients.GroupExcept(roomNum, Context.ConnectionId).UserJoined(userInfo);
|
{
|
||||||
|
|
||||||
|
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>
|
||||||
/// 离开频道
|
/// 离开频道
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -286,6 +286,18 @@
|
||||||
</summary>
|
</summary>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:WGShare.API.Controllers.Frontend.RoomController.AddFile(WGShare.Domain.DTOs.File.ShareFileInputDTO)">
|
||||||
<summary>
|
<summary>
|
||||||
分享上传文件
|
分享上传文件
|
||||||
|
|
@ -702,6 +714,17 @@
|
||||||
<param name="NickName"></param>
|
<param name="NickName"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</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)">
|
<member name="M:WGShare.API.Hubs.SessionManageHub.JoinChannel(System.String,System.Boolean,System.Boolean,System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
加入频道
|
加入频道
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue