Abstract implementation for processing text requests
Go to file
2020-05-02 01:47:13 +03:00
src Рефакторинг 2020-05-01 18:01:57 +03:00
.gitignore Логирование и связь с БД 2018-12-21 23:14:50 +03:00
.gitmodules Удаление субмодуля 2019-01-09 19:00:18 +03:00
LICENSE Добавление лицензии BSD 2019-06-15 18:18:04 +03:00
pom.xml bugfix 2020-05-01 17:32:25 +03:00
README.md readme 2020-05-02 01:47:13 +03:00

Abstract autoresponder

Абстрактная реализация, которая позволяет создавать ботов.

Основные понятия

Unit - некая единица сценария, по которому проходит пользователь, отправляя свои сообщения. Каждый юнит хранит в себе ключевые слова или регулярное выражение, ссылки на следующие Unit-ы, а так же значение приоритета и процент количества найденных ключевых слов к заданным ключевым словам. В данном модуле Unit является абстрактным классом, так как юнит по задумке это расширяемый класс, который может не только отдавать текстовые сообщения, но и например сохранять пользовательскую информацию, и выполнять прочее функции. Примеры наследников Unit можно найти в этом репозитории.

Сценарий - это связанные между собой юниты.

Принцип работы

Для понимания рассмотрим небольшой пример по схеме изображенной ниже. Так же небольшие примеры обработки есть в тестах.

Картинка

Сценариями в данном случае являются:

• Unit1 —> Unit2 —> Unit5 —> Unit7 —> Unit9
• Unit1 —> Unit2 —> Unit6 —> Unit8;
• Unit1 —> Unit3 —> Unit6 —> Unit8;
• Unit1 —> Unit4 —> Unit9;
• Unit10.

Пользователь присылает боту свое первое сообщение, например «Привет». Если сообщение удовлетворяет регулярному выражению или содержит необходимое количество ключевых слов Unit1, то возвращается Unit1, то же самое относится к Unit10.

Если оба юнита удовлетворяют запросу пользователя, то будет возвращен юнит с большим приоритетом (поле priority). Если приоритеты равны, то рандомный Unit. В нашем примере, на первое сообщение, пользователь получил Unit1, поэтому следующее сообщение пользователя будет ассоциироваться с множеством: Unit2, Unit3 и Unit4.

Програмная реализация

Данная библиотека заточена только на определениие того, какой Unit отдавать, необходимо создать наследника класса Unit (самый простой вариант лежит в тестах). Следом создается объект класса UnitPointerService. Он отвечает за сохранение позиции пользователя в сценарии, простыми словами он сохраняет последний Unit, который был отправлен пользователю.

Далее создается объект класса AutoResponder. В конструктор передается UnitPointerService и множество юнитов, которые будут проверяется при первом сообщении пользователя.

Далее у объекта AutoResponder вызывается метод answer, который возвращает следующий для пользователя Unit.

Программные особенности

  1. Существует возможность отправлять дефолтный юнит, если не будет найден юнит удвлетворяющий сообщению пользователя ( без ключевых слов, и т.п.). Для этого у объекта AutoResponder вызывается метод setDefaultUnit.