autoresponder/README.md

66 lines
5.4 KiB
Markdown
Raw Normal View History

2020-05-02 01:43:10 +03:00
# Abstract autoresponder
2020-05-02 16:46:10 +03:00
Абстрактная реализация, которая позволяет создавать ботов. Боты позволяют автоматизировать взаимодействие с пользователем.
Боты позволяют автоматизировать общение с клиентами, отвечая по запрограммированию сценарию.
2020-05-02 01:43:10 +03:00
2020-05-03 02:50:36 +03:00
## Dependency
2020-05-03 02:48:22 +03:00
maven:
```
<dependency>
<groupId>org.sadtech.autoresponder</groupId>
<artifactId>autoresponder</artifactId>
<version>1.9.2-RELEASE</version>
</dependency>
```
2020-05-03 02:50:36 +03:00
## Основные понятия
2020-05-02 01:43:10 +03:00
**Unit** - некая единица сценария, по которому проходит пользователь, отправляя свои сообщения.
Каждый юнит хранит в себе ключевые слова или регулярное выражение, ссылки на следующие Unit-ы, а так же значение
приоритета и процент количества найденных ключевых слов к заданным ключевым словам. В данном модуле Unit является
абстрактным классом, так как юнит по задумке это расширяемый класс, который может не только отдавать текстовые
2020-05-02 16:46:10 +03:00
сообщения, но и, например, сохранять пользовательскую информацию, и выполнять прочие функции. Примеры наследников
2020-05-02 01:43:10 +03:00
Unit можно найти в [этом репозитории](https://github.com/uPagge/social-bot).
**Сценарий** - это связанные между собой юниты.
2020-05-03 02:50:36 +03:00
## Принцип работы
2020-05-02 01:43:10 +03:00
Для понимания рассмотрим небольшой пример по схеме изображенной ниже. Так же небольшие примеры обработки есть в тестах.
![Картинка](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.
2020-05-02 16:46:10 +03:00
Пользователь присылает боту свое первое сообщение, например, «Привет». Если сообщение удовлетворяет регулярному
2020-05-02 01:47:13 +03:00
выражению или содержит необходимое количество ключевых слов Unit1, то возвращается Unit1, то же самое относится к Unit10.
2020-05-02 01:43:10 +03:00
2020-05-02 01:47:13 +03:00
Если оба юнита удовлетворяют запросу пользователя, то будет возвращен юнит с большим приоритетом (поле priority). Если
2020-05-02 16:46:10 +03:00
приоритеты равны, то случайный Unit. В нашем примере, на первое сообщение, пользователь получил Unit1, поэтому следующее
2020-05-02 01:47:13 +03:00
сообщение пользователя будет ассоциироваться с множеством: Unit2, Unit3 и Unit4.
2020-05-02 01:43:10 +03:00
2020-05-03 02:50:36 +03:00
## Програмная реализация
2020-05-02 01:43:10 +03:00
2020-05-03 02:11:57 +03:00
Данная библиотека предназначена только на определение того, какой Unit отдавать. Для использования библиотеки необходимо
в первую очередь создать наследника класса `Unit` (самый простой вариант лежит в тестах). Следом создается объект класса
`UnitPointerService`. Он отвечает за сохранение позиции пользователя в сценарии, простыми словами он сохраняет последний
Unit, который был отправлен пользователю.
2020-05-02 01:43:10 +03:00
Далее создается объект класса `AutoResponder`. В конструктор передается `UnitPointerService` и множество юнитов, которые
будут проверяется при первом сообщении пользователя.
Далее у объекта `AutoResponder` вызывается метод `answer`, который возвращает следующий для пользователя Unit.
2020-05-03 02:50:36 +03:00
## Программные особенности
2020-05-02 01:43:10 +03:00
2020-05-03 02:23:53 +03:00
1. Существует возможность задать юнит, который будет возвращаться при отсутствии юнита, удовлетворяющего сообщению
2020-05-02 16:46:10 +03:00
пользователя (без ключевых слов, и т.п.). Для этого у объекта `AutoResponder` вызывается метод `setDefaultUnit`.
2020-05-03 02:06:41 +03:00
2. Последний юнит сценария не сохраняется в `UnitPointerService`, вместо этого происходит удаление данных о позиции
2020-05-03 02:23:53 +03:00
пользователя в сценарии, и следующее сообщение пользователя будет снова асоциироваться с начальным множеством юнитов.