加入和离开频道使用signalr
This commit is contained in:
parent
5aaea0e252
commit
4588536363
|
|
@ -115,11 +115,11 @@
|
||||||
"DockerConfig": {
|
"DockerConfig": {
|
||||||
"Prot": "5192:5192",
|
"Prot": "5192:5192",
|
||||||
"AspNetCoreEnv": "",
|
"AspNetCoreEnv": "",
|
||||||
"LastEnvName": "marking001",
|
"LastEnvName": "29dev",
|
||||||
"RemoveDaysFromPublished": "10",
|
"RemoveDaysFromPublished": "10",
|
||||||
"WorkDir": "",
|
"WorkDir": "",
|
||||||
"Volume": "",
|
"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": [
|
"EnvPairList": [
|
||||||
{
|
{
|
||||||
"EnvName": "29dev",
|
"EnvName": "29dev",
|
||||||
|
|
|
||||||
|
|
@ -373,9 +373,10 @@ namespace WGShare.API.Controllers.Frontend
|
||||||
/// <param name="enableMicr"></param>
|
/// <param name="enableMicr"></param>
|
||||||
/// <param name="enableCamera"></param>
|
/// <param name="enableCamera"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("join")]
|
[HttpGet("join"), Obsolete("废弃,请使用Socker接口 JoinChannel")]
|
||||||
public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false)
|
public async Task JoinChannel([FromQuery] string roomNum, [FromQuery] bool enableMicr = false, [FromQuery] bool enableCamera = false)
|
||||||
{
|
{
|
||||||
|
//throw Oops.("接口已废弃");
|
||||||
//var isRoomManager = await _sqlSugar.Queryable<RoomManager>()
|
//var isRoomManager = await _sqlSugar.Queryable<RoomManager>()
|
||||||
// .InnerJoin<Room>((rm, r) => r.Id == rm.RoomId)
|
// .InnerJoin<Room>((rm, r) => r.Id == rm.RoomId)
|
||||||
// .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId)
|
// .Where((rm, r) => r.RoomNum == roomNum && rm.UserId == UId)
|
||||||
|
|
@ -433,9 +434,10 @@ namespace WGShare.API.Controllers.Frontend
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="roomNum"></param>
|
/// <param name="roomNum"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpGet("leave")]
|
[HttpGet("leave"), Obsolete("废弃,请使用Socker接口 leavelChannel")]
|
||||||
public async Task LevelChannel([FromQuery] string roomNum)
|
public async Task LevelChannel([FromQuery] string roomNum)
|
||||||
{
|
{
|
||||||
|
|
||||||
using (var pipe = RedisHelper.Instance.StartPipe())
|
using (var pipe = RedisHelper.Instance.StartPipe())
|
||||||
{
|
{
|
||||||
// 判断,如果有全员看ta,则删除
|
// 判断,如果有全员看ta,则删除
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ using Masuit.Tools.Maths;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
|
using SqlSugar.Extensions;
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
@ -29,9 +30,18 @@ namespace WGShare.API.Hubs
|
||||||
public async override Task OnConnectedAsync()
|
public async override Task OnConnectedAsync()
|
||||||
{
|
{
|
||||||
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;
|
||||||
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
|
var account = Context.User?.Claims.FirstOrDefault(x => x.Type == "account")?.Value;
|
||||||
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 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}");
|
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="roomNum"></param>
|
||||||
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
|
/// <param name="enableMicr">是否关闭麦克风,默认是</param>
|
||||||
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
|
/// <param name="enableCamera">是否关闭摄像头,默认是</param>
|
||||||
[HubMethodName("joinChannel"), Obsolete("废弃,请使用Api接口 JoinChannel")]
|
[HubMethodName("joinChannel")]
|
||||||
public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true)
|
public async Task JoinChannel(string roomNum, bool enableMicr = false, bool enableCamera = 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;
|
||||||
|
|
@ -118,13 +128,60 @@ namespace WGShare.API.Hubs
|
||||||
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
|
Console.WriteLine($"{DateTime.Now}加入频道 会议号:" + roomNum);
|
||||||
Console.WriteLine($"{DateTime.Now}加入频道 account:" + account);
|
Console.WriteLine($"{DateTime.Now}加入频道 account:" + account);
|
||||||
Console.WriteLine($"{DateTime.Now}加入频道 tenant:" + tenant);
|
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>
|
||||||
/// 离开频道
|
/// 离开频道
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="roomNum"></param>
|
/// <param name="roomNum"></param>
|
||||||
[HubMethodName("levelChannel"), Obsolete("废弃,请使用Api接口 LevelChannel")]
|
[HubMethodName("levelChannel")]
|
||||||
public async Task LevelChannel(string roomNum)
|
public async Task LevelChannel(string roomNum)
|
||||||
{
|
{
|
||||||
var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value;
|
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}离开频道 会议号:" + roomNum);
|
||||||
Console.WriteLine($" {DateTime.Now}离开频道 account:" + account);
|
Console.WriteLine($" {DateTime.Now}离开频道 account:" + account);
|
||||||
Console.WriteLine($" {DateTime.Now}离开频道 tenant:" + tenant);
|
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>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -211,7 +211,7 @@
|
||||||
</member>
|
</member>
|
||||||
<member name="M:WGShare.API.Controllers.Frontend.RoomController.JoinChannel(System.String,System.Boolean,System.Boolean)">
|
<member name="M:WGShare.API.Controllers.Frontend.RoomController.JoinChannel(System.String,System.Boolean,System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
加入频道
|
加入频道 , Obsolete("废弃,请使用Socker接口 JoinChannel")
|
||||||
</summary>
|
</summary>
|
||||||
<param name="roomNum"></param>
|
<param name="roomNum"></param>
|
||||||
<param name="enableMicr"></param>
|
<param name="enableMicr"></param>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue