Пример #1
0
        public async Task SendMessage(CreateMessageDto createMessageDto)
        {
            var username = Context.User.GetUsername();

            if (username == createMessageDto.RecipientUsername.ToLower())
            {
                throw new HubException("You cannot send message to yourself");
            }

            var sender = await _unitOfWork.UserRepository.GetUserByUsernameAsync(username);

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

            if (recipient == null)
            {
                throw new HubException("Not found User");
            }

            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.GetConnectionForUser(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));
            }
        }
Пример #2
0
        public async Task SendMessage(CreateMessageDto createMessageDto)
        {
            var username = Context.User.GetUserName();

            if (username == createMessageDto.RecipientName.ToLower())
            {
                throw new HubException("you can not message ypurself");
            }
            var sender = await _userRepository.GetUserByUserNameAsync(username);

            var receipent = await _userRepository.GetUserByUserNameAsync(createMessageDto.RecipientName);

            if (receipent == null)
            {
                throw new HubException("Not found user");
            }

            var message = new Message
            {
                Sender        = sender,
                Recipient     = receipent,
                SenderName    = sender.UserName,
                RecipientName = receipent.UserName,
                Content       = createMessageDto.Content
            };
            var groupName = GetGroupName(sender.UserName, receipent.UserName);
            var group     = await _messageRepository.GetMessageGroup(groupName);

            if (group.Connections.Any(x => x.Username == receipent.UserName))
            {
                message.DateRead = DateTime.UtcNow;
            }
            else
            {
                var connections = _presenceTracker.GetConnectionForUser(receipent.UserName);
                IReadOnlyList <string> connectionsReadOnly = connections.AsReadOnly();
                if (connections != null)
                {
                    await _presenceHub.Clients.Clients(connectionsReadOnly).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));
            }
            throw new HubException("Failed to send message");
        }