Переход по стейтам
Сценарий чат-бота описывается в виде текстового файла с древовидной структурой, где одни элементы сценария вложены в другие. Эти элементы называются стейтами — состояниями бота, в которые он может перейти в ходе диалога. Более общие стейты включают в себя стейты с более конкретной тематикой.
Случаи перехода в стейт
Переход в стейт происходит в следующих случаях:
-
Пользователь отправил запрос, который был обработан глобальным тегом
q!илиintent!, либо произошло событие, на которое сработал тегevent!. Переход по глобальному тегу возможен из любого другого стейта, за исключением модальных. -
Пользователь отправил запрос, который был обработан локальным тегом
qилиintent, либо произошло событие, на которое сработал тегevent. Переход по локальному тегу возможен только из ближайшего родительского, из соседних или дочерних стейтов. -
Запрос или событие были обработаны локальным тегом
q,intentилиeventс параметромfromStateилиtoState. Этот параметр позволяет явно указать стейт, из которого или в который возможен переход по тегу. -
В стейте сработал тег перехода в другой стейт
goилиgo!либо вызван метод$reactions.transition.
q/q! срабатывают с большим приоритетом, чем intent/intent!.
Подробнее о порядке срабатывания паттернов и интентов.Приоритет правил активации
Когда бот находится в каком-либо стейте, он может перейти из него по любому тегу активации, который может сработать из этого стейта. Теги срабатывают в определенном порядке в зависимости от расстояния от текущего до целевого стейта: наибольший приоритет имеют дочерние стейты, затем соседние, затем родительские.
Таким образом, в разных стейтах могут быть объявлены теги активации с одинаковыми значениями, но срабатывать будут разные теги в зависимости от стейта, в котором находится бот. Рассмотрим сценарий:
patterns:
$Yes = (да/конечно)
$No = (нет/не/да ну)
theme: /
state: Start
q!: $regexp</start>
go!: ../MorningExercise
state: MorningExercise
a: Ты делаешь зарядку по утрам?
state: EveryDay
q: * $Yes *
a: Каждый день?
state: Yes
q: * $Yes *
a: Молодец!
state: No
q: * $No *
a: Зарядка должна стать привычкой!
state: No
q: * $No *
a: Зарядка пробуждает тело и мозг, поработай над собой!
Сценарий демонстрирует, как обрабатываются ответы пользователя да или нет в зависимости от текущего стейта. Рассмотрим процесс выполнения этого сценария:
- Запускается сценарий, тег реакции
go!переводит диалог в стейтMorningExercise. - В стейте
MorningExerciseбот задает вопрос Ты делаешь зарядку по утрам?. - Бот оста ется в текущем стейте, в котором активны паттерны
* $Yes *и* $No *. - Пользователь отвечает да, и бот переходит в стейт
MorningExercise/EveryDay. Далее бот спрашивает Каждый день? , активируется следующий набор паттернов. - Следующий ответ пользователя интерпретируется в контексте стейта
MorningExercise/EveryDay. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.