public override ProcessResult ProcessMessage(int userid, string text)
 {
     // Обработка сообщений с обучением
     if (Trainers.Contains(userid))
     {
         return(ProcessMessageFromTrainer(userid, text));
     }
     // Обработка команды начала обучения
     else if (text.ToLower() == "учить")
     {
         Trainers.Add(userid);
         CallUsersGridUpdate(new UsersGridUpdateEventArgs("LearningNow", userid, "Yes"));
         vk.SendMessage(userid, "Добро пожаловать в режим обучения бота.\n" +
                        "В данном режиме вы можете научить меня отвечать на различные сообщения.\n" +
                        "Чтобы добавить фразы, которыми я буду отвечать на определённое сообщение, " +
                        "пришлите мне сообщение в виде: ШАБЛОН *перенос строки* ОТВЕТ. " +
                        "Ответов можно добавлять несколько, разделяя их так же переносом строки.\n" +
                        "Пример:\n\nЗДРАВСТВУЙ\nПриветик\nДобрый день\nХей! Как делишки?\n\n" +
                        "Таким образом бот будет отвечать на сообщение с текстом \"здравствуй\" одной из трёх фраз.\n" +
                        "Так же вы можете дать ответ на одну из фраз, которую писали боту, на которую он не смог ответить сам," +
                        "тем самым так же пополнив его базу данных. Для получения случайной фразы, на которую нужно дать ответ, напишите ОТВЕТ" +
                        "Ближайшее время будет добавлена возможность вводить шаблоны в виде регулярных выражений.\n" +
                        "Для выхода из режима обучения пожалуйста напишите ОТМЕНА\n\n" +
                        "Надеюсь Вы научите меня правильно отвечать. Пожалуйста, не вставляйте различные ссылки/рекламу в ответы," +
                        "или же сообщения не по теме. Злоупотребление данной функцией может привести к вашей блокировке. <3");
         return(ProcessResult.Processed);
     }
     // Ответ на фразу, ответ на которую существует
     else if (CustomAnswers.ContainsKey(text.ToLower()) || CustomAnswers.ContainsKey(text.ToLower() + '?') || CustomAnswers.ContainsKey(text.ToLower().Trim(new[] { ' ', '.', '?', '!' })))
     {
         text = text.ToLower();
         var answers = CustomAnswers.ContainsKey(text) ? CustomAnswers[text] :
                       (CustomAnswers.ContainsKey(text + '?') ? CustomAnswers[text + '?'] : CustomAnswers[text.Trim(new[] { ' ', '.', '?', '!' })]);
         var i = rnd.Next(answers.Count);
         vk.SendMessage(userid, answers[i]);
         return(ProcessResult.Processed);
     }
     // Добавление фразы в неотвеченные
     NotAnswered.Add(text);
     Tab.Invoke((Action)(() => Tab.listBoxNotAnswered.Items.Add(text)));
     return(ProcessResult.Skipped);
 }
        private ProcessResult AddAnswer(string pattern, IEnumerable <string> answers, int userid)
        {
            pattern = pattern.ToLower();

            List <string> existed = new List <string>();

            if (CustomAnswers.ContainsKey(pattern))
            {
                foreach (var ss in answers.Select(s => s.Trim()).ToArray())
                {
                    if (CustomAnswers[pattern].Select(s => s.ToLower()).Contains(ss.ToLower()))
                    {
                        existed.Add(ss);
                    }
                    else
                    {
                        CustomAnswers[pattern].Add(ss);
                    }
                }

                if (existed.Count > 0)
                {
                    vk.SendMessage(userid, $"К ответам на фразу \"{pattern}\" добавлено {answers.Count() - existed.Count} ответов.\nТекущее количество ответов на фразу = {CustomAnswers[pattern].Count}\n\nСледующие ответы не были добавлены, т.к. уже существуют:\n" + string.Join(", ", existed));
                }
                else
                {
                    vk.SendMessage(userid, $"Спасибо, теперь я умею отвечать на фразу \"{pattern}\"\nНа данную фразу у меня уже {CustomAnswers[pattern].Count} ответов!");
                }

                return(ProcessResult.Processed);
            }
            else
            {
                Tab.Invoke((Action)(() => Tab.listBox1.Items.Add(pattern)));
                CustomAnswers[pattern] = answers.Select(s => s.Trim()).ToList();
                vk.SendMessage(userid, $"Спасибо, теперь я умею отвечать на фразу \"{pattern}\"");
                return(ProcessResult.Processed);
            }
        }