using Furion.DataEncryption; using GDZZ.Core.Entity; using GDZZ.Core.Service; using Microsoft.AspNetCore.SignalR; using Furion.InstantMessaging; using System; using System.Linq; using System.Threading.Tasks; namespace GDZZ.Core; /// /// 聊天集线器 /// //[MapHub("/hubs/chathub")] public class ChatHub : Hub { private readonly ISysCacheService _cache; private readonly SqlSugarRepository _sysOnlineUerRep; // 在线用户表仓储 public ChatHub(ISysCacheService cache, SqlSugarRepository sysOnlineUerRep) { _sysOnlineUerRep = sysOnlineUerRep; _cache = cache; } //RuntimeMethodHandle-rf /// /// 连接 /// /// public override async Task OnConnectedAsync() { Console.WriteLine("上线连接"); var token = Context.GetHttpContext().Request.Query["access_token"]; var claims = JWTEncryption.ReadJwtToken(token)?.Claims; var userId = claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_USERID)?.Value; var account= claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_ACCOUNT)?.Value; var name= claims.FirstOrDefault(e => e.Type == ClaimConst.CLAINM_NAME)?.Value; var tenantId= claims.FirstOrDefault(e => e.Type == ClaimConst.TENANT_ID)?.Value; var ip = HttpNewUtil.Ip; if (await _sysOnlineUerRep.AsQueryable().Filter("TenantId", true).AnyAsync(m => m.Account.Equals(account))) { await _sysOnlineUerRep.DeleteAsync(m => m.Account == account && m.LastLoginIp == ip); } OnlineUser user = new OnlineUser() { ConnectionId = Context.ConnectionId, UserId = long.Parse(userId), LastTime = DateTime.Now, LastLoginIp = ip, Account = account, Name = name, TenantId = Convert.ToInt64(tenantId) }; await _sysOnlineUerRep.InsertAsync(user); } /// /// 断开 /// /// /// public override async Task OnDisconnectedAsync(Exception exception) { if (!string.IsNullOrEmpty(Context.ConnectionId)) { await _sysOnlineUerRep.DeleteAsync(m => m.ConnectionId == Context.ConnectionId); } } }