Exemple #1
0
        private async Task Process(FacebookProcessResult result, FbMessage fbMessage, SocialAccount socialAccount, FbHookChange change)
        {
            SocialUser sender = await GetOrCreateFacebookUser(socialAccount.Token, fbMessage.SenderId);

            SocialUser receiver = await GetOrCreateFacebookUser(socialAccount.Token, fbMessage.ReceiverId);

            var existingConversation = GetUnClosedConversation(change.Value.ThreadId);

            if (existingConversation != null)
            {
                Message message = FacebookConverter.ConvertMessage(fbMessage, sender, receiver);
                message.ConversationId = existingConversation.Id;
                bool isNewMessage = fbMessage.SendTime > existingConversation.LastMessageSentTime;

                if (isNewMessage)
                {
                    existingConversation.IfRead = false;
                    existingConversation.Status = sender.Id != socialAccount.SocialUser.Id ? ConversationStatus.PendingInternal : ConversationStatus.PendingExternal;
                    existingConversation.LastMessageSenderId = message.SenderId;
                    existingConversation.LastMessageSentTime = message.SendTime;
                }

                existingConversation.Messages.Add(message);
                await UpdateConversation(existingConversation);

                await CurrentUnitOfWork.SaveChangesAsync();

                result.WithNewMessage(message);
            }
            else
            {
                if (sender.Id == socialAccount.Id)
                {
                    return;
                }

                Message message      = FacebookConverter.ConvertMessage(fbMessage, sender, receiver);
                var     conversation = new Conversation
                {
                    OriginalId          = change.Value.ThreadId,
                    Source              = ConversationSource.FacebookMessage,
                    Priority            = ConversationPriority.Normal,
                    Status              = ConversationStatus.New,
                    Subject             = GetSubject(message.Content),
                    LastMessageSenderId = message.SenderId,
                    LastMessageSentTime = message.SendTime
                };
                conversation.Messages.Add(message);
                await AddConversation(socialAccount, conversation);

                await CurrentUnitOfWork.SaveChangesAsync();

                result.WithNewConversation(conversation);
            }
        }
        private Mock <IDependencyResolver> MockDependecyResolverForTestingUpdateConversation(Conversation conversation, FbHookChange change, FbMessage fbMessage, SocialUser sender, SocialUser receiver)
        {
            var fbClientMock = new Mock <IFbClient>();

            fbClientMock.Setup(t => t.GetMessagesFromConversationId("token", change.Value.ThreadId, 10)).ReturnsAsync(
                new List <FbMessage>
            {
                fbMessage
            });
            var messageServiceMock = new Mock <IMessageService>();

            messageServiceMock.Setup(t => t.FindAll()).Returns(new List <Message>().AsQueryable());

            var socialUserServiceMock = new Mock <ISocialUserService>();

            socialUserServiceMock.Setup(t => t.GetOrCreateFacebookUser("token", fbMessage.SenderId)).ReturnsAsync(sender);
            socialUserServiceMock.Setup(t => t.GetOrCreateFacebookUser("token", fbMessage.ReceiverId)).ReturnsAsync(receiver);

            var conversationServiceMock = new Mock <IConversationService>();

            // If we can find a un-closed conversation, then we will add the new message to un-closed conversation.
            conversationServiceMock.Setup(t => t.GetUnClosedConversation(change.Value.ThreadId)).Returns(conversation);

            var dependencyResolverMock = new Mock <IDependencyResolver>();

            dependencyResolverMock.Setup(t => t.Resolve <IFbClient>()).Returns(fbClientMock.Object);
            dependencyResolverMock.Setup(t => t.Resolve <IMessageService>()).Returns(messageServiceMock.Object);
            dependencyResolverMock.Setup(t => t.Resolve <ISocialUserService>()).Returns(socialUserServiceMock.Object);
            dependencyResolverMock.Setup(t => t.Resolve <IConversationService>()).Returns(conversationServiceMock.Object);

            return(dependencyResolverMock);
        }
Exemple #3
0
        public async override Task <FacebookProcessResult> Process(SocialAccount socialAccount, FbHookChange change)
        {
            var result = new FacebookProcessResult(NotificationManager);

            if (!socialAccount.IfConvertMessageToConversation)
            {
                return(result);
            }

            IList <FbMessage> fbMessages = await FbClient.GetMessagesFromConversationId(socialAccount.Token, change.Value.ThreadId, 10);

            string[]       orgiginalIds    = fbMessages.Select(t => t.Id).ToArray();
            List <Message> existedMessages = MessageService.FindAll().Where(t => t.Source == MessageSource.FacebookMessage && orgiginalIds.Contains(t.OriginalId)).ToList();

            // remove duplicated messages.
            fbMessages = fbMessages.Where(t => !existedMessages.Any(m => m.OriginalId == t.Id)).OrderByDescending(t => t.SendTime).ToList();

            foreach (var fbMessage in fbMessages)
            {
                await Process(result, fbMessage, socialAccount, change);
            }

            return(result);
        }
Exemple #4
0
 public override bool IsMatch(FbHookChange change)
 {
     return(change.Field == "conversations" && change.Value.ThreadId != null);
 }
Exemple #5
0
 public abstract Task <FacebookProcessResult> Process(SocialAccount socialAccount, FbHookChange change);
Exemple #6
0
 public abstract bool IsMatch(FbHookChange change);
Exemple #7
0
        public override async Task <FacebookProcessResult> Process(SocialAccount socialAccount, FbHookChange change)
        {
            var result = new FacebookProcessResult(NotificationManager);

            if (IsWallPost(change) && !socialAccount.IfConvertWallPostToConversation)
            {
                return(result);
            }
            if (!IsWallPost(change) && !socialAccount.IfConvertVisitorPostToConversation)
            {
                return(result);
            }

            string token = socialAccount.Token;

            if (IsDuplicatedMessage(MessageSource.FacebookPost, change.Value.PostId))
            {
                return(result);
            }

            FbPost post = await FbClient.GetPost(socialAccount.Token, change.Value.PostId);

            SocialUser sender = await GetOrCreateFacebookUser(socialAccount.Token, post.from.id);

            Message message = FacebookConverter.ConvertToMessage(post);

            message.SenderId = sender.Id;
            if (message.SenderId != socialAccount.Id)
            {
                message.ReceiverId = socialAccount.Id;
            }
            var conversation = new Conversation
            {
                OriginalId          = change.Value.PostId,
                Source              = ConversationSource.FacebookVisitorPost,
                Priority            = ConversationPriority.Normal,
                Status              = ConversationStatus.New,
                Subject             = GetSubject(message.Content),
                LastMessageSenderId = message.SenderId,
                LastMessageSentTime = message.SendTime
            };

            if (change.Value.Verb == "add" && message.SenderId == socialAccount.Id)
            {
                conversation.Source   = ConversationSource.FacebookWallPost;
                conversation.IsHidden = true;
            }

            conversation.Messages.Add(message);
            await AddConversation(socialAccount, conversation);

            await CurrentUnitOfWork.SaveChangesAsync();

            if (!conversation.IsHidden)
            {
                result.WithNewConversation(conversation);
            }

            return(result);
        }