public async Task SendMessage(CreateMessageDto createMessageDto) { var username = Context.User.GetUsername(); if (username == createMessageDto.RecipientUsername) { throw new HubException("You cannot send message to yourself"); } var sender = await userRepository.GetUserByUsernameAsync(username); var recipient = await userRepository.GetUserByUsernameAsync(createMessageDto.RecipientUsername); if (recipient == null) { throw new HubException("Not found user"); } var message = new Message { Content = createMessageDto.Content, Sender = sender, Recipient = recipient, SenderUsername = sender.UserName, RecipientUsername = recipient.UserName }; var groupName = GetGroupName(sender.UserName, recipient.UserName); var group = await messageRepository.GetMessageGroup(groupName); if (group.Connections.Any(x => x.Username == recipient.UserName)) { message.DateRead = DateTime.UtcNow; } else { var connections = await presenceTracker.GetConnectionsForUser(recipient.UserName); if (connections != null) { await presenceHub.Clients.Clients(connections).SendAsync("NewMessageReceived", new { username = sender.UserName, KnownAs = sender.KnownAs }); } } messageRepository.AddMessage(message); if (await messageRepository.SaveAllAsync()) { await Clients.Group(groupName).SendAsync("NewMessage", mapper.Map <MessageDto>(message)); } }