Beispiel #1
0
        public async Task SendMessage(CreateMessageDto createMessageDto)
        {
            var username = Context.User.GetUsername();

            if (username == createMessageDto.RecipientUsername.ToLower())
            {
                throw new HubException("You cannot send messages to yourself");
            }
            else
            {
                var sender = await _unitOfWork.UserRepository.GetUserByUsernameAsync(username);

                var recipient = await _unitOfWork.UserRepository
                                .GetUserByUsernameAsync(createMessageDto.RecipientUsername);

                if (recipient == null)
                {
                    throw new HubException("Not found user");
                }
                else
                {
                    var message = new Message
                    {
                        Sender            = sender,
                        Recipient         = recipient,
                        SenderUsername    = sender.UserName,
                        RecipientUsername = recipient.UserName,
                        Content           = createMessageDto.Content,
                    };

                    var groupName = GetGroupName(sender.UserName, recipient.UserName);
                    var group     = await _unitOfWork.MessageRepository.GetMessageGroup(groupName);

                    if (group.Connections.Any(x => x.Username == recipient.UserName))
                    {
                        message.DateRead = DateTime.UtcNow;
                    }
                    else
                    {
                        var connections = await _tracker.GetConnectionsFroUser(recipient.UserName);

                        if (connections != null)
                        {
                            await _presenceHub.Clients.Clients(connections)
                            .SendAsync("NewMessageReceived", new
                            {
                                username = sender.UserName,
                                knownAs  = sender.KnownAs
                            });
                        }
                    }

                    _unitOfWork.MessageRepository.AddMessage(message);

                    if (await _unitOfWork.Complete())
                    {
                        await Clients.Group(groupName).SendAsync("NewMessage", _mapper.Map <MessageDto>(message));
                    }
                }
            }
        }