using iWare.Wms.Core;
using Furion;
using Furion.DataEncryption;
using Microsoft.AspNetCore.SignalR;
using UAParser;
namespace iWare.Wms.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);
}
}
}