ChatHub.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Microsoft.AspNetCore.SignalR;
  2. namespace Admin.NET.Core;
  3. /// <summary>
  4. /// 聊天集线器
  5. /// </summary>
  6. public class ChatHub : Hub<IChatClient>
  7. {
  8. private readonly ISysCacheService _cache;
  9. private readonly ISendMessageService _sendMessageService;
  10. public ChatHub(ISysCacheService cache,
  11. ISendMessageService sendMessageService)
  12. {
  13. _cache = cache;
  14. _sendMessageService = sendMessageService;
  15. }
  16. /// <summary>
  17. /// 连接
  18. /// </summary>
  19. /// <returns></returns>
  20. public override async Task OnConnectedAsync()
  21. {
  22. var token = Context.GetHttpContext().Request.Query["access_token"];
  23. var claims = JWTEncryption.ReadJwtToken(token)?.Claims;
  24. var client = Parser.GetDefault().Parse(Context.GetHttpContext().Request.Headers["User-Agent"]);
  25. var loginBrowser = client.UA.Family + client.UA.Major;
  26. var loginOs = client.OS.Family + client.OS.Major;
  27. var userId = claims.FirstOrDefault(e => e.Type == ClaimConst.UserId)?.Value;
  28. var account = claims.FirstOrDefault(e => e.Type == ClaimConst.UserName)?.Value;
  29. var name = claims.FirstOrDefault(e => e.Type == ClaimConst.RealName)?.Value;
  30. var tenantId = claims.FirstOrDefault(e => e.Type == ClaimConst.TenantId)?.Value;
  31. var onlineUsers = await _cache.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser) ?? new List<SysOnlineUser>();
  32. onlineUsers.Add(new SysOnlineUser
  33. {
  34. ConnectionId = Context.ConnectionId,
  35. UserId = long.Parse(userId),
  36. LastTime = DateTime.Now,
  37. LastLoginIp = App.HttpContext.GetRemoteIpAddressToIPv4(),
  38. LastLoginBrowser = loginBrowser,
  39. LastLoginOs = loginOs,
  40. Account = account,
  41. Name = name,
  42. TenantId = Convert.ToInt64(tenantId),
  43. });
  44. await _cache.SetAsync(CacheConst.KeyOnlineUser, onlineUsers);
  45. }
  46. /// <summary>
  47. /// 断开
  48. /// </summary>
  49. /// <param name="exception"></param>
  50. /// <returns></returns>
  51. public override async Task OnDisconnectedAsync(Exception exception)
  52. {
  53. if (!string.IsNullOrEmpty(Context.ConnectionId))
  54. {
  55. var onlineUsers = await _cache.GetAsync<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
  56. if (onlineUsers == null) return;
  57. onlineUsers.RemoveAll(u => u.ConnectionId == Context.ConnectionId);
  58. await _cache.SetAsync(CacheConst.KeyOnlineUser, onlineUsers);
  59. }
  60. }
  61. /// <summary>
  62. /// 前端调用发送方法(发送信息给某个人)
  63. /// </summary>
  64. /// <param name="_message"></param>
  65. /// <returns></returns>
  66. public async Task ClientsSendMessage(MessageInput _message)
  67. {
  68. await _sendMessageService.SendMessageToUser(_message.Title, _message.Message, _message.MessageType, _message.UserId);
  69. }
  70. /// <summary>
  71. /// 前端调用发送方法(发送信息给所有人)
  72. /// </summary>
  73. /// <param name="_message"></param>
  74. /// <returns></returns>
  75. public async Task ClientsSendMessagetoAll(MessageInput _message)
  76. {
  77. await _sendMessageService.SendMessageToAllUser(_message.Title, _message.Message, _message.MessageType);
  78. }
  79. /// <summary>
  80. /// 前端调用发送方法(发送消息给除了发送人的其他人)
  81. /// </summary>
  82. /// <param name="_message"></param>
  83. /// <returns></returns>
  84. public async Task ClientsSendMessagetoOther(MessageInput _message)
  85. {
  86. await _sendMessageService.SendMessageToOtherUser(_message.Title, _message.Message, _message.MessageType, _message.UserId);
  87. }
  88. /// <summary>
  89. /// 前端调用发送方法(发送消息给某些人)
  90. /// </summary>
  91. /// <param name="_message"></param>
  92. /// <returns></returns>
  93. public async Task ClientsSendMessagetoUsers(MessageInput _message)
  94. {
  95. await _sendMessageService.SendMessageToUsers(_message.Title, _message.Message, _message.MessageType, _message.UserIds);
  96. }
  97. }