Перейти к основному содержимому

Уточнение часового пояса

Это часть серии статей, посвященной созданию бота для отправки напоминаний через сервис $pushgate.

  1. Уточнение часового пояса (вы находитесь здесь)
  2. Создание напоминаний
  3. Отмена напоминаний

Создание проекта

Перейдите в 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: Прощу прощения, но без ориентации в пространстве я как без рук.

Рассмотрим поведение бота, которое реализует данный фрагмент сценария:

  1. В начальном стейте Start бот представляется и запрашивает у клиента город. Поскольку стейту присвоен флаг modal, из него можно попасть только во вложенные стейты: GetCity и CatchAll.

  2. Стейт CatchAll служит для обработки нераспознанных реплик в данном локальном контексте. Для него установлен флаг noContext, поэтому при попадании контекст не будет меняться.

    подсказка
    В сумме это означает, что клиент не сможет продолжить диалог с ботом, пока не назовет город.
  3. В стейте GetCity бот извлекает из запроса город при помощи именованной сущности $City и передает значение часового пояса для города в метод $reactions.setClientTimezone.

  4. После установки часового пояса бот выходит из контекста модального стейта /Start в корневую тему /, что дает возможность продолжить диалог по инициативе клиента.

Тестирование сценария

Запустите тестовый виджет по кнопке и убедитесь в работоспособности сценария:

Уточнение часового пояса

Теперь, когда часовой пояс известен боту, мы можем приступить к реализации планирования и обработки напоминаний.