예제 #1
0
        private async Task HandleChannelMessagesAsync(IEnumerable <MessageVm> messages)
        {
            foreach (var message in messages)
            {
                bool       hasException = true;
                MessageDto sentMessage  = null;
                while (hasException)
                {
                    try
                    {
                        if (NodeData.Instance.RoutedMessagesId.Contains(message.GlobalId.GetValueOrDefault()))
                        {
                            hasException = false;
                            continue;
                        }
                        if (message.Attachments != null)
                        {
                            foreach (var attachment in message.Attachments)
                            {
                                attachment.MessageId = 0;
                            }
                            await attachmentsService.DownloadAttachmentsPayloadAsync(message.Attachments, current).ConfigureAwait(false);

                            await attachmentsService.ThrowIfAttachmentsInvalidAsync(message, true).ConfigureAwait(false);
                        }
                        sentMessage = await createMessagesService.CreateChannelMessageAsync(MessageConverter.GetMessageDto(message)).ConfigureAwait(false);

                        hasException = false;
                    }
                    catch (ConversationNotFoundException ex)
                    {
                        var channel = await nodeRequestSender.GetChannelInformationAsync(ex.ConversationId, current).ConfigureAwait(false);

                        await createChannelsService.CreateOrUpdateUserChannelsAsync(new List <ChannelDto> {
                            channel
                        }).ConfigureAwait(false);

                        hasException = true;
                    }
                    catch (UserNotFoundException ex)
                    {
                        List <UserVm> users = new List <UserVm>(await nodeRequestSender.GetUsersInfoAsync(ex.UsersId.ToList(), null, current).ConfigureAwait(false));
                        await crossNodeService.CreateNewUsersAsync(users).ConfigureAwait(false);

                        hasException = true;
                    }
                    catch (Exception ex)
                    {
                        Logger.WriteLog(ex);
                        hasException = false;
                    }
                }
                SendChannelNotificationsAsync(sentMessage);
            }
        }
예제 #2
0
        public async Task CreateChannelMessage()
        {
            var channel         = fillTestDbHelper.Channels.FirstOrDefault();
            var expectedMessage = new MessageDto
            {
                ConversationId   = channel.ChannelId,
                ConversationType = ConversationType.Channel,
                GlobalId         = Guid.NewGuid(),
                Text             = "Create channel message test",
                SendingTime      = DateTime.UtcNow.ToUnixTime(),
                SenderId         = channel.ChannelUsers.FirstOrDefault(user => user.ChannelUserRole >= ChannelUserRole.Administrator).UserId
            };
            var actualMessage = await createMessagesService.CreateChannelMessageAsync(expectedMessage);

            Assert.True(expectedMessage.Text == actualMessage.Text &&
                        expectedMessage.SenderId == actualMessage.SenderId &&
                        expectedMessage.ConversationId == actualMessage.ConversationId &&
                        expectedMessage.ConversationType == actualMessage.ConversationType &&
                        expectedMessage.GlobalId == actualMessage.GlobalId);
        }
예제 #3
0
        private async Task <IEnumerable <MessageVm> > SendChannelMessagesAsync(IEnumerable <MessageVm> messages)
        {
            List <MessageVm> resultMessages = new List <MessageVm>();

            foreach (var message in messages)
            {
                message.SendingTime = DateTime.UtcNow.ToUnixTime();
                message.SenderId    = userId;
                message.GlobalId    = RandomExtensions.NextGuid();
                await attachmentsService.ThrowIfAttachmentsInvalidAsync(message, false).ConfigureAwait(false);

                MessageDto newMessage = await createMessagesService.CreateChannelMessageAsync(MessageConverter.GetMessageDto(message)).ConfigureAwait(false);

                MessageVm savedMessageVm = MessageConverter.GetMessageVm(newMessage, current.UserId);
                resultMessages.Add(savedMessageVm);
                conversationsNoticeService.SendNewMessageNoticeToChannelUsersAsync(newMessage, current);
                message.Attachments = savedMessageVm.Attachments;
                nodeNoticeService.SendNewChannelMessageNodeNoticeAsync(message);
                UsersConversationsCacheService.Instance.NewMessageUpdateUsersChannelsAsync(savedMessageVm);
            }
            return(resultMessages);
        }