コード例 #1
0
        public async void NewMessageUpdateUsersChannelsAsync(MessageVm message)
        {
            try
            {
                var usersId = await loadChannelsService.GetChannelUsersIdAsync(message.ConversationId.GetValueOrDefault()).ConfigureAwait(false);

                foreach (long userId in usersId)
                {
                    List <ConversationPreviewVm> channels = (await GetUserChannelsAsync(userId).ConfigureAwait(false))?.ToList();
                    if (channels == null || channels.All(opt => opt.ConversationId != message.ConversationId))
                    {
                        channels = (await loadChannelsService.GetUserChannelsPreviewAsync(userId).ConfigureAwait(false))?.ToList();
                        UpdateUserChannels(userId, channels);
                        continue;
                    }
                    ConversationPreviewVm updatedChannel = channels.FirstOrDefault(opt => opt.ConversationId == message.ConversationId);
                    if (updatedChannel != null)
                    {
                        updatedChannel.LastMessageTime = message.SendingTime;
                        updatedChannel.PreviewText     = message.Text;
                        updatedChannel.LastMessageId   = message.GlobalId;
                        updatedChannel.Read            = false;
                        updatedChannel.AttachmentType  = message.Attachments?.FirstOrDefault()?.Type;
                        UpdateUserChannels(userId, channels);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLog(ex);
            }
        }
コード例 #2
0
        public async void UserEditedUpdateUserDialogsAsync(UserVm user)
        {
            try
            {
                var userDialogs = await loadDialogsService.GetUserDialogsPreviewAsync(user.Id.GetValueOrDefault()).ConfigureAwait(false);

                foreach (var dialog in userDialogs)
                {
                    IEnumerable <ConversationPreviewVm> secondUserDialogs = await GetUserDialogsAsync(dialog.SecondUid.GetValueOrDefault()).ConfigureAwait(false);

                    ConversationPreviewVm updatedDialog = secondUserDialogs?.FirstOrDefault(opt => opt.SecondUid == user.Id.GetValueOrDefault());
                    if (updatedDialog != null)
                    {
                        updatedDialog.Photo = user.Photo;
                        updatedDialog.Title = $"{user.NameFirst} {user.NameSecond}";
                        secondUserDialogs   = secondUserDialogs.Where(opt => opt.ConversationId != updatedDialog.ConversationId).Append(updatedDialog);
                        UpdateUserDialogs(dialog.SecondUid.GetValueOrDefault(), secondUserDialogs);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLog(ex);
            }
        }
コード例 #3
0
        public async void NewMessageUpdateUserChatsAsync(MessageVm message)
        {
            try
            {
                UserVm senderInfo = await loadUsersService.GetUserAsync(message.SenderId.GetValueOrDefault()).ConfigureAwait(false);

                IEnumerable <long> usersId = await loadChatsService.GetChatUsersIdAsync(message.ConversationId.GetValueOrDefault()).ConfigureAwait(false);

                foreach (long userId in usersId)
                {
                    List <ConversationPreviewVm> cachedChats = (await GetUserChatsAsync(userId).ConfigureAwait(false))?.ToList();
                    if (cachedChats == null || cachedChats.All(opt => opt.ConversationId != message.ConversationId))
                    {
                        cachedChats = (await loadChatsService.GetUserChatPreviewAsync(userId, DateTime.UtcNow.ToUnixTime()).ConfigureAwait(false))?.ToList();
                        UpdateUserChats(userId, cachedChats);
                        continue;
                    }
                    ConversationPreviewVm updatedChat = cachedChats.FirstOrDefault(opt => opt.ConversationId == message.ConversationId);
                    if (updatedChat != null)
                    {
                        updatedChat.LastMessageSenderId   = message.SenderId;
                        updatedChat.LastMessageTime       = message.SendingTime;
                        updatedChat.LastMessageSenderName = senderInfo.NameFirst;
                        updatedChat.PreviewText           = message.Text;
                        updatedChat.LastMessageId         = message.GlobalId;
                        updatedChat.Read           = false;
                        updatedChat.AttachmentType = (AttachmentType?)message.Attachments?.FirstOrDefault()?.Type ?? null;
                        UpdateUserChats(userId, cachedChats);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLog(ex);
            }
        }
コード例 #4
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));
        }
コード例 #5
0
        public async void NewMessageUpdateUserDialogsAsync(MessageVm message, long receiverDialogId)
        {
            try
            {
                List <ConversationPreviewVm>        senderDialogs   = (await GetUserDialogsAsync(message.SenderId.Value).ConfigureAwait(false))?.ToList();
                IEnumerable <ConversationPreviewVm> receiverDialogs = await GetUserDialogsAsync(message.ReceiverId.Value).ConfigureAwait(false);

                if (senderDialogs != null)
                {
                    ConversationPreviewVm changedSenderDialog = senderDialogs
                                                                .FirstOrDefault(opt => opt.ConversationId == message.ConversationId);
                    if (changedSenderDialog != null)
                    {
                        changedSenderDialog.LastMessageSenderId = message.SenderId;
                        changedSenderDialog.LastMessageTime     = message.SendingTime;
                        changedSenderDialog.PreviewText         = message.Text;
                        changedSenderDialog.AttachmentType      = message.Attachments?.FirstOrDefault()?.Type;
                        changedSenderDialog.Read          = false;
                        changedSenderDialog.LastMessageId = message.GlobalId;
                    }
                    else
                    {
                        senderDialogs = (await loadDialogsService.GetUserDialogsPreviewAsync(message.SenderId.Value).ConfigureAwait(false)).ToList();
                    }
                }
                else
                {
                    senderDialogs = (await loadDialogsService.GetUserDialogsPreviewAsync(message.SenderId.Value).ConfigureAwait(false)).ToList();
                }
                if (receiverDialogs != null)
                {
                    ConversationPreviewVm changedReceiverDialog = receiverDialogs
                                                                  .FirstOrDefault(opt => opt.ConversationId == receiverDialogId);
                    if (changedReceiverDialog != null)
                    {
                        changedReceiverDialog.LastMessageSenderId = message.SenderId;
                        changedReceiverDialog.LastMessageTime     = message.SendingTime;
                        changedReceiverDialog.PreviewText         = message.Text;
                        changedReceiverDialog.AttachmentType      = message.Attachments?.FirstOrDefault()?.Type;
                        changedReceiverDialog.Read          = false;
                        changedReceiverDialog.LastMessageId = message.GlobalId;
                        receiverDialogs = receiverDialogs.Where(opt => opt.ConversationId != changedReceiverDialog.ConversationId);
                        receiverDialogs = receiverDialogs.Append(changedReceiverDialog);
                    }
                    else
                    {
                        receiverDialogs = await loadDialogsService.GetUserDialogsPreviewAsync(message.ReceiverId.Value).ConfigureAwait(false);
                    }
                }
                else
                {
                    receiverDialogs = await loadDialogsService.GetUserDialogsPreviewAsync(message.ReceiverId.Value).ConfigureAwait(false);
                }
                UpdateUserDialogs(message.SenderId.Value, senderDialogs.OrderByDescending(opt => opt.LastMessageTime));
                UpdateUserDialogs(message.ReceiverId.Value, receiverDialogs.OrderByDescending(opt => opt.LastMessageTime));
            }
            catch (Exception ex)
            {
                Logger.WriteLog(ex);
            }
        }