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 async Task AddConversations(List <FbConversation> fbConversations) { if (!fbConversations.Any()) { return; } using (var uow = UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew)) { using (CurrentUnitOfWork.SetSiteId(_account.SiteId)) { List <SocialUser> senders = new List <SocialUser>(); List <SocialUser> receivers = new List <SocialUser>(); foreach (var fbconversation in fbConversations) { var existingConversation = _conversationService.GetUnClosedConversation(fbconversation.Id); if (existingConversation != null) { fbconversation.Messages.data = fbconversation.Messages.data.OrderBy(t => t.SendTime).ToList(); foreach (var fbMessage in fbconversation.Messages.data) { if (fbMessage.SendTime < existingConversation.LastMessageSentTime) { continue; } var sender = await _socialUserService.GetOrCreateFacebookUser(_account.Token, fbMessage.SenderId); var receiver = await _socialUserService.GetOrCreateFacebookUser(_account.Token, fbMessage.ReceiverId); Message message = _fbConverter.ConvertMessage(fbMessage, sender, receiver); message.ConversationId = existingConversation.Id; existingConversation.IfRead = false; existingConversation.Status = sender.Id != _account.SocialUser.Id ? ConversationStatus.PendingInternal : ConversationStatus.PendingExternal; existingConversation.Subject = GetSubject(message.Content); existingConversation.LastMessageSenderId = message.SenderId; existingConversation.LastMessageSentTime = message.SendTime; existingConversation.Messages.Add(message); _conversationService.Update(existingConversation); await CurrentUnitOfWork.SaveChangesAsync(); } } else { Conversation conversation = new Conversation(); conversation.OriginalId = fbconversation.Id; conversation.Source = ConversationSource.FacebookMessage; conversation.Priority = ConversationPriority.Normal; conversation.Status = ConversationStatus.New; fbconversation.Messages.data = fbconversation.Messages.data.OrderBy(t => t.SendTime).ToList(); if (fbconversation.Messages.data.All(t => t.SenderId == _account.SocialUser.OriginalId)) { continue; } foreach (var fbMessage in fbconversation.Messages.data) { var sender = await _socialUserService.GetOrCreateFacebookUser(_account.Token, fbMessage.SenderId); var receiver = await _socialUserService.GetOrCreateFacebookUser(_account.Token, fbMessage.ReceiverId); Message message = _fbConverter.ConvertMessage(fbMessage, sender, receiver); conversation.Subject = GetSubject(message.Content); conversation.LastMessageSenderId = message.SenderId; conversation.LastMessageSentTime = message.SendTime; conversation.Messages.Add(message); if (_account.ConversationAgentId.HasValue && _account.ConversationPriority.HasValue) { conversation.AgentId = _account.ConversationAgentId.Value; conversation.Priority = _account.ConversationPriority.Value; } if (_account.ConversationDepartmentId.HasValue && _account.ConversationPriority.HasValue) { conversation.DepartmentId = _account.ConversationDepartmentId.Value; conversation.Priority = _account.ConversationPriority.Value; } } _conversationService.Insert(conversation); await CurrentUnitOfWork.SaveChangesAsync(); } } uow.Complete(); } } }