Compare commits

..

10 Commits

Author SHA1 Message Date
youngq c65e6673e0 修改配置文件 2025-03-26 09:54:43 +08:00
youngq d66fec6b66 1 2025-03-25 17:45:56 +08:00
youngq 7c31c67f9d 删除部分无用注释 2025-02-27 16:31:07 +08:00
youngq c33c06176b 1.修改客户端发送指令函数
2.全员观看重复调用,只通知,不写入redis
2025-02-26 14:48:00 +08:00
youngq 505dd42294 新增共享人取消共享屏幕 2025-02-25 16:42:20 +08:00
youngq 7a75025880 1:新增用户在线监测接口i
2.修复用户修改名称后,聊天任然使用旧名称BUG
2025-02-25 15:41:22 +08:00
youngq 484ab104ab 修复bug #172 更改名字申请发言没变bug
修复断开连接后,删除全员看ta并重新设置观看人
2025-02-21 17:21:33 +08:00
youngq 806d585717 1 2025-02-19 11:20:21 +08:00
youngq ebfd8b9fb7 优化有人入会通知内容
新增记录用户版本接口
2025-02-17 18:20:06 +08:00
youngq 40bf8cc5ba 优化发言人设置 2025-02-13 16:48:41 +08:00
15 changed files with 364 additions and 46 deletions

View File

@ -31,6 +31,16 @@
"DockerFireUrl": "", "DockerFireUrl": "",
"WindowsServiceFireUrl": null, "WindowsServiceFireUrl": null,
"LinuxServiceFireUrl": null "LinuxServiceFireUrl": null
},
{
"UserName": "marking",
"Pwd": "CE09921E2AD09E56095579DF1F7C614B",
"Host": "47.109.193.53:10022",
"NickName": "meeting",
"IIsFireUrl": null,
"DockerFireUrl": "",
"WindowsServiceFireUrl": null,
"LinuxServiceFireUrl": null
} }
], ],
"IgnoreList": [], "IgnoreList": [],

View File

@ -51,6 +51,27 @@ namespace WGShare.API.Controllers
return await _sqlSugar.Queryable<User>().AnyAsync(x => x.IsDelete == false && x.Account == account && x.IsAnonymous == false); return await _sqlSugar.Queryable<User>().AnyAsync(x => x.IsDelete == false && x.Account == account && x.IsAnonymous == false);
} }
/// <summary>
/// 检查用户是否在线
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpGet("check-online"), AllowAnonymous]
public async Task<bool> CheckUserOnline([FromQuery] string account)
{
var user = await _sqlSugar.Queryable<User>().FirstAsync(x => x.IsDelete == false && x.Account == account && x.IsAnonymous == false);
if (user == null)
{
return false;
}
var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(user.TenantId), user.Id);
if (!string.IsNullOrWhiteSpace(connectId))
{
return true;
}
return false;
}
/// <summary> /// <summary>
/// 正常账号登录 /// 正常账号登录
/// </summary> /// </summary>

View File

@ -165,9 +165,18 @@ namespace WGShare.API.Controllers.Frontend
return; return;
} }
if(existsChannel.TryAdd(eventBody.payload.channelName, 0)) if (existsChannel.TryAdd(eventBody.payload.channelName, 0))
{ {
ExceptionNotice.JoinAsync(eventBody); var roomInfo = await _sqlSugarClient.Queryable<Room>()
.LeftJoin<Tenant>((r, t) => r.TenantId == t.Id)
.Where((r, t) => r.RoomNum == eventBody.payload.channelName)
.Select((r, t) => new Room
{
Id = r.Id.SelectAll(),
TenantName = t.TenantName
})
.FirstAsync();
ExceptionNotice.JoinAsync(eventBody, roomInfo);
} }
} }

View File

