Есть различные способы принимать дату и время с помощью бота. Если вам нужен способ, более контролируемый, чем использование системной сущности $DATETIME, вы можете принимать значения даты и времени с помощью созданных вами сущностей. Таким образом, вы сможете использовать Интенты, чтобы принимать ввод этих сущностей и проверять, все ли значения пользователей были введены.

Подготовим сценарий.

В том месте сценария, где вам нужно принимать дату, добавьте блок Текст с просьбой ввести дату в формате "20 июня". Этот блок может быть как стартовым, так и находиться в середине сценария.

К примеру, это может выглядеть так:
Здравствуйте! Я помогу вам забронировать столик в нашем ресторане.









На какую дату вы хотели бы забронировать столик? Пожалуйста, введите дату в формате "3 ноября".







Теперь в этом месте сценария нужно запрашивать дату. Для этого создадим сущности.

Создадим справочник для названия месяцев

Сохраните сценарий и перейдите на вкладку Сущности:



Создадим справочник под названием:

month





Далее, нам нужно указать название наших сущностей и их синонимы.

Будем перечислять 12 месяцев, следовательно, будет 12 сущностей. Имейте в виду, что название сущности - это то, как сущность в дальнейшем будет выводиться для пользователя для проверки ввода. И если вы хотите выводить "12 июня", то в название нужно писать не "июнь", а "июня". То есть, если вы хотите, чтобы бот писал пользователю что-то вроде "Вы хотите зарегистрировать столик на 20 декабря, верно?", то в название сущности нужно писать не "декабрь", а "декабря".

Перечислим все месяцы в родительном падеже. В синонимы напишем числовые обозначения для этих сущностей.

Нет необходимости перечислять в синонимах все склонения слова (если есть "декабря", то не нужно перечислять "декабре" и "декабрь"). Наш NLU будет автоматически распознавать другие падежные формы слова. Но вы можете перечислить написание с опечаткой, либо какое-либо необычное написание, которое могут использовать ваши пользователи.

Вот что у нас получается:



Нажмите Сохранить и вернитесь в меню сущностей.





Создадим справочник для распознавания чисел
Создадим справочник с названием:

date





В этом справочнике мы перечислим все даты с 1го по 31го числа.

Опять же, нам нужно указать названия сущностей и их синонимы. В название сущности пишите то, как хотите в дальнейшем выводить дату.

Нет необходимости перечислять все падежные формы и варианты написания с "ё". Если вы напишете в синонимы "четвертое", наш NLU также будет распознавать "четвёртое", "четвёртого" и "четвертого".

В синонимы добавим другие варианты ввода чисел.
В итоге у нас получится что-то вроде этого:



Перечислите сущности для всех чисел от 1 до 31.



И нажмите Сохранить изменения.



Добавим в сценарий блок Интенты

Вернемся на вкладку сценарий.



Чтобы принимать содержание сущностей, нам нужно использовать блок Интенты. Добавим его на тот экран, где мы запрашиваем дату.





Нажмите Создать интент:



скопируйте и вставьте:

* $date::datechoice $month::monthchoice *



также нажмите Добавить пример



скопируйте и вставьте:

* $date::datechoice[*]$month::monthchoice *



И нажмите Сохранить.

Что означает этот интент?

$date и $month - названия справочников сущностей. Нужно писать их именно так, как они написаны на вкладке Сущности.



Если в интенты написать переменную, название которой не соотвествует существующему справочнику сущностей, вы получите ошибку.

Звёздочки - это часть синтаксиса шаблонов. Они позволят принимать ввод, содержащий другие слова. Скажем, если бы в интенте мы бы написали просто $date $month, то бот бы "принимал" ввод типа "2 июня", но не принимал бы ввод типа "хорошо, 2 июня". Звёздочки позволяют нам принимать ввод пользователя, который, помимо даты, содержит другие слова. Подробнее можете почитать здесь.

$date::datechoice - такая запись означает, что то, что попадёт в справочник сущностей, будет записано в переменную $datechoice. Если пользователь введёт что-то, что соответствует синонимам сущностей, в $datechoice будет записано название сущности.

$date::datechoice[*]$month::monthchoice - [*] - этот символ позволит принимать ввод символов, например, точки, между сущностями. Например, принять ввода типа "03.12" и "03/12"

Добавим вывод даты

Если нам хочется убедиться, что бот правильно записал дату, можем выводить эту дату для проверки.

Свяжем интент с новом блоком Текст:

Вы хотели бы забронировать столик на $datechoice $monthchoice, верно?



Так как в интентах ранее мы записывали конкретную сущность из справочников $date и $month в переменные $datechoice и $monthchoice с помощью символа ::, теперь будем использовать последние переменные для вывода даты.

Обратите внимание, что выводить нужно не $date и $month, а $datechoice $monthchoice.

Добавим на этот экран блок Интенты, добавим готовые интенты Согласие и Отказ.


Добавим кнопки "да" и "нет".



Свяжите интент Отказ с экраном запроса даты:



Свяжите интент Согласие со следующим экраном с блоком Текст:

Спасибо!



Мы не будем продумывать сценарий дальше, так как наша задача в рамках данного урока - только научиться принимать дату. Далее вы можете проверять, есть ли свободные столики на данную дату, собирать другую информацию у клиента и отправлять всю полученную информацию в мессенджеры, гугл таблицу или на имейл - в зависимости от ваших потребностей.

Связь от кнопок добавлять не обязательно, так как у нас здесь уже есть интенты Согласие и Отказ, которые содержат в себе, в том числе, фразы "да" и "нет". Когда пользователь нажмет кнопку, для бота это будет работать точно так же, как если бы пользователь набрал текст кнопки. Текст попадет в интент, и отработает связь от интента.

Свяжите вариант Любая другая фраза с тем же экраном, чтобы бот не отвечал "извините, непонятно" в ответ на другие фразы, а возвращал на данный экран. В дальнейшем вы можете доработать этот сценарий и добавить другие интенты или связать "Любая другая фраза" с другим экраном.



Давайте для тестовых целей добавим на экран "Спасибо" блок Переход, который будет возвращать на экран запроса даты, чтобы мы могли в процессе тестирования проверять новые и новые даты:





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



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

Нажмите Тестировать и давайте проверим работу бота:



Если всё проходит успешно, то удалите блок Переход с экрана "Спасибо" и доработайте сценарий согласно вашим потребностям.

Например, можете обратиться к уроку Бронирование.

Работа над ошибками

Если в процессе тестирования всплывает ошибка со следующим логом:

src/main.sc:49:16 Referenced pattern $date is not definedsrc/main.sc:49:16 Referenced pattern $month is not definedsrc/main.sc:50:16 Referenced pattern $date is not definedsrc/main.sc:50:16 Referenced pattern $month is not definedDEPLOY FAILED!

Убедитесь, что в интентах у вас указаны именно те названия справочников, которые указаны на вкладке сущности.



Если в процессе вывода даты для проверки бот выдает пустое место вместо даты, например, вот так:


Убедитесь, что вы пытаетесь вывести именно ту переменную, в которую записали сущность с помощью :: в интентах.

Возможно, у вас в блоке Текст написано что-то вроде этого, что и вызывает подобное поведение. На скриншоте ниже пример неверного оформления:



Вы не можете использовать название справочника для вывода той сущности, которая в нём состоит. Нужно записывать с помощью :: конкретную сущность, которая есть в справочнике, в новую переменную.

Правильно выводить вот так:



Чтобы выводить дату правильно, обратитесь к инструкции выше и исправьте написание.

Добавим проверку на даты, которых не существует

Вы также можете добавить проверку на ввод чисел типа 31 июня, так как таких дат не существует.

Для этого от интента * $date::datechoice $month::monthchoice * добавьте связь с новым блоком Условия. В блок Условия скопируйте и вставьте следующие выражения:

$monthchoice == "февраля" && $datechoice == "30" || $datechoice == "31"

$datechoice == "31" && $monthchoice == "апреля" || $monthchoice == "июня" || $monthchoice == "сентября" || $monthchoice == "ноября"



Далее, оба эти условия свяжите со следующим блоком Текст, в котором напишите:

Но в этом месяце не бывает $datechoice-го числа... Пожалуйста, введите дату верно.

Вот что у нас получится:



На экран "Но в этом месяце не бывает..." добавьте блок Переход и свяжите его с экраном запроса даты:



Готово. Теперь, если пользователь введёт "31 июня", бот будет отвечать, что в этом месяце нет такого числа, и предлагать снова ввести дату.
Была ли эта статья полезна?
отменить
Спасибо!