Beispiel #1
0
        private async Task <List <MessageVm> > SendDialogMessagesAsync(IEnumerable <MessageVm> messages)
        {
            List <MessageDto> resultMessages = new List <MessageDto>();

            foreach (var message in messages)
            {
                message.SenderId         = userId;
                message.GlobalId         = RandomExtensions.NextGuid();
                message.ConversationType = ConversationType.Dialog;
                await attachmentsService.ThrowIfAttachmentsInvalidAsync(message, false).ConfigureAwait(false);

                List <MessageDto> sentMessages = default;
                bool saveMessageFlag           = true;
                if (message.Attachments?.Any() ?? false)
                {
                    var attachment = message.Attachments.FirstOrDefault(opt => opt.Type == AttachmentType.EncryptedMessage);
                    if (attachment != null)
                    {
                        var ecnryptedMessage = ObjectSerializer.JsonToObject <EncryptedMessage>(attachment.Payload.ToString());
                        saveMessageFlag = ecnryptedMessage.SaveFlag > 0;
                    }
                }
                message.SendingTime = DateTime.UtcNow.ToUnixTime();
                if (saveMessageFlag)
                {
                    sentMessages = await createMessagesService.CreateDialogMessageAsync(MessageConverter.GetMessageDto(message)).ConfigureAwait(false);

                    var dialogs = await loadDialogsService.GetUsersDialogsAsync(message.SenderId.Value, message.ReceiverId.Value).ConfigureAwait(false);

                    var receiverDialog = dialogs.FirstOrDefault(dialog => dialog.FirstUserId == message.ReceiverId);
                    UsersConversationsCacheService.Instance.NewMessageUpdateUserDialogsAsync(MessageConverter.GetMessageVm(sentMessages[0], current.UserId), receiverDialog.Id);
                }
                else
                {
                    List <long> dialogsId = await loadDialogsService.GetDialogsIdByUsersIdPairAsync(message.SenderId.GetValueOrDefault(), message.ReceiverId.GetValueOrDefault()).ConfigureAwait(false);

                    sentMessages = dialogsId.Select(opt =>
                    {
                        MessageDto tempMessage = new MessageDto(MessageConverter.GetMessageDto(message))
                        {
                            ConversationId = opt
                        };
                        return(tempMessage);
                    })
                                   .ToList();
                }
                if (!sentMessages.Any())
                {
                    throw new MessageException();
                }
                conversationsNoticeService.SendNewMessageNoticeToDialogUsers(
                    sentMessages,
                    current,
                    message.ReceiverId.GetValueOrDefault(),
                    saveMessageFlag);
                nodeNoticeService.SendNewDialogMessageNodeNoticeAsync(MessageConverter.GetMessageVm(sentMessages.FirstOrDefault(), current.UserId));
                IEnumerable <ConversationPreviewVm> senderDialogs = await UsersConversationsCacheService.Instance.GetUserConversationsAsync(userId, ConversationType.Dialog).ConfigureAwait(false);

                if (senderDialogs == null || !senderDialogs.Any(opt => opt.SecondUid == message.ReceiverId))
                {
                    senderDialogs = await loadDialogsService.GetUserDialogsPreviewAsync(userId).ConfigureAwait(false);

                    UsersConversationsCacheService.Instance.UpdateUserConversations(userId, senderDialogs);
                }
                ConversationPreviewVm currentDialog = senderDialogs.FirstOrDefault(dialog => dialog.SecondUid == message.ReceiverId);
                resultMessages.Add(sentMessages.FirstOrDefault(mess => mess.ConversationId == currentDialog.ConversationId));
            }
            return(MessageConverter.GetMessagesVm(resultMessages, current.UserId));
        }
Beispiel #2
0
        private async Task HandleDialogMessagesAsync(IEnumerable <MessageVm> messages)
        {
            foreach (var message in messages)
            {
                bool saveMessageFlag = true;
                try
                {
                    if (NodeData.Instance.RoutedMessagesId.Contains(message.GlobalId.GetValueOrDefault()))
                    {
                        continue;
                    }
                    if (!message.Attachments.IsNullOrEmpty())
                    {
                        foreach (var attachment in message.Attachments)
                        {
                            attachment.MessageId = 0;
                        }
                        await attachmentsService.DownloadAttachmentsPayloadAsync(message.Attachments, current).ConfigureAwait(false);

                        await attachmentsService.ThrowIfAttachmentsInvalidAsync(message, true).ConfigureAwait(false);
                    }
                    if (!message.Attachments.IsNullOrEmpty())
                    {
                        var attachment = message.Attachments.FirstOrDefault(opt => opt.Type == AttachmentType.EncryptedMessage);
                        if (attachment != null)
                        {
                            var ecnryptedMessage = (EncryptedMessage)attachment.Payload;
                            saveMessageFlag = ecnryptedMessage.SaveFlag > 0;
                        }
                    }
                    List <MessageDto> newMessages = null;
                    if (saveMessageFlag)
                    {
                        newMessages = await createMessagesService.CreateDialogMessageAsync(MessageConverter.GetMessageDto(message)).ConfigureAwait(false);
                    }
                    else
                    {
                        var dialogs = await loadDialogsService.GetUsersDialogsAsync(message.SenderId.Value, message.ReceiverId.Value);

                        var senderMessage = MessageConverter.GetMessageDto(message);
                        senderMessage.ConversationId = dialogs.FirstOrDefault(dialog => dialog.FirstUserId == message.SenderId).Id;
                        var receiverMessage = MessageConverter.GetMessageDto(message);
                        receiverMessage.ConversationId = dialogs.FirstOrDefault(dialog => dialog.FirstUserId == message.ReceiverId).Id;
                        newMessages = new List <MessageDto> {
                            senderMessage, receiverMessage
                        };
                    }
                    newMessages.Reverse();
                    SendDialogNotificationsAsync(newMessages, saveMessageFlag);
                }
                catch (UserNotFoundException ex)
                {
                    if (ex.UsersId != null)
                    {
                        var user = (await nodeRequestSender.GetUsersInfoAsync(
                                        new List <long>(ex.UsersId),
                                        null,
                                        current).ConfigureAwait(false)).FirstOrDefault();
                        if (user != null)
                        {
                            await crossNodeService.NewOrEditUserAsync(new ShortUser
                            {
                                UserId = user.Id.GetValueOrDefault(),
                            }, current.Node.Id).ConfigureAwait(false);
                        }

                        List <MessageDto> newMessages = await createMessagesService.CreateDialogMessageAsync(MessageConverter.GetMessageDto(message)).ConfigureAwait(false);

                        newMessages.Reverse();
                        SendDialogNotificationsAsync(newMessages, saveMessageFlag);
                    }
                }
            }
        }