@ -371,5 +371,17 @@ namespace WGShare.API.Controllers.Frontend
await _sqlSugar.Insertable(entity).ExecuteCommandAsync(); await _sqlSugar.Insertable(entity).ExecuteCommandAsync();
} }
/// <summary>
/// 记录用户当前用户版本
/// </summary>
/// <returns></returns>
[HttpPost("ver-log")]
public async Task RecordVersionLog([FromBody] UserVersionLogDto userVersionLog)
{
var uvl = userVersionLog.Adapt<UserVersionLog>();
uvl.UserId = UId.ToInt64();
await _sqlSugar.Insertable(uvl).ExecuteCommandAsync();
}
} }
} }

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>
@ -339,7 +342,7 @@ namespace WGShare.API.Controllers.Frontend
userInfo.EnableMicr = enableMicr; userInfo.EnableMicr = enableMicr;
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo); RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo);
_logger.LogInformation($@"开闭麦克分,推送一次,roomNum:{roomNum},enableMicr:{enableMicr},uid:{uid}"); //_logger.LogInformation($@"开闭麦克分,推送一次,roomNum:{roomNum},enableMicr:{enableMicr},uid:{uid}");
// 通知所有人该用户麦克风状态 // 通知所有人该用户麦克风状态
await _hubContext.Clients.Group(roomNum).OperMicr(userInfo, UId); await _hubContext.Clients.Group(roomNum).OperMicr(userInfo, UId);
} }
@ -411,7 +414,8 @@ namespace WGShare.API.Controllers.Frontend
if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) == uid) if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) == uid)
{ {
// 如果已经是全员观看他了,则不做处理 // 如果已经是全员观看他了, 直接通知其他房间用户
await _hubContext.Clients.Group(roomNum).ShowUser(uid, uname, UId, UserName);
return; return;
} }
// 设置房间全员观看用户 // 设置房间全员观看用户
@ -624,7 +628,13 @@ namespace WGShare.API.Controllers.Frontend
if (connectionIds.Any()) if (connectionIds.Any())
{ {
await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, UserName); var userInfo = RedisHelper.Instance.HGet<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), UId);
var userName = UserName;
if (userInfo != null)
{
userName = userInfo.UserName;
}
await _hubContext.Clients.Clients(connectionIds).ApplyToSpeak(UId, userName);
} }
} }
@ -636,7 +646,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;
@ -672,6 +682,25 @@ namespace WGShare.API.Controllers.Frontend
await _hubContext.Clients.Group(roomNum).ShowUser(UId, UserName, string.Empty, string.Empty); await _hubContext.Clients.Group(roomNum).ShowUser(UId, UserName, string.Empty, string.Empty);
} }
/// <summary>
/// 共享人取消共享屏幕
/// </summary>
/// <returns></returns>
[HttpPost("stop-shared-screen")]
public async Task StopedSharedScreen([FromQuery] string roomNum)
{
if (RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum) != ScreenShareId)
{
// 不是共享屏幕的人,不做处理
return;
}
// 设置新的共享屏幕
RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelShowUserKey(TenantId), roomNum, UId);
await _hubContext.Clients.Group(roomNum).StopedSharedScreen(ScreenShareId);
}
#region #region
/// <summary> /// <summary>
/// 分享上传文件 /// 分享上传文件

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;
@ -46,7 +47,7 @@ namespace WGShare.API.Hubs
/// </summary> /// </summary>
/// <param name="type"></param> /// <param name="type"></param>
/// <returns></returns> /// <returns></returns>
Task Operation(int type); Task Operation(string contentString);
/// <summary> /// <summary>
/// 更新视图 /// 更新视图
@ -60,6 +61,12 @@ namespace WGShare.API.Hubs
/// <returns></returns> /// <returns></returns>
Task ShowUser(string uid, string uname, string operUid, string operUserName); Task ShowUser(string uid, string uname, string operUid, string operUserName);
/// <summary>
/// 共享人取消共享屏幕
/// </summary>
/// <returns></returns>
Task StopedSharedScreen(string ScreenShareId);
/// <summary> /// <summary>
/// 用户加入频道回调 /// 用户加入频道回调
/// </summary> /// </summary>
@ -165,5 +172,18 @@ namespace WGShare.API.Hubs
/// 加入频道回调 /// 加入频道回调
/// </summary> /// </summary>
Task JoinChannelCallback(bool isSuccess); Task JoinChannelCallback(bool isSuccess);
/// <summary>
/// 发送设置发言人指令
/// </summary>
/// <returns></returns>
Task SetSpeaker(RoomManagerInputDTO inputDTO);
/// <summary>
/// 客户端接收到消息
/// </summary>
/// <param name="contentString"></param>
/// <returns></returns>
Task ReceivedOperation(string contentString);
} }
} }

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,17 +77,14 @@ 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))
{ {
// 所有房间移除该用户
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
// 判断是否全员看他,是则移除 // 判断是否全员看他,是则移除
var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1]) var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
if value == ARGV[2] or value == ARGV[3] then if value == ARGV[2] or value == ARGV[3] then
@ -92,6 +92,9 @@ namespace WGShare.API.Hubs
else return -1 end"; else return -1 end";
// 执行 eval 命令 // 执行 eval 命令
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid); pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid);
// 房间移除该用户
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
} }
// 删除用户在线状态 // 删除用户在线状态
@ -100,14 +103,31 @@ namespace WGShare.API.Hubs
// 删除用户已加入频道信息 // 删除用户已加入频道信息
pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid)); pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
pipe.EndPipe(); var result = pipe.EndPipe();
if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1)
{
// 如果离开的是全员看ta则重新设置管理员为全员看ta
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum));
var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList();
if (!showUsers.IsNullOrEmpty())
{
var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true);
if (showUser == null)
{
showUser = showUsers.FirstOrDefault();
}
// 通知全员看ta
await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
}
}
} }
if (!string.IsNullOrEmpty(roomNum)) if (!string.IsNullOrEmpty(roomNum))
// 通知房间其他用户,该用户退出 // 通知房间其他用户,该用户退出
await Clients.Group(roomNum).UserLeave(uid); await Clients.Group(roomNum).UserLeave(uid);
Console.WriteLine($"{DateTime.Now} 执行删除完成"); _logger.LogInformation($"{DateTime.Now} 执行删除完成");
} }
/// <summary> /// <summary>
@ -127,9 +147,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;
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
{ {
@ -203,9 +223,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())
{ {
@ -223,10 +243,16 @@ namespace WGShare.API.Hubs
var result = pipe.EndPipe(); var result = pipe.EndPipe();
if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1) if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1)
{ {
// 如果离开的是全员看ta则重新设置管理员为全员看ta
var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum)); var users = RedisHelper.Instance.HVals<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum));
var showUser = users.FirstOrDefault(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()); var showUsers = users.Where(x => x.RoleId == ((int)RoleEnums.Admin).ToString() || x.IsRoomManager || x.RoleId == ((int)RoleEnums.RoomManager).ToString()).ToList();
if (showUser != null) if (!showUsers.IsNullOrEmpty())
{ {
var showUser = showUsers.FirstOrDefault(x => x.EnableCamera == true);
if (showUser == null)
{
showUser = showUsers.FirstOrDefault();
}
// 通知全员看ta // 通知全员看ta
await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty); await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
} }
@ -248,12 +274,18 @@ 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;
var tenant = Context.Items["tenant"].ToString();
Console.WriteLine($" {DateTime.Now}发送消息 uname" + uname); _logger.LogInformation($" {DateTime.Now} 发送消息 uname{uname} roomNum{rooNum} msg{msg}");
Console.WriteLine($" {DateTime.Now}发送消息 roomNum" + rooNum);
Console.WriteLine($" {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); var userInfo = RedisHelper.Instance.HGet<ChannelUserInfo>(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, rooNum), uid);
var userName = uname;
if (userInfo != null)
{
userName = userInfo.UserName;
}
await Clients.OthersInGroup(rooNum).ReceiveMessage(uid, userName, msg, DateTime.Now.GetTotalMilliseconds()); //await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg);
} }
/// <summary> /// <summary>
@ -261,9 +293,21 @@ namespace WGShare.API.Hubs
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[HubMethodName("sendOper")] [HubMethodName("sendOper")]
public async Task SendOperation(string roomNum, int type) public async Task SendOperation(string roomNum, string contentString)
{ {
await Clients.Group(roomNum).Operation(type); await Clients.Group(roomNum).Operation(contentString);
}
/// <summary>
/// 发送客户端指令到指定用户
/// </summary>
/// <param name="uid"></param>
/// <param name="contentString"></param>
/// <returns></returns>
[HubMethodName("sendOper2User")]
public async Task SendOperationToUser(string uid, string contentString)
{
await Clients.User(uid).ReceivedOperation(contentString);
} }
/// <summary> /// <summary>
@ -301,5 +345,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

@ -11,6 +11,13 @@
<param name="account"></param> <param name="account"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Controllers.AuthController.CheckUserOnline(System.String)">
<summary>
检查用户是否在线
</summary>
<param name="account"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Controllers.AuthController.Login(WGShare.Domain.DTOs.Login.UserLoginDTO)"> <member name="M:WGShare.API.Controllers.AuthController.Login(WGShare.Domain.DTOs.Login.UserLoginDTO)">
<summary> <summary>
正常账号登录 正常账号登录
@ -162,6 +169,12 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Controllers.Frontend.HomeController.RecordVersionLog(WGShare.Domain.DTOs.Home.UserVersionLogDto)">
<summary>
记录用户当前用户版本
</summary>
<returns></returns>
</member>
<member name="T:WGShare.API.Controllers.Frontend.RoomController"> <member name="T:WGShare.API.Controllers.Frontend.RoomController">
<summary> <summary>
会议室接口 会议室接口
@ -298,6 +311,12 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.StopedSharedScreen(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>
分享上传文件 分享上传文件
@ -600,7 +619,7 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.Operation(System.Int32)"> <member name="M:WGShare.API.Hubs.IMessageClient.Operation(System.String)">
<summary> <summary>
客户端操作 客户端操作
</summary> </summary>
@ -619,6 +638,12 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.IMessageClient.StopedSharedScreen(System.String)">
<summary>
共享人取消共享屏幕
</summary>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.IMessageClient.UserJoined(WGShare.Domain.Entities.ChannelUserInfo)"> <member name="M:WGShare.API.Hubs.IMessageClient.UserJoined(WGShare.Domain.Entities.ChannelUserInfo)">
<summary> <summary>
用户加入频道回调 用户加入频道回调
@ -725,6 +750,19 @@
加入频道回调 加入频道回调
</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.IMessageClient.ReceivedOperation(System.String)">
<summary>
客户端接收到消息
</summary>
<param name="contentString"></param>
<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>
加入频道 加入频道
@ -746,12 +784,20 @@
<param name="rooNum"></param> <param name="rooNum"></param>
<param name="msg"></param> <param name="msg"></param>
</member> </member>
<member name="M:WGShare.API.Hubs.SessionManageHub.SendOperation(System.String,System.Int32)"> <member name="M:WGShare.API.Hubs.SessionManageHub.SendOperation(System.String,System.String)">
<summary> <summary>
发送客户端指令 发送客户端指令
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:WGShare.API.Hubs.SessionManageHub.SendOperationToUser(System.String,System.String)">
<summary>
发送客户端指令到指定用户
</summary>
<param name="uid"></param>
<param name="contentString"></param>
<returns></returns>
</member>
<member name="M:WGShare.API.Hubs.SessionManageHub.GetDriversList(System.String)"> <member name="M:WGShare.API.Hubs.SessionManageHub.GetDriversList(System.String)">
<summary> <summary>
获取设备列表 获取设备列表
@ -774,6 +820,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

@ -41,7 +41,7 @@
"Agora": { "Agora": {
"appId": "4a4f7be64fa1404ebda74784fe9ac381", "appId": "4a4f7be64fa1404ebda74784fe9ac381",
"appSecret": "255e05d96c794251b282a0de84242355", "appSecret": "255e05d96c794251b282a0de84242355",
"tokenExpireTimeInSecond": 300, "tokenExpireTimeInSecond": 86400,
"apiPrefix": "https://api.sd-rtn.com/", "apiPrefix": "https://api.sd-rtn.com/",
"clientId": "80cdc24f7dfa4497a37d98da95a3c4a4", "clientId": "80cdc24f7dfa4497a37d98da95a3c4a4",
"clientSecret": "8323581d4d464114b1f324b26cc62e09", "clientSecret": "8323581d4d464114b1f324b26cc62e09",

View File

@ -17,11 +17,11 @@
"Expires": 31104000 "Expires": 31104000
}, },
"ConnectionStrings": { "ConnectionStrings": {
"metting": "Database=metting;Server=rm-2vc20nd3d11g0oh6g.rwlb.cn-chengdu.rds.aliyuncs.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;", "metting": "Database=metting;Server=rds-external.23544.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;",
"usercenter": "Database=usercenter;Server=rm-2vc20nd3d11g0oh6g.rwlb.cn-chengdu.rds.aliyuncs.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;" "usercenter": "Database=usercenter;Server=rds-external.23544.com;Port=3306;Uid=marking;Pwd=poiuytPOIUYT098765)(*&^%;AllowZeroDateTime=True;ConvertZeroDateTime=True;"
}, },
"Redis": { "Redis": {
"master": "172.29.33.83:16379,password=poiuyt)(*&^%,defaultDatabase=6,prefix=wgshare:" "master": "redis-internal.23544.com:16379,password=poiuyt)(*&^%,defaultDatabase=6,prefix=wgshare:"
}, },
"Agora": { "Agora": {
"appId": "dcfc466a6ecb4a1f972630065dfb1e75", "appId": "dcfc466a6ecb4a1f972630065dfb1e75",

View File

@ -0,0 +1,29 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace WGShare.Domain.DTOs.Home
{
public class UserVersionLogDto
{
/// <summary>
/// 使用版本
///</summary>
public string Version { get; set; }
/// <summary>
/// 平台类型 1:PC 2:微信小程序
///</summary>
public int PlatformType { get; set; }
/// <summary>
/// 房间号
///</summary>
public string RoomNum { get; set; }
}
}

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; }
} }
} }

View File

@ -68,5 +68,12 @@ namespace WGShare.Domain.Entities
///</summary> ///</summary>
[SugarColumn(ColumnName = "allow_anonymous")] [SugarColumn(ColumnName = "allow_anonymous")]
public bool AllowAnonymous { get; set; } = true; public bool AllowAnonymous { get; set; } = true;
/// <summary>
/// 租户名称
/// </summary>
[SugarColumn(IsIgnore = true)]
public string TenantName { get; set; }
} }
} }

View File

@ -0,0 +1,52 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using Yitter.IdGenerator;
namespace WGShare.Domain.Entities
{
/// <summary>
/// 用户版本记录表
/// </summary>
[SugarTable("user_version_log")]
public class UserVersionLog
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public string Id { get; set; } = YitIdHelper.NextId().ToString();
/// <summary>
/// 用户Id
///</summary>
[SugarColumn(ColumnName = "user_id")]
public long UserId { get; set; }
/// <summary>
/// 使用版本
///</summary>
[SugarColumn(ColumnName = "version")]
public string Version { get; set; }
/// <summary>
/// 平台类型
///</summary>
[SugarColumn(ColumnName = "platform_type")]
public int PlatformType { get; set; }
/// <summary>
/// 房间号
///</summary>
[SugarColumn(ColumnName = "room_num")]
public string RoomNum { get; set; }
/// <summary>
/// 进房时间
///</summary>
[SugarColumn(ColumnName = "join_time", IsOnlyIgnoreInsert = true, IsOnlyIgnoreUpdate = true)]
public DateTime JoinTime { get; set; }
}
}

View File

@ -1,5 +1,6 @@
using System.Net.Http.Json; using System.Net.Http.Json;
using WGShare.Domain.DTOs.AgoraCallback; using WGShare.Domain.DTOs.AgoraCallback;
using WGShare.Domain.Entities;
namespace WGShare.Domain.FriendlyException namespace WGShare.Domain.FriendlyException
{ {
@ -41,7 +42,7 @@ namespace WGShare.Domain.FriendlyException
} }
public static async Task JoinAsync(EventBody eventBody) public static async Task JoinAsync(EventBody eventBody, Room roomInfo)
{ {
// 获取当前的日期 // 获取当前的日期
DateTime today = DateTime.Today; DateTime today = DateTime.Today;
@ -69,7 +70,7 @@ namespace WGShare.Domain.FriendlyException
markdown = new markdown = new
{ {
title = "有人入会通知", title = "有人入会通知",
text = $"有人进入会议室了,会议号:{eventBody.payload.channelName}点击查看https://analytics-lab.agora.io/analytics/call/search?projectId=0tOpVUrmf&fromTs={startTimestamp}&toTs={endTimestamp}" text = $"有人进入会议室了,学校:{roomInfo.TenantName},会议室名称:{roomInfo.RoomName},会议号:{eventBody.payload.channelName}. \r\n 点击查看https://analytics-lab.agora.io/analytics/call/search?projectId=0tOpVUrmf&fromTs={startTimestamp}&toTs={endTimestamp}"
}, },
})); }));
} }