Beispiel #1
0
        public void SendMessageToUnread(AccountViewModel account, FriendData friend)
        {
            const string functionName = "Ответ на непрочитанные сообщения";

            if (friend.Deleted || friend.DialogIsCompleted)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Друг {0}({1}) удален, либо переписка с ним закончилась.", friend.FriendName, friend.FacebookId));
                return;
            }

            if (account.GroupSettingsId == null)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Не указана группа настроек."));
                return;
            }

            var friendIsBlocked = _friendsBlackListManager.CheckForFriendBlacklist(friend.FacebookId, (long)account.GroupSettingsId);

            if (friendIsBlocked)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Друг {0}({1}) находится в черном списке.", friend.FriendName, friend.FacebookId));
                return;
            }

            var message = String.Empty;

            var messageData = friend.MessageRegime == MessageRegime.BotFirstMessage
            ? _messageManager.GetAllMessagesWhereBotWritesFirst(account.Id)
            : _messageManager.GetAllMessagesWhereUserWritesFirst(account.Id);

            _notice.AddNotice(functionName, account.Id, string.Format("Загружаем сообщения для ответа"));

            if (messageData.Count == 0)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("У данного пользователя нет сообщений для ответа"));
                return;
            }

            var numberLastBotMessage = _messageManager.GetLasBotMessageOrderNumber(messageData, account.Id);

            //

            var lastFriendMessages = _facebookMessageManager.GetLastFriendMessageModel(account.Id, friend.Id);

            if (lastFriendMessages == null)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Возникла ошибка при ответе. Сообщение друга не найдено в базе."));
                return;
            }

            var lastBotMessage = _facebookMessageManager.GetLastBotMessageModel(account.Id, friend.Id);

            int orderNumber;

            if (lastBotMessage != null && lastFriendMessages.OrderNumber == lastBotMessage.OrderNumber && lastFriendMessages.MessageDateTime > lastBotMessage.MessageDateTime)
            {
                orderNumber = lastFriendMessages.OrderNumber + 1;
            }
            else
            {
                orderNumber = lastFriendMessages.OrderNumber;
            }

            if (orderNumber == 1 && friend.MessageRegime == null)
            {
                new ChangeMessageRegimeCommandHandler(new DataBaseContext()).Handle(new ChangeMessageRegimeCommand
                {
                    AccountId     = account.Id,
                    FriendId      = friend.Id,
                    MessageRegime = MessageRegime.UserFirstMessage
                });

                friend.MessageRegime = MessageRegime.UserFirstMessage;
            }

            _notice.AddNotice(functionName, account.Id, string.Format("Сверяем сообщение друга со стоп-словами"));

            var emergencyFactor = _stopWordsManager.CheckMessageOnEmergencyFaktor(lastFriendMessages);

            _notice.AddNotice(functionName, account.Id, string.Format("Получаем сообщение для ответа с порядковым номером - {0}. (Стоп-фактор - {1})", orderNumber, emergencyFactor));

            var messageModel = _messageManager.GetRandomMessage(account.Id, orderNumber, emergencyFactor, friend.MessageRegime);

            if (messageModel != null)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Подставляем значения в сообщение бота"));

                message = new CalculateMessageTextQueryHandler(new DataBaseContext()).Handle(new CalculateMessageTextQuery
                {
                    TextPattern = messageModel.Message,
                    AccountId   = account.Id,
                    FriendId    = lastFriendMessages.FriendId,
                });
            }
            var userAgent = new GetUserAgentQueryHandler(new DataBaseContext()).Handle(new GetUserAgentQuery
            {
                UserAgentId = account.UserAgentId
            });

            if (message != String.Empty)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Отправляем сообщение"));

                new SendMessageEngine().Execute(new SendMessageModel
                {
                    AccountId     = account.FacebookId,
                    Cookie        = account.Cookie,
                    FriendId      = friend.FacebookId,
                    Message       = message,
                    Proxy         = _accountManager.GetAccountProxy(account),
                    UrlParameters =
                        new GetUrlParametersQueryHandler(new DataBaseContext()).Handle(new GetUrlParametersQuery
                    {
                        NameUrlParameter = NamesUrlParameter.SendMessage
                    }),
                    UserAgent = userAgent.UserAgentString
                });

                new SaveSentMessageCommandHandler(new DataBaseContext()).Handle(new SaveSentMessageCommand()
                {
                    AccountId       = account.Id,
                    FriendId        = friend.FacebookId,
                    OrderNumber     = orderNumber,
                    Message         = message,
                    MessageDateTime = DateTime.Now,
                });

                _notice.AddNotice(functionName, account.Id, string.Format("Сообщение пользователю {0}({1}) отправлено", friend.FriendName, friend.FacebookId));
            }

            if (messageData == null || orderNumber < numberLastBotMessage)
            {
                return;
            }

            if (account.GroupSettingsId == null)
            {
                return;
            }

            _notice.AddNotice(functionName, account.Id, string.Format("Переписка завершена. Блокируем пользователя {0}({1})", friend.FriendName, friend.FacebookId));

            new MarkAddToEndDialogCommandHandler(new DataBaseContext()).Handle(new MarkAddToEndDialogCommand
            {
                AccountId = account.Id,
                FriendId  = friend.FacebookId
            });

            _friendManager.AddFriendToBlackList((long)account.GroupSettingsId, friend.FacebookId);
        }
Beispiel #2
0
        public void SendMessageToUnanswered(AccountViewModel account, FriendData friend)
        {
            const string functionName = "Ответ на неотвеченные сообщения";

            if (friend.DialogIsCompleted || friend.Deleted)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Друг {0}({1}) удален, либо переписка с ним закончилась.", friend.FriendName, friend.FacebookId));
                return;
            }

            if (account.GroupSettingsId == null)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Не указана группа настроек."));
                return;
            }

            var friendIsBlocked = _friendsBlackListManager.CheckForFriendBlacklist(friend.FacebookId, (long)account.GroupSettingsId);

            if (friendIsBlocked)
            {
                _notice.AddNotice(functionName, account.Id, string.Format("Ошибка! Друг {0}({1}) находится в черном списке.", friend.FriendName, friend.FacebookId));
                return;
            }

            var allMessages = new GetFriendMessagesQueryHandler(new DataBaseContext()).Handle(new GetFriendMessagesQuery()
            {
                AccountId = account.Id,
                FriendId  = friend.Id
            });

            var lastBotMessages =
                allMessages.Where(data => data.MessageDirection == MessageDirection.ToFriend)
                .OrderByDescending(data => data.OrderNumber)
                .FirstOrDefault();

            if (lastBotMessages == null)
            {
                return;
            }

            _notice.AddNotice(functionName, account.Id, string.Format("Получаем экстра-сообщение"));

            var messageModel = _messageManager.GetRandomExtraMessage();

            if (messageModel == null)
            {
                return;
            }

            var message = new CalculateMessageTextQueryHandler(new DataBaseContext()).Handle(new CalculateMessageTextQuery
            {
                TextPattern = messageModel.Message,
                AccountId   = account.Id,
                FriendId    = friend.FacebookId
            });

            _notice.AddNotice(functionName, account.Id, string.Format("Отправляем экстра сообщение - '{0}'", message));

            var userAgent = new GetUserAgentQueryHandler(new DataBaseContext()).Handle(new GetUserAgentQuery
            {
                UserAgentId = account.UserAgentId
            });

            new SendMessageEngine().Execute(new SendMessageModel
            {
                AccountId     = account.FacebookId,
                Cookie        = account.Cookie,
                FriendId      = friend.FacebookId,
                Message       = message,
                Proxy         = _accountManager.GetAccountProxy(account),
                UrlParameters =
                    new GetUrlParametersQueryHandler(new DataBaseContext()).Handle(new GetUrlParametersQuery
                {
                    NameUrlParameter = NamesUrlParameter.SendMessage
                }),
                UserAgent = userAgent.UserAgentString
            });

            new SaveSentMessageCommandHandler(new DataBaseContext()).Handle(new SaveSentMessageCommand()
            {
                AccountId       = account.Id,
                FriendId        = friend.FacebookId,
                OrderNumber     = lastBotMessages.OrderNumber,
                Message         = message,
                MessageDateTime = DateTime.Now,
            });

            _notice.AddNotice(functionName, account.Id, string.Format("Отправка экстра сообщения завершена"));
        }