コード例 #1
0
 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);
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        private ProcessResult ProcessMessageFromTrainer(int userid, string text)
        {
            // Обработка команд отмены и размера
            if (text == "отмена")
            {
                vk.SendMessage(userid, "Режим обучения отключён");
                CallUsersGridUpdate(new UsersGridUpdateEventArgs("LearningNow", userid, "No"));
                Trainers.Remove(userid);
                WaitAnswersFor.Remove(userid);
                return(ProcessResult.Processed);
            }
            if (text == "размер")
            {
                long memory, patterns, answers;
                memory   = GetObjectSize(CustomAnswers);
                patterns = CustomAnswers.Keys.Count;
                answers  = CustomAnswers.Sum(p => p.Value.Count);
                vk.SendMessage(userid, $"Текущий размер базы данных:\n\nЗанятая память: {memory / 1024f}Kb\nКоличество фраз: {patterns}\nКоличество ответов: {answers}");
                return(ProcessResult.Processed);
            }
            if (text.StartsWith("неотвечен") || text.StartsWith("не отвечен"))
            {
                if (NotAnswered.Count < 10)
                {
                    vk.SendMessage(userid, string.Join("\r\n", NotAnswered));
                }
                else
                {
                    vk.SendMessage(userid, string.Join("\r\n", NotAnswered.Take(10)) + "\r\nИ ещё " + (NotAnswered.Count - 10));
                }
            }
            if (text == "ответ")
            {
                if (NotAnswered.Count == 0)
                {
                    vk.SendMessage(userid, "К сожалению, на данный момент нет неотвеченных фраз. Но вы можете добавить свою ;)");
                    return(ProcessResult.Processed);
                }

                var phrase = NotAnswered.First(); // FIXME
                WaitAnswersFor[userid] = phrase;
                vk.SendMessage(userid, phrase);
                return(ProcessResult.Processed);
            }

            // Разделение сообщения на строки
            var strings = text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);

            // Добавление ответов на существующую фразу
            if (WaitAnswersFor.ContainsKey(userid))
            {
                var pattern = WaitAnswersFor[userid];
                NotAnswered.Remove(pattern);
                Tab.Invoke((Action)(() => Tab.listBoxNotAnswered.Items.Remove(pattern)));
                AddAnswer(pattern, strings, userid);
                return(ProcessResult.Processed);
            }

            // Проверка на ошибки ввода
            if (!CheckCorrect(strings, userid))
            {
                return(ProcessResult.Processed);
            }

            // Добавление фразы
            return(AddAnswer(strings.First(), strings.Skip(1), userid));
        }