加入和离开频道使用signalr

This commit is contained in:
youngq 2024-09-24 14:27:27 +08:00
parent 5aaea0e252
commit 4588536363
4 changed files with 99 additions and 10 deletions

View File

@ -115,11 +115,11 @@
"DockerConfig": {
"Prot": "5192:5192",
"AspNetCoreEnv": "",
"LastEnvName": "marking001",
"LastEnvName": "29dev",
"RemoveDaysFromPublished": "10",
"WorkDir": "",
"Volume": "",
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Production -e TZ=Asia/Shanghai",
"Other": "--name wgshare-api -e ASPNETCORE_ENVIRONMENT=Development -e TZ=Asia/Shanghai",
"EnvPairList": [
{
"EnvName": "29dev",

View File

@ -367,15 +367,16 @@ namespace WGShare.API.Controllers.Frontend
}
/// <summary>
/// 加入频道
/// 加入频道
/// </summary>
/// <param name="roomNum"></param>
/// <param name="enableMicr"></param>
/// <param name="enableCamera"></param>
/// <returns></returns>
[HttpGet("join")]
[HttpGet("join"), Obsolete("废弃请使用Socker接口 JoinChannel")]
public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false)
{
//throw Oops.("接口已废弃");
//var isRoomManager = await _sqlSugar.Queryable<RoomManager>()
// .InnerJoin<Room>((rm, r) => r.Id == rm.RoomId)
// .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId)
@ -433,9 +434,10 @@ namespace WGShare.API.Controllers.Frontend
/// </summary>
/// <param name="roomNum"></param>
/// <returns></returns>
[HttpGet("leave")]
[HttpGet("leave"), Obsolete("废弃请使用Socker接口 leavelChannel")]
public async Task LevelChannel([FromQuery] string roomNum)
{
using (var pipe = RedisHelper.Instance.StartPipe())
{
// 判断如果有全员看ta则删除

View File

@ -4,6 +4,7 @@ using Masuit.Tools.Maths;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using SqlSugar;
using SqlSugar.Extensions;
using System;
using System.Globalization;
using System.Security.Claims;
@ -29,9 +30,18 @@ namespace WGShare.API.Hubs
public async override Task OnConnectedAsync()
{
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;
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
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;
Context.Items.Add("tenant", tenant);
Context.Items.Add("uid", uid);
Context.Items.Add("account", account);
Context.Items.Add("ssid", ssid);
Context.Items.Add("uname", uname);
Context.Items.Add("roleid", roleId);
Console.WriteLine($"{DateTime.Now}连接成功 当前租户:{tenant} account{account} uid:{uid} connectId:{Context.ConnectionId}");
@ -104,8 +114,8 @@ namespace WGShare.API.Hubs
/// <param name="roomNum"></param>
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
[HubMethodName("joinChannel"), Obsolete("废弃请使用Api接口 JoinChannel")]
public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true)
[HubMethodName("joinChannel")]
public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = false)
{
var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier)?.Value;
@ -118,13 +128,60 @@ namespace WGShare.API.Hubs
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 = false
};
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]
if redis.call('HEXISTS', hashKey, field) == 0 then
redis.call('HSET', hashKey, field, value)
return 1
else
return 0
end";
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);
}
/// <summary>
/// 离开频道
/// </summary>
/// <param name="roomNum"></param>
[HubMethodName("levelChannel"), Obsolete("废弃请使用Api接口 LevelChannel")]
[HubMethodName("levelChannel")]
public async Task LevelChannel(string roomNum)
{
var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
@ -138,6 +195,36 @@ namespace WGShare.API.Hubs
Console.WriteLine($" {DateTime.Now}离开频道 会议号:" + roomNum);
Console.WriteLine($" {DateTime.Now}离开频道 account" + account);
Console.WriteLine($" {DateTime.Now}离开频道 tenant" + tenant);
using (var pipe = RedisHelper.Instance.StartPipe())
{
// 判断如果有全员看ta则删除
var script = $@"local value = redis.call('HGET', KEYS[1], ARGV[1])
if value == ARGV[2] or value == ARGV[3] then
return redis.call('HDEL', KEYS[1], ARGV[1])
else return -1 end";
// 执行 eval 命令
pipe.Eval(script, [RedisKeyConstant.SessionManage.GetChannelShowUserKey(tenant)], roomNum, uid, ssid);
// 删除频道中得该用户
pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid);
// 删除用户已参与频道
pipe.Del(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid));
var result = pipe.EndPipe();
if (!result.IsNullOrEmpty() && result[0].ObjToInt() != -1)
{
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());
if (showUser != null)
{
// 通知全员看ta
await Clients.Group(roomNum).ShowUser(showUser.UID, showUser.UserName, string.Empty, string.Empty);
}
}
}
await Clients.GroupExcept(roomNum, Context.ConnectionId).UserLeave(uid);
await Groups.RemoveFromGroupAsync(Context.ConnectionId, roomNum);
}
/// <summary>

View File

@ -211,7 +211,7 @@
</member>
<member name="M:WGShare.API.Controllers.Frontend.RoomController.JoinChannel(System.String,System.Boolean,System.Boolean)">
<summary>
加入频道
加入频道 , Obsolete("废弃请使用Socker接口 JoinChannel")
</summary>
<param name="roomNum"></param>
<param name="enableMicr"></param>