diff --git a/README.md b/README.md index 368c39f..dcaacd2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,54 @@ -# autoresponder -Abstract implementation for processing text requests +# Abstract autoresponder +Абстрактная реализация, которая позволяет создавать ботов. + +### Основные понятия + +**Unit** - некая единица сценария, по которому проходит пользователь, отправляя свои сообщения. +Каждый юнит хранит в себе ключевые слова или регулярное выражение, ссылки на следующие Unit-ы, а так же значение +приоритета и процент количества найденных ключевых слов к заданным ключевым словам. В данном модуле Unit является +абстрактным классом, так как юнит по задумке это расширяемый класс, который может не только отдавать текстовые +сообщения, но и например сохранять пользовательскую информацию, и выполнять прочее функции. Примеры наследников +Unit можно найти в [этом репозитории](https://github.com/uPagge/social-bot). + +**Сценарий** - это связанные между собой юниты. + +### Принцип работы + +Для понимания рассмотрим небольшой пример по схеме изображенной ниже. Так же небольшие примеры обработки есть в тестах. + +![Картинка](https://raw.githubusercontent.com/uPagge/images/master/img/autoresponder/units.jpg) + +Сценариями в данном случае являются: + +• Unit1 —> Unit2 —> Unit5 —> Unit7 —> Unit9 +• Unit1 —> Unit2 —> Unit6 —> Unit8; +• Unit1 —> Unit3 —> Unit6 —> Unit8; +• Unit1 —> Unit4 —> Unit9; +• Unit10. + +Пользователь присылает боту свое первое сообщение, например «Привет». Если сообщение удовлетворяет регулярному +выражению или содержит необходимые ключевые слова Unit1, то возвращается Unit1, то же самое относится к Unit10. + +Если оба юнита удовлетворяют запросу пользователя, то будет возвращен юнит с большим приоритетом (поле priority). +Так как пользователь в нашем примере вызвал обработку Unit1, то следующее сообщение пользователя будет ассоциироваться +с множеством: Unit2, Unit3 и Unit4. + +### Програмная реализация + +Так как данная библиотека заточена только на определениие того, какой Unit отдавать, необходимо создать наследника +класса `Unit` (самый простой вариант лежит в тестах). Следом создается объект класса `UnitPointerService`. Он отвечает +за сохранение позиции пользователя в сценарии, простыми словами он сохраняет последний Unit, который был отправлен +пользователю. + +Далее создается объект класса `AutoResponder`. В конструктор передается `UnitPointerService` и множество юнитов, которые +будут проверяется при первом сообщении пользователя. + +Далее у объекта `AutoResponder` вызывается метод `answer`, который возвращает следующий для пользователя Unit. + +### Программные особенности + +1. Существует возможность отправлять дефолтный юнит, если не будет найден юнит удвлетворяющий сообщению пользователя ( +без ключевых слов, и т.п.). Для этого у объекта `AutoResponder` вызывается метод `setDefaultUnit`. +2. + +