baotian
2024-06-04 b959135a1139fb66646523d92e5bd20c5910f283
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using iWare.Wms.Core;
using Furion;
using Furion.DataEncryption;
using Microsoft.AspNetCore.SignalR;
using UAParser;
 
namespace iWare.Wms.Application
{
    /// <summary>
    /// 聊天集线器
    /// </summary>
    public class ChatHub : Hub<IChatClient>
    {
        private readonly ISysCacheService _cache;
        private readonly ISendMessageService _sendMessageService;
 
        public ChatHub(ISysCacheService cache, ISendMessageService sendMessageService)
        {
            _cache = cache;
            _sendMessageService = sendMessageService;
        }
 
        /// <summary>
        /// 连接
        /// </summary>
        /// <returns></returns>
        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<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER) ?? new List<OnlineUser>();
            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);
        }
 
        /// <summary>
        /// 断开
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            if (!string.IsNullOrEmpty(Context.ConnectionId))
            {
                var onlineUsers = await _cache.GetAsync<List<OnlineUser>>(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);
            }
        }
 
        /// <summary>
        /// 前端调用发送方法
        /// 发送信息给某个人
        /// </summary>
        /// <param name="_message"></param>
        /// <returns></returns>
        public async Task ClientsSendMessage(MessageinputDto _message)
        {
            await _sendMessageService.SendMessageToUser(_message.title, _message.message, _message.messageType, _message.userId);
        }
 
        /// <summary>
        /// 前端调用发送方法
        /// 发送信息给所有人
        /// </summary>
        /// <param name="_message"></param>
        /// <returns></returns>
        public async Task ClientsSendMessagetoAll(MessageinputDto _message)
        {
            await _sendMessageService.SendMessageToAllUser(_message.title, _message.message, _message.messageType);
        }
 
        /// <summary>
        /// 前端调用发送方法
        /// 发送消息给除了发送人的其他人
        /// </summary>
        /// <param name="_message"></param>
        /// <returns></returns>
        public async Task ClientsSendMessagetoOther(MessageinputDto _message)
        {
            // _message.userId为发送人ID
            await _sendMessageService.SendMessageToOtherUser(_message.title, _message.message, _message.messageType, _message.userId);
        }
 
        /// <summary>
        /// 前端调用发送方法
        /// 发送消息给某些人
        /// </summary>
        /// <param name="_message"></param>
        /// <returns></returns>
        public async Task ClientsSendMessagetoUsers(MessageinputDto _message)
        {
            await _sendMessageService.SendMessageToUsers(_message.title, _message.message, _message.messageType, _message.userIds);
        }
    }
}