public async override Task <FacebookProcessResult> Process(SocialAccount socialAccount, FbHookChange change) { var result = new FacebookProcessResult(NotificationManager); string token = socialAccount.Token; if (IsDuplicatedMessage(change.Value.CommentId)) { return(result); } FbComment comment = FbClient.GetComment(socialAccount.Token, change.Value.CommentId); SocialUser sender = await GetOrCreateFacebookUser(socialAccount.Token, comment.from.id); var conversation = GetConversation(change.Value.PostId); if (conversation == null) { return(result); } Message message = FacebookConverter.ConvertToMessage(comment); message.SenderId = sender.Id; var parent = GetParent(change.Value.PostId, comment); if (parent != null) { message.ParentId = parent.Id; message.ReceiverId = parent.SenderId; bool ifParentIsComment = parent.ParentId != null; if (ifParentIsComment) { message.Source = MessageSource.FacebookPostReplyComment; } } message.ConversationId = conversation.Id; conversation.IfRead = false; conversation.Status = sender.Id != socialAccount.Id ? ConversationStatus.PendingInternal : ConversationStatus.PendingExternal; conversation.LastMessageSenderId = message.SenderId; conversation.LastMessageSentTime = message.SendTime; if (conversation.TryToMakeWallPostVisible(socialAccount)) { result.WithNewConversation(conversation); } conversation.Messages.Add(message); await UpdateConversation(conversation); await CurrentUnitOfWork.SaveChangesAsync(); if (!conversation.IsHidden) { result.WithNewMessage(message); } return(result); }
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); }
public WebHookStrategy(IDependencyResolver dependencyResolver) { ConversationService = dependencyResolver.Resolve <IConversationService>(); SocialUserService = dependencyResolver.Resolve <ISocialUserService>(); MessageService = dependencyResolver.Resolve <IMessageService>(); NotificationManager = dependencyResolver.Resolve <INotificationManager>(); FbClient = dependencyResolver.Resolve <IFbClient>(); FacebookConverter = new FacebookConverter(); }
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); } }
public PullJobService( IConversationService conversationService, IMessageService messageService, ISocialUserService socialUserService, INotificationManager notificationManager, IFbClient fbClient ) { _conversationService = conversationService; _messageService = messageService; _socialUserService = socialUserService; _notificationManager = notificationManager; _fbClient = fbClient; _fbConverter = new FacebookConverter(); }