Уточнение часового пояса
Это часть серии статей, посвященной созданию бота для отправки напоминаний через сервис $pushgate
.
- Уточнение часового пояса (вы находитесь здесь)
- Создание напоминаний
- Отмена напоминаний
Создание проекта
Перейдите в JAICP и создайте новый проект из системного шаблона Проект для CailaPub, после чего перейдите в раздел Редактор.
Мы будем работать только с файлом main.sc
. Очистите его содержимое, оставив только:
- подключение файла
slotFilling.sc
из системного модуляzb-common
; - объявление корневой темы
/
, в которой будут находиться все стейты этого сценария; - стейт
CatchAll
для обработки нераспознанных реплик в глобальном контексте.
require: slotfilling/slotFilling.sc
module = sys.zb-common
theme: /
state: CatchAll || noContext = true
event!: noMatch
random:
a: Прошу прощения, я вас не понял.
a: Извините, я не совсем вас понимаю.
Подключение справочника городов
Теоретически клиенты могут общаться с ботом из любой точки мира. Бот должен знать, в каком часовом поясе находится клиент, чтобы устанавливать напоминания на корректные дату и время. Поэтому прежде чем начать диалог, необходимо выяснить часовой пояс клиента, а проще всего узнать его по городу.
Воспользуемся справочником городов, который предоставляет системный модуль zb-common
. В значении каждый элемент справочника содержит поле timezone
— строку, которая обозначает соответствующий городу часовой пояс в формате спецификации Java. Подключите справочник при помощи тега require
:
require: city/city.sc
module = sys.zb-common
$City
для распознавания городов в запросах клиента.Вступительная часть сценария
Теперь приступим к разработке точки входа в сценарий.
state: Start || modal = true
q!: $regex</start>
a: Здравствуйте! Я ваш личный бот-планировщик.
random:
a: Не могли бы вы уточнить, в каком городе вы находитесь?
a: Могу ли я предварительно узнать, в каком вы городе?
state: GetCity
q: * $City *
script:
$reactions.setClientTimezone($parseTree._City.timezone);
random:
a: Благодарю! Я готов к работе.
a: Спасибо! Теперь я в вашем распоряжении.
go: /
state: CatchAll || noContext = true
event: noMatch
random:
a: Простите, но я не смогу правильно работать, не узнав, где вы находитесь.
a: Прощу прощения, но без ориентации в пространстве я как без рук.
Рассмотрим поведение бота, которое реализует данный фрагмент сценария:
В начальном стейте
Start
бот представляется и запрашивает у клиента город. Поскольку стейту присвоен флагmodal
, из него можно попасть только во вложенные стейты:GetCity
иCatchAll
.Стейт
CatchAll
служит для обработки нераспознанных реплик в данном локальном контексте. Для него установлен флагnoContext
, поэтому при попадании контекст не будет меняться.подсказкаВ сумме это означает, что клиент не сможет продолжить диалог с ботом, пока не назовет город.В стейте
GetCity
бот извлекает из запроса город при помощи именованной сущности$City
и передает значение часового пояса для города в метод$reactions.setClientTimezone
.После установки часового пояса бот выходит из контекста модального стейта
/Start
в корневую тему/
, что дает возможность продолжить диалог по инициативе клиента.
Тестирование сценария
Запустите тестовый виджет по кнопке и убедитесь в работоспособности сценария:
Теперь, когда часовой пояс известен боту, мы можем приступить к реализации планирования и обработки напоминаний.