From cc309355c692642ef227e6cb9c2ed57c3c1214f8 Mon Sep 17 00:00:00 2001 From: youngq Date: Tue, 16 Jul 2024 09:33:16 +0800 Subject: [PATCH] 1 --- WGShare.API/Controllers/AuthController.cs | 16 +- .../Controllers/Frontend/RoomController.cs | 152 ++++++++++++++++-- WGShare.API/Helpers/RedisHelper.cs | 71 ++++++++ WGShare.API/Hubs/IMessageClient.cs | 29 +++- WGShare.API/Hubs/SessionManageHub.cs | 50 +++--- WGShare.API/Program.cs | 10 +- WGShare.API/WGShare.API.xml | 41 ++++- WGShare.API/appsettings.Development.json | 2 +- WGShare.API/appsettings.json | 2 +- WGShare.Domain/AgoraApiResult/ChannelUser.cs | 21 ++- WGShare.Domain/DTOs/User/UserOutputDTO.cs | 9 ++ WGShare.Domain/Entities/ChannelUserInfo.cs | 47 ++++++ 12 files changed, 397 insertions(+), 53 deletions(-) create mode 100644 WGShare.Domain/Entities/ChannelUserInfo.cs diff --git a/WGShare.API/Controllers/AuthController.cs b/WGShare.API/Controllers/AuthController.cs index b5e4851..33eb2a1 100644 --- a/WGShare.API/Controllers/AuthController.cs +++ b/WGShare.API/Controllers/AuthController.cs @@ -31,12 +31,12 @@ namespace WGShare.API.Controllers /// /// 检查用户名 /// - /// + /// /// [HttpGet("check-user"), AllowAnonymous] - public async Task CheckUser([FromQuery] string userName) + public async Task CheckUser([FromQuery] string account) { - return await _sqlSugar.Queryable().AnyAsync(x => x.IsDelete == false && x.UserName == userName); + return await _sqlSugar.Queryable().AnyAsync(x => x.IsDelete == false && x.Account == account); } /// @@ -47,7 +47,7 @@ namespace WGShare.API.Controllers public async Task Login([FromBody] UserLoginDTO loginDTO) { var user = await _sqlSugar.Queryable() - .FirstAsync(x => x.UserName == loginDTO.Account && x.IsDelete == false && x.Pwd == loginDTO.Pwd); + .FirstAsync(x => x.Account == loginDTO.Account && x.IsDelete == false && x.Pwd == loginDTO.Pwd); if (user == null) { throw Oops.Oh("用户名或密码不正确!"); @@ -84,7 +84,9 @@ namespace WGShare.API.Controllers roleId = user.RoleId, userName = user.UserName, tenantName = tenant.TenantName, - expire= _configuration["Jwt:Expires"].ToInt32() + expire = _configuration["Jwt:Expires"].ToInt32(), + account = user.Account, + uid = user.Id }); } @@ -95,7 +97,7 @@ namespace WGShare.API.Controllers [HttpPost("anon-login")] public async Task Login([FromBody] AnonymousLoginDTO loginDTO) { - + var room = await _sqlSugar.Queryable().FirstAsync(x => x.Id == loginDTO.RoomId); if (room == null) { @@ -115,7 +117,7 @@ namespace WGShare.API.Controllers { throw Oops.Oh("该区域账号已停用,请联系管理员"); } - + var btnAutn = new List(); btnAutn.Add(new Claim("perm", perms.Sum(x => x.PermValue).ToString())); diff --git a/WGShare.API/Controllers/Frontend/RoomController.cs b/WGShare.API/Controllers/Frontend/RoomController.cs index 0a1db67..5f4f8ca 100644 --- a/WGShare.API/Controllers/Frontend/RoomController.cs +++ b/WGShare.API/Controllers/Frontend/RoomController.cs @@ -1,4 +1,5 @@ using AgoraIO.Media; +using Hangfire.MemoryStorage.Database; using Mapster; using Masuit.Tools; using Microsoft.AspNetCore.Authorization; @@ -6,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using Microsoft.IdentityModel.Tokens; using SqlSugar; +using SqlSugar.Extensions; using WGShare.API.Controllers.Basic; using WGShare.API.Helpers; using WGShare.API.Hubs; @@ -32,18 +34,21 @@ namespace WGShare.API.Controllers.Frontend private readonly OssHelper _ossHelper; private readonly AgoraHelper _agoraHelper; private readonly IHubContext _hubContext; + private readonly ILogger _logger; public RoomController(ISqlSugarClient sqlSugar, IConfiguration configuration, OssHelper ossHelper, AgoraHelper agoraHelper, - IHubContext hubContext) + IHubContext hubContext, + ILogger logger) { this._sqlSugar = sqlSugar; this._configuration = configuration; this._ossHelper = ossHelper; this._agoraHelper = agoraHelper; this._hubContext = hubContext; + this._logger = logger; } ///// @@ -94,18 +99,15 @@ namespace WGShare.API.Controllers.Frontend [HttpGet("user")] public async Task> GetUsers([FromQuery] string roomNum) { - var data = await _agoraHelper.GetChannelUserList(roomNum); - if (data == null) + var channelUsers = RedisHelper.Instance.HVals(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); + if (channelUsers.IsNullOrEmpty()) { - throw Oops.Oh("请求失败"); - } - if (!data.channel_exist) - { - throw Oops.Oh("频道不存在"); + return new List(); } + var uids = channelUsers.Select(x => x.UID); var users = await _sqlSugar.Queryable() - .Where(x => data.users.Contains(x.Account)) + .Where(x => uids.Contains(x.Id)) .ToListAsync(); var managerIds = await _sqlSugar.Queryable() @@ -114,12 +116,57 @@ namespace WGShare.API.Controllers.Frontend .Select((rm, r) => rm.UserId) .ToListAsync(); - var result = users.Adapt>(); - result.ForEach(x => x.IsManager = managerIds.Contains(x.Id)); + result.ForEach(x => + { + x.IsManager = managerIds.Contains(x.Id); + var info = channelUsers.FirstOrDefault(q => q.UID == x.Id); + if (info != null) + { + x.EnableMicr = info.EnableMicr; + x.EnableCamera = info.EnableCamera; + } + }); return result; + + + + #region 暂时不用声网获取用户列表 + + //var data = await _agoraHelper.GetChannelUserList(roomNum); + //if (data == null) + //{ + // throw Oops.Oh("请求失败"); + //} + //if (!data.channel_exist) + //{ + // throw Oops.Oh("频道不存在"); + //} + //if (data.broadcasters.IsNullOrEmpty()) + //{ + // return new List(); + //} + //var accounts = data.broadcasters.ConvertAll(x => x.ToString()); + + //var users = await _sqlSugar.Queryable() + // .Where(x => accounts.Contains(x.Account)) + // .ToListAsync(); + + //var managerIds = await _sqlSugar.Queryable() + // .InnerJoin((rm, r) => r.Id == rm.RoomId) + // .Where((rm, r) => r.RoomNum == roomNum) + // .Select((rm, r) => rm.UserId) + // .ToListAsync(); + + + //var result = users.Adapt>(); + + //result.ForEach(x => x.IsManager = managerIds.Contains(x.Id)); + + //return result; + #endregion } /// @@ -189,10 +236,89 @@ namespace WGShare.API.Controllers.Frontend public async Task KickOut([FromQuery] string roomNum, [FromQuery] string kickUid) { var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(TenantId), kickUid); - - await _hubContext.Clients.Client(connectId).ForceExitRoom(roomNum); + if (!string.IsNullOrWhiteSpace(connectId)) + { + await _hubContext.Clients.Client(connectId).ForceExitRoom(roomNum); + } } + /// + /// 开闭麦 + /// + /// + [HttpGet("oper-micr")] + public async Task Mute([FromQuery] string roomNum, [FromQuery] bool enableMicr, [FromQuery] string? uid, [FromQuery] bool? isAll = false) + { + if (isAll.HasValue && isAll.Value) + { + // 全员静音 + var allUsers = RedisHelper.Instance.HGetAll(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); + if (!allUsers.Any()) + { + return; + } + allUsers.ForEach(x => x.Value.EnableMicr = enableMicr); + RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers); + + await _hubContext.Clients.Group(roomNum).OperMicr(enableMicr); + await _hubContext.Clients.Group(roomNum).RefreshUserList(); + return; + } + + var userInfo = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid); + if (userInfo == null || string.IsNullOrWhiteSpace(userInfo.ConnectId)) + { + _logger.LogError($"闭麦操作,用户不存在频道!rediskey:{RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)} uid:" + uid); + return; + } + + userInfo.EnableMicr = enableMicr; + RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo); + + await _hubContext.Clients.Clients(userInfo.ConnectId).OperMicr(enableMicr); + await _hubContext.Clients.Group(roomNum).RefreshUserList(); + } + + /// + /// 开关闭摄像头 + /// + /// + [HttpGet("oper-camera")] + public async Task CloseCamera([FromQuery] string roomNum, [FromQuery] bool enableCamera, [FromQuery] string? uid, [FromQuery] bool? isAll = false) + { + if (isAll.HasValue && isAll.Value) + { + + var allUsers = RedisHelper.Instance.HGetAll(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)); + if (!allUsers.Any()) + { + return; + } + allUsers.ForEach(x => x.Value.EnableCamera = enableCamera); + RedisHelper.Instance.HMSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), allUsers); + + // 全员开关闭摄像头 + await _hubContext.Clients.Group(roomNum).OperCamera(enableCamera); + await _hubContext.Clients.Group(roomNum).RefreshUserList(); + return; + } + + var userInfo = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid); + if (userInfo == null || string.IsNullOrWhiteSpace(userInfo.ConnectId)) + { + _logger.LogError($"关闭摄像头操作,用户不存在频道!rediskey:{RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum)} uid:" + uid); + return; + } + + userInfo.EnableCamera = enableCamera; + RedisHelper.Instance.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(TenantId, roomNum), uid, userInfo); + + await _hubContext.Clients.Clients(userInfo.ConnectId).OperCamera(enableCamera); + await _hubContext.Clients.Group(roomNum).RefreshUserList(); + } + + + #region 文件分享 /// /// 分享上传文件 diff --git a/WGShare.API/Helpers/RedisHelper.cs b/WGShare.API/Helpers/RedisHelper.cs index dc2fa57..adb80d9 100644 --- a/WGShare.API/Helpers/RedisHelper.cs +++ b/WGShare.API/Helpers/RedisHelper.cs @@ -1,4 +1,6 @@ using FreeRedis; +using Masuit.Tools; +using Newtonsoft.Json; namespace WGShare.API.Helpers { @@ -43,5 +45,74 @@ namespace WGShare.API.Helpers /// 最大秒数 /// public static int RandomExpired(int minTimeoutSeconds, int maxTimeoutSeconds) => rnd.Value.Next(minTimeoutSeconds, maxTimeoutSeconds); + + public static List HVals(string key) where T : class + { + var valueStrings = Instance.HVals(key); + if (valueStrings.IsNullOrEmpty()) + { + return null; + } + + return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); + } + + public static T HGet(string key, string field) where T : class + { + var valueString = Instance.HGet(key, field); + if (valueString.IsNullOrEmpty()) + { + return null; + } + return JsonConvert.DeserializeObject(valueString); + } + + public static List HMGet(string key, params string[] fields) where T : class + { + var valueStrings = Instance.HMGet(key, fields); + if (valueStrings.IsNullOrEmpty()) + { + return null; + } + return valueStrings.ToList().ConvertAll(x => JsonConvert.DeserializeObject(x)); + } + + public static Dictionary HGetAll(string key) where T : class + { + var dic = Instance.HGetAll(key); + if (dic == null || dic.Count == 0) + { + return null; + } + Dictionary result = new Dictionary(); + + foreach (var kv in dic) + { + if (string.IsNullOrWhiteSpace(kv.Key) || string.IsNullOrWhiteSpace(kv.Value)) + { + continue; + } + result.Add(kv.Key, JsonConvert.DeserializeObject(kv.Value)); + } + + return result; + } + + + public static long HSet(string key, string fields, T value) where T : class + { + return Instance.HSet(key, fields, value.ToJsonString()); + } + + + public static void HMSet(string key, Dictionary keyValues) where T : class + { + var dic = new Dictionary(); + foreach (var kv in keyValues) + { + dic.Add(kv.Key,kv.Value.ToJsonString()); + } + Instance.HMSet(key, dic); + } } } diff --git a/WGShare.API/Hubs/IMessageClient.cs b/WGShare.API/Hubs/IMessageClient.cs index 06f6b7d..395980d 100644 --- a/WGShare.API/Hubs/IMessageClient.cs +++ b/WGShare.API/Hubs/IMessageClient.cs @@ -11,7 +11,7 @@ /// /// /// - Task ReceiveMessage(string userName, string message); + Task ReceiveMessage(string uid, string userName, string message); /// @@ -29,5 +29,32 @@ /// 会议号 /// Task ForceExitRoom(string roomNum); + + /// + /// 用户开闭麦 + /// + /// + /// + Task OperMicr(bool enableMicr); + + /// + /// 用户开启关闭摄像头 + /// + /// + /// + Task OperCamera(bool enableCamera); + + /// + /// 刷新用户列表 + /// + /// + Task RefreshUserList(); + + ///// + ///// 客户端操作 + ///// + ///// + ///// + //Task Operation(int type); } } diff --git a/WGShare.API/Hubs/SessionManageHub.cs b/WGShare.API/Hubs/SessionManageHub.cs index bc484f1..e7d2762 100644 --- a/WGShare.API/Hubs/SessionManageHub.cs +++ b/WGShare.API/Hubs/SessionManageHub.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.SignalR; using System.Text; using WGShare.API.Helpers; using WGShare.Domain.Constant; +using WGShare.Domain.Entities; namespace WGShare.API.Hubs { @@ -61,15 +62,23 @@ namespace WGShare.API.Hubs /// 加入频道 /// /// + /// 是否关闭麦克风,默认是 + /// 是否关闭摄像头,默认是 [HubMethodName("joinChannel")] - public async Task JoinChannel(string roomNum) + public async Task JoinChannel(string roomNum, bool enableMicr = true, bool enableCamera = true) { var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + + await Console.Out.WriteLineAsync("加入频道 会议号:" + roomNum); + await Console.Out.WriteLineAsync("加入频道 uid:" + uid); + await Console.Out.WriteLineAsync("加入频道 tenant:" + tenant); + using (var pipe = RedisHelper.Instance.StartPipe()) { - pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, Context.ConnectionId); + var userInfo = new ChannelUserInfo(uid, Context.ConnectionId, enableMicr, enableCamera); + pipe.HSet(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid, userInfo.ToJsonString()); pipe.HIncrBy(RedisKeyConstant.SessionManage.GetChannelUserCountKey(tenant), roomNum, 1); pipe.HSet(RedisKeyConstant.SessionManage.GetUserJoinChannelKey(uid), roomNum, 1); pipe.EndPipe(); @@ -88,6 +97,11 @@ namespace WGShare.API.Hubs var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; + + await Console.Out.WriteLineAsync("离开频道 会议号:" + roomNum); + await Console.Out.WriteLineAsync("离开频道 uid:" + uid); + await Console.Out.WriteLineAsync("离开频道 tenant:" + tenant); + using (var pipe = RedisHelper.Instance.StartPipe()) { pipe.HDel(RedisKeyConstant.SessionManage.GetChannelUserKey(tenant, roomNum), uid); @@ -103,39 +117,29 @@ namespace WGShare.API.Hubs /// 发送频道消息 /// /// - /// /// [HubMethodName("sendChannelMsg")] public async Task SenMessage(string rooNum, string msg) { var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; + var uid = Context.User?.Claims.FirstOrDefault(x => x.Type == "uid")?.Value; - await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uname, msg); + await Console.Out.WriteLineAsync("发送消息 uname:" + uname); + await Console.Out.WriteLineAsync("发送消息 roomNum:" + rooNum); + await Console.Out.WriteLineAsync("发送消息 msg:" + msg); + + await Clients.GroupExcept(rooNum, Context.ConnectionId).ReceiveMessage(uid, uname, msg); } ///// - ///// 邀请呼叫 + ///// 发送客户端指令 ///// - ///// 被邀请人id - ///// 会议名称 - ///// 会议号 ///// - //[HubMethodName("call")] - //public async Task<(bool isSuccess, string msg)> CallUser(string inviteeUid, string roomName, string roomNum) + //[HubMethodName("sendOper")] + //public async Task SendOperation(string roomNum, int type) //{ - // var tenant = Context.User?.Claims.FirstOrDefault(x => x.Type == "tenant")?.Value; - // var uname = Context.User?.Claims.FirstOrDefault(x => x.Type == "uname")?.Value; - - // var connectId = RedisHelper.Instance.HGet(RedisKeyConstant.SessionManage.GetOnlineUserKey(tenant), inviteeUid); - // if (string.IsNullOrWhiteSpace(connectId)) - // { - // return (false, "被邀请人不在线"); - // } - - // await Clients.Client(connectId).Invitation(roomNum, roomName, uname); - - // return (true, "邀请成功"); + // await Clients.Group(roomNum).Operation(type); //} - + } } diff --git a/WGShare.API/Program.cs b/WGShare.API/Program.cs index 5ef5c5c..4cf627f 100644 --- a/WGShare.API/Program.cs +++ b/WGShare.API/Program.cs @@ -1,5 +1,6 @@ using Hangfire; using Hangfire.MemoryStorage; +using Masuit.Tools; using Microsoft.AspNetCore.SignalR; using Microsoft.OpenApi.Models; using Newtonsoft.Json; @@ -21,9 +22,14 @@ namespace WGShare.API var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; - // Add services to the container. + // Add services to the container. - RedisHelper.Initialization(new FreeRedis.RedisClient(configuration["Redis:master"])); + RedisHelper.Initialization(new FreeRedis.RedisClient(configuration["Redis:master"]) + { + Serialize = (x) => x.ToJsonString(), + Deserialize = (x, t) => JsonConvert.DeserializeObject(x, t), + //DeserializeRaw = (x, t) => JsonConvert.DeserializeObject(x, t), + }); builder.Services.AddControllers(options => { // ȫ쳣ڴ д try catch diff --git a/WGShare.API/WGShare.API.xml b/WGShare.API/WGShare.API.xml index 5ca2021..3ece757 100644 --- a/WGShare.API/WGShare.API.xml +++ b/WGShare.API/WGShare.API.xml @@ -8,7 +8,7 @@ 检查用户名 - + @@ -131,6 +131,18 @@ + + + 开闭麦 + + + + + + 开关闭摄像头 + + + 分享上传文件 @@ -276,7 +288,7 @@ 客户端消息 - + 接受频道消息 @@ -300,11 +312,33 @@ 会议号 - + + + 用户开闭麦 + + + + + + + 用户开启关闭摄像头 + + + + + + + 刷新用户列表 + + + + 加入频道 + 是否关闭麦克风,默认是 + 是否关闭摄像头,默认是 @@ -317,7 +351,6 @@ 发送频道消息 - diff --git a/WGShare.API/appsettings.Development.json b/WGShare.API/appsettings.Development.json index 2ca3bb7..d441ebe 100644 --- a/WGShare.API/appsettings.Development.json +++ b/WGShare.API/appsettings.Development.json @@ -10,6 +10,6 @@ "usercenter": "Database=usercenter;Server=192.168.2.9;Port=3306;Uid=root;Pwd=qwe123!@#;AllowZeroDateTime=True;ConvertZeroDateTime=True;" }, "Redis": { - "master": "192.168.2.7:6379,password=qwe123!@#,defaultDatabase=13,name=wgshare,prefix=wgshare" + "master": "192.168.2.7:6379,password=qwe123!@#,defaultDatabase=13,name=wgshare,prefix=wgshare:" } } diff --git a/WGShare.API/appsettings.json b/WGShare.API/appsettings.json index de42024..cc130ac 100644 --- a/WGShare.API/appsettings.json +++ b/WGShare.API/appsettings.json @@ -18,7 +18,7 @@ "usercenter": "Database=usercenter;Server=192.168.2.9;Port=3306;Uid=root;Pwd=qwe123!@#;AllowZeroDateTime=True;ConvertZeroDateTime=True;" }, "Redis": { - "master": "172.29.33.83:16379,password=poiuyt)(*&^%,defaultDatabase=13,prefix=wgshare" + "master": "172.29.33.83:16379,password=poiuyt)(*&^%,defaultDatabase=13,prefix=wgshare:" }, "Agora": { "appId": "dcfc466a6ecb4a1f972630065dfb1e75", diff --git a/WGShare.Domain/AgoraApiResult/ChannelUser.cs b/WGShare.Domain/AgoraApiResult/ChannelUser.cs index c8b7e03..bc1897a 100644 --- a/WGShare.Domain/AgoraApiResult/ChannelUser.cs +++ b/WGShare.Domain/AgoraApiResult/ChannelUser.cs @@ -23,6 +23,25 @@ namespace WGShare.Domain.AgoraApiResult /// public int total { get; set; } - public List users { get; set; } + + /// + /// 频道内所有主播的用户 ID。该字段仅在直播场景(mode 的值为 2)下返回。 + /// + public List broadcasters { get; set; } + + /// + /// 频道内所有用户的用户 ID。该字段仅在通信场景(mode 的值为 1)下返回。 + /// + public List users { get; set; } + + /// + /// 频道内观众的用户 ID。最多包含当前频道内前 10,000 名观众的用户 ID。该字段仅在直播场景(mode 的值为 2)且未填 hosts_only 参数时返回。 + /// + public List audience { get; set; } + + /// + /// 频道内的观众总人数。该字段仅在直播场景(mode 的值为 2)下且未填 hosts_only 参数时返回。 + /// + public int audience_total { get; set; } } } diff --git a/WGShare.Domain/DTOs/User/UserOutputDTO.cs b/WGShare.Domain/DTOs/User/UserOutputDTO.cs index 0f16066..38f148a 100644 --- a/WGShare.Domain/DTOs/User/UserOutputDTO.cs +++ b/WGShare.Domain/DTOs/User/UserOutputDTO.cs @@ -26,5 +26,14 @@ namespace WGShare.Domain.DTOs.User /// public bool IsManager { get; set; } + /// + /// 是否关闭麦克风 + /// + public bool EnableMicr { get; set; } + + /// + /// 是否关闭摄像头 + /// + public bool EnableCamera { get; set; } } } diff --git a/WGShare.Domain/Entities/ChannelUserInfo.cs b/WGShare.Domain/Entities/ChannelUserInfo.cs new file mode 100644 index 0000000..a1492a3 --- /dev/null +++ b/WGShare.Domain/Entities/ChannelUserInfo.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WGShare.Domain.Entities +{ + /// + /// 用户在频道中的状态 + /// + public class ChannelUserInfo + { + public ChannelUserInfo() + { + + } + /// + /// + /// + /// + /// + /// 是否关闭麦克风,默认关 + /// 是否关闭摄像头,默认关 + public ChannelUserInfo(string uid, string connectId, bool enableMicr, bool enableCamera) + { + this.UID = uid; + this.ConnectId = connectId; + this.EnableMicr = enableMicr; + this.EnableCamera = enableCamera; + + } + public string UID { get; set; } + + public string ConnectId { get; set; } + + /// + /// 是否关闭麦克风 + /// + public bool EnableMicr { get; set; } + + /// + /// 是否关闭摄像头 + /// + public bool EnableCamera { get; set; } + } +}