using IM_API.Dtos; using IM_API.Interface.Services; using IM_API.Tools; using Microsoft.AspNetCore.SignalR; using System.Security.Claims; namespace IM_API.Hubs { public class ChatHub:Hub { private IMessageSevice _messageService; private readonly IConversationService _conversationService; public ChatHub(IMessageSevice messageService, IConversationService conversationService) { _messageService = messageService; _conversationService = conversationService; } public async override Task OnConnectedAsync() { if (!Context.User.Identity.IsAuthenticated) { Context.Abort(); return; } //将用户加入已加入聊天的会话组 string userIdStr = Context.User.FindFirstValue(ClaimTypes.NameIdentifier); var keys = await _conversationService.GetUserAllStreamKeyAsync(int.Parse(userIdStr)); foreach(var key in keys) { await Groups.AddToGroupAsync(Context.ConnectionId,key); } await base.OnConnectedAsync(); } public async Task SendPrivateMessage(MessageBaseDto dto) { if (!Context.User.Identity.IsAuthenticated) { await Clients.Caller.SendAsync("ReceiveMessage", new BaseResponse(CodeDefine.AUTH_FAILED)); Context.Abort(); return; } var userIdStr = Context.User.FindFirstValue(ClaimTypes.NameIdentifier); await _messageService.SendPrivateMessageAsync(int.Parse(userIdStr),dto.ReceiverId,dto); await Clients.Users(dto.ReceiverId.ToString()).SendAsync("ReceiveMessage", userIdStr, dto.Content); return; } } }