ChatHub.cs 4.0 KB

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