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

Создание напоминаний

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

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

Планирование событий

Настройка интента

Для того чтобы бот понял просьбу напомнить что-либо клиенту, прежде всего необходимо поддержать соответствующий интент в CAILA. Перейдите на вкладку CAILA > Интенты и создайте интент /SetReminder:

Интент `/SetReminder`

В своем запросе клиент может как сразу назвать нужное время (напомни мне через 15 минут), так и опустить его (поставь напоминание). Для того чтобы бот обязательно уточнил у клиента время перед тем, как обработать интент в сценарии, потребуется включить слот-филлинг.

Добавьте для интента один обязательный слот duckling.time, соответствующий одноименной системной сущности Duckling, и добавьте для него несколько уточняющих вопросов, например:

  • На какое время поставить напоминание?
  • Когда мне стоит вас уведомить?

В Тренировочные фразы включите примеры как с упоминанием даты и времени, так и без него. Вместо указания конкретного времени используйте название системной сущности @duckling.time.

подсказка
После заполнения интента нажмите на кнопку Тестировать, чтобы обучить классификатор новому интенту и проверить его распознавание.
предупреждение
JAICP не поддерживает возможность корректно обрабатывать запросы наподобие напомни мне сделать уборку, где текст напоминания назван сразу. Это связано с тем, что в CAILA невозможно создать сущность, которая бы обрабатывала произвольный текст.

Разработка сценария

В сценарии нам будут полезны возможности для обработки времени, которые предоставляет библиотека Moment.js. Вы можете импортировать ее из системного модуля dateTime, объявив в начале файла main.sc следующую зависимость:

require: dateTime/moment.min.js
module = sys.zb-common

Далее продолжим разработку сценария.

state: SetReminder
intent!: /SetReminder
script:
$session.reminderTime = $parseTree["_duckling.time"];
random:
a: Уточните, что именно вам напомнить?
a: Подскажите, о чем вас следует уведомить?

state: GetReminder
event: noMatch
script:
var event = $pushgate.createEvent(
$session.reminderTime.value,
"reminderEvent",
{
text: $parseTree.text
}
);
$session.reminderId = event.id;
$temp.reminderTime = moment($session.reminderTime.value).locale("ru").calendar();
a: Хорошо! {{$temp.reminderTime}} я напомню вам «{{$parseTree.text}}».
go: /

Рассмотрим предполагаемое взаимодействие бота с клиентом:

  1. Клиент просит поставить напоминание и по интенту /SetReminder попадает в соответствующий стейт. Слот-филлинг гарантирует, что бот попадет в обработчик стейта лишь после того, как клиент назовет время напоминания. Распознанное время сохраняется в поле $session.reminderTime.

  2. Бот запрашивает у клиента текст напоминания. Поскольку ответ клиента может быть любым, для его обработки используется системное событие noMatch, которое срабатывает при любом нераспознанном вводе. Ответ клиента обрабатывается в стейте GetReminder.

  3. В обработчике стейта планируется новое событие при помощи метода $pushgate.createEvent. В качестве времени наступления события передается ранее распознанное время в формате yyyy-MM-ddTHH:mm:ss, а в объекте с дополнительными данными — распознанный текст.

  4. Метод $pushgate.createEvent возвращает объект с идентификатором созданного события, который мы сохраняем в поле $session.reminderId — позже он нам пригодится.

  5. Напоследок мы форматируем распознанное время в человекочитаемую строку на русском языке при помощи методов calendar и locale библиотеки Moment.js. Бот сообщает клиенту, что напоминание успешно создано.

Обработка входящих событий

Вторым аргументом при создании события мы передали строку reminderEvent — это название созданного события.

Для его обработки напишем стейт Remind, в котором бот будет обращаться к ранее введенному тексту через $request.rawRequest.eventData и повторять его клиенту:

state: Remind
event!: reminderEvent
random:
a: Напоминаю вам «{{$request.rawRequest.eventData.text}}».
a: Вы просили меня напомнить «{{$request.rawRequest.eventData.text}}».

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

Запустите тестовый виджет и проверьте, что события успешно планируются и приходят:

Создание напоминания
подсказка
Бот может одновременно «запомнить» произвольное число напоминаний.

На последнем шаге мы добавим в бота возможность отменять созданные напоминания до их наступления.