void BotFunc(BotController_Conversation botController)
 {
     for (int i = 0; i < actionsToBeExecuted.Count; i++)
     {
         if (IsFree)
         {
             return;
         }
         actionsToBeExecuted[i](botController);
     }
 }
        public void ExecuteAsync(BotController_Conversation conversationController)
        {
            WorkTask = Task.Run(() =>
            {
                workThread  = Thread.CurrentThread;
                IsExecuting = true;
                try
                {
                    BotFunc(conversationController);
                }
                catch (Exception ex)
                {
                    LastException = ex;
#if DEBUG
                    if (!(ex is BreakThreadException))
                    {
                        throw;
                    }
#endif
                }
                IsExecuting = false;
            });
        }
Esempio n. 3
0
        /// <summary>
        /// <para>Эта функция запускает поток, который проводит переадресацию между чатами.</para>
        /// <para>Очень важно понимать, что данный метод перехватит все возникающие в этом потоке ошибки и запишет их в LastException,
        /// включая ошибки из потока браузеров, которые по умолчанию должны были вылитеть в том потоках, а не в данном.
        /// </para>
        /// </summary>
        public void StartCallForwarding()
        {
            Exception lastEx = null;

            if (Status == TwoChatsHandlerStatus.Working)
            {
                lastEx = new Exception("Work has already began!");
            }
            if (Status == TwoChatsHandlerStatus.FatalError)
            {
                lastEx = new Exception("Can`t start after fatal error!");
            }
            if (Status == TwoChatsHandlerStatus.Finishing)
            {
                lastEx = new Exception("Can`t start while finishing work!");
            }
            if (lastEx == null && !(Status == TwoChatsHandlerStatus.Stopped || Status == TwoChatsHandlerStatus.Aborted))
            {
                lastEx = new Exception("Chat must be stopped before starting!");
            }

            if (lastEx != null)
            {
                Status        = TwoChatsHandlerStatus.FatalError;
                LastException = lastEx;
#if DEBUG
                throw LastException;
#endif
                return;
            }

            Status             = TwoChatsHandlerStatus.Working;
            CallForwardingTask = Task.Run(() =>
            {
                try
                {
                    CurrentDialogNumber++;
                    string folderWithCorrespondence = string.Format("{0}/cor_{1}", UsedFolder, CurrentDialogNumber);
                    string correspondenceFilePath1  = folderWithCorrespondence + "/dialog1.html",
                    correspondenceFilePath2         = folderWithCorrespondence + "/dialog2.html";
                    int msgCount1 = 0, msgCount2 = 0, msgCountWas1 = 0, msgCountWas2 = 0;
                    if (Settings.SaveСorrespondence)
                    {
                        Directory.CreateDirectory(folderWithCorrespondence);
                    }
                    int loopWithoutConversation = 0;
                    var stopwatch = new Stopwatch();
                    stopwatch.Start();
                    long elapsedMilisecondsOnLastUpdate = 0;
                    callbackArgs.ChatHandlerCallbackArgs1.IsRealPerson = Chat1.IsRealPerson;
                    callbackArgs.ChatHandlerCallbackArgs2.IsRealPerson = Chat2.IsRealPerson;

                    //throw new Exception("fok u!");
                    FindCompanions();
                    if (BotScenario != null)
                    {
                        if (BotScenario.IsExecuting)
                        {
                            throw new Exception("BotScenario is executing before start.");
                        }
                        ConversationController = new BotController_Conversation(callbackArgs);
                        BotScenario.ExecuteAsync(ConversationController);
                    }

                    while (true)
                    {
                        UpdateChatsInfo();

                        //Get new messages
                        msgCountWas1 = msgCount1; msgCountWas2 = msgCount2;
                        newMsg1      = GetNewMessages(Chat1, ref msgCount1);
                        newMsg2      = GetNewMessages(Chat2, ref msgCount2);
                        SendMessages(Chat1, newMsg2);
                        SendMessages(Chat2, newMsg1);

                        //Save correspondence
                        if (Settings.SaveСorrespondence && Directory.Exists(folderWithCorrespondence))
                        {
                            SaveMessages(newMsg1, correspondenceFilePath1, 1);
                            SaveMessages(newMsg2, correspondenceFilePath2, 2);
                        }

                        //If conversation was finished by chat users.
                        if (!isTalk1 || !isTalk2)
                        {
                            loopWithoutConversation++;
                        }
                        else
                        {
                            loopWithoutConversation = 0;
                        }
                        if (loopWithoutConversation > 5)
                        {
                            FinishConversation(false);
                        }

                        //If not send messages for 60 seconds.
                        if (stopwatch.ElapsedMilliseconds - elapsedMilisecondsOnLastUpdate > 60000)
                        {
                            if (msgCountWas1 == msgCount1 || msgCountWas2 == msgCount2)
                            {
                                FinishConversation(false);
                            }
                            msgCountWas1 = msgCount1; msgCountWas2 = msgCount2;
                            elapsedMilisecondsOnLastUpdate = stopwatch.ElapsedMilliseconds;
                        }

                        //Check msg limit
                        if (msgCount1 >= Settings.MessagesLimit || msgCount2 >= Settings.MessagesLimit)
                        {
                            FinishConversation(false);
                        }

                        //Check if not finished
                        if (Status != TwoChatsHandlerStatus.Working)
                        {
                            break;
                        }

                        MakeCallback();
                        Thread.Sleep(50);
                    }

                    if (Settings.SaveСorrespondence && Directory.Exists(folderWithCorrespondence))
                    {
                        int msgCount = (msgCount1 + msgCount2) / 2;
                        HelpFuncs.MoveDirSafety(folderWithCorrespondence, folderWithCorrespondence + "__MsgCount_" + msgCount.ToString());
                    }
                }
                catch (Exception ex)
                {
                    Status        = TwoChatsHandlerStatus.FatalError;
                    LastException = ex;
                }
                finally
                {
                    if (ConversationController != null)
                    {
                        ConversationController.IsConversationFinished = true;
                    }
                }
            });
        }
 public BotController_Chat(BotController_Conversation owner)
 {
     this.owner = owner;
 }