using Admin.NET.Core; using Furion; using Furion.DataEncryption; using Microsoft.AspNetCore.SignalR; using UAParser; namespace Admin.NET.Application { /// /// 聊天集线器 /// public class ChatHub : Hub { private readonly ISysCacheService _cache; private readonly ISendMessageService _sendMessageService; /// /// 构造函数 /// /// /// public ChatHub(ISysCacheService cache, ISendMessageService sendMessageService) { _cache = cache; _sendMessageService = sendMessageService; } /// /// 连接 /// /// public override async Task OnConnectedAsync() { var token = Context.GetHttpContext().Request.Query["access_token"]; var claims = JWTEncryption.ReadJwtToken(token)?.Claims; var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]); var loginBrowser = client.UA.Family + client.UA.Major; var loginOs = client.OS.Family + client.OS.Major; 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 onlineUsers = await _cache.GetAsync>(CommonConst.CACHE_KEY_ONLINE_USER) ?? new List(); onlineUsers.Add(new OnlineUser { ConnectionId = Context.ConnectionId, UserId = long.Parse(userId), LastTime = DateTime.Now, LastLoginIp = App.HttpContext.GetRequestIPv4(), LastLoginBrowser = loginBrowser, LastLoginOs = loginOs, Account = account, Name = name, //TenantId = Convert.ToInt64(tenantId), }); await _cache.SetAsync(CommonConst.CACHE_KEY_ONLINE_USER, onlineUsers); } /// /// 断开 /// /// /// public override async Task OnDisconnectedAsync(Exception exception) { if (!string.IsNullOrEmpty(Context.ConnectionId)) { var onlineUsers = await _cache.GetAsync>(CommonConst.CACHE_KEY_ONLINE_USER); if (onlineUsers == null) return; onlineUsers.RemoveAll(u => u.ConnectionId == Context.ConnectionId); await _cache.SetAsync(CommonConst.CACHE_KEY_ONLINE_USER, onlineUsers); } } /// /// 前端调用发送方法 /// 发送信息给某个人 /// /// /// public async Task ClientsSendMessage(MessageinputDto _message) { await _sendMessageService.SendMessageToUser(_message.title, _message.message, _message.messageType, _message.userId); } /// /// 前端调用发送方法 /// 发送信息给所有人 /// /// /// public async Task ClientsSendMessagetoAll(MessageinputDto _message) { await _sendMessageService.SendMessageToAllUser(_message.title, _message.message, _message.messageType); } /// /// 前端调用发送方法 /// 发送消息给除了发送人的其他人 /// /// /// public async Task ClientsSendMessagetoOther(MessageinputDto _message) { // _message.userId为发送人ID await _sendMessageService.SendMessageToOtherUser(_message.title, _message.message, _message.messageType, _message.userId); } /// /// 前端调用发送方法 /// 发送消息给某些人 /// /// /// public async Task ClientsSendMessagetoUsers(MessageinputDto _message) { await _sendMessageService.SendMessageToUsers(_message.title, _message.message, _message.messageType, _message.userIds); } } }