Бронирование
Сделаем чат-бота, который будет уметь бронировать места. Для примера возьмем бронирование столиков. Бот будет уметь принимать дату и время, показывать свободные столики на указанную дату, давать пользователю выбрать нужный столик, записывать пользователя в базу данных.
Сценарий
Как это работает
- Создаем первый экран. Добавляем блок Текст с приветствием и просьбой ввести дату и время. Ниже добавляем блок Интенты, и добавим нашу системную сущность $DATETIME.
| В дальнейшем вы можете дополнить прием даты и времени согласно данной инструкции. А пока же нам хватит и этого. Бот будет принимать такие значения, как «20 января 13:00».
- После того, как пользователь ввел дату и время, нам нужно будет обратиться к нашей базе данных и проверить, есть свободные столики или нет. В качестве базы данных используем Google Таблицы. Таблица будет выглядеть так:
Вы можете скопировать эту таблицу.
Первый столбец таблицы — время (time), далее название столика (table), номер столика (number), номер строки (num) — будет нужен при записи данных в нашу таблицу, дата.
- Теперь, когда у нас есть готовая таблица, нам нужно к ней обратиться. Чтобы получать данные оттуда, воспользуемся нашим сервисом. Обратите внимание, что мы публикуем только 1 лист. В итоге получится URL такого вида:
https://tools.aimylogic.com/api/csv2json?url=https%3A%2F%2Fdocs.google.com%2Fspreadsheets%2Fd%2Fe%2F2PACX-1vT7n6-f8i4fD0Dlithvh06d5UsffCrZ6fl8O4CE_UVYPxN3rMy2NJkwRlllDs2g3IhsfCV3cY270H4k%2Fpub%3Fgid%3D0%26single%3Dtrue%26output%3Dcsv
- От сущности $DATETIME делаем новый экран с блоком Http-запрос и вставляем туда наш URL. Выглядеть запрос будет так. Под изображением вы найдете описание запроса, которое можете скопировать.
Разберем переменные, которые мы создаем в http-запросе на вкладке Response: * time
$DATETIME.hour + ":" + "00"
` — берем из DATETIME только часы и прибавляем строку «00», чтобы часы соответствовали формату, который у нас в таблице;
result
_.where($httpResponse, {"time": $time})
— метод из библиотеки Underscore;
index
0
— нужен для прохода по всем элементам массива в дальнейшем;
day
$DATETIME.day < 10 ? "0" + $DATETIME.day : $DATETIME.day
— пишем условие: если день меньше 10, то прибавляем к дню 0, чтобы формат дня был таким, как в нашей таблице, иначе оставляем день таким, какой пришел;
month
$DATETIME.month < 10 ? "0" + $DATETIME.month : $DATETIME.month
— то же самое, что и с переменной $day, только месяц;
date
$day + "." + $month
— формируем дату, складываем день и месяц.
- Далее от блока Http-запрос завершен успешно создаем блок Условие, в нем пишем:
_.property($date)($result[$index]) === false
_.property
— возвращает функцию, которая вернет ключ key
любого переданного ей объекта. Тут мы берем первый элемент массива $result[$index]
и проверяем дату $date
. Если ячейка в нашей таблице пустая, функция должна вернуть false
.
- От этого условия создаем новый экран с блоком Текст. Если условие сработает, мы можем вывести номер столика и время:
Столик: $result[$index].tableВремя: $result[$index].time
- На этот же экран добавляем блок Переход:
- От блока Переход создаем новый экран с блоком Условие. В этом условии мы увеличим нашу переменную $index на 1. Тем самым мы сможем взять следующий элемент массива:
$index = $index + 1
- После того как мы увеличили $index, нужно проверить, есть ли в нашем массиве элемент под таким индексом. Поэтому снова создаем Условие и пишем:
$index < $result.length
- Если условие сработает, то делаем переход на экран, где мы проверяли свободную дату.
- Теперь у нас получился цикл. Сделаем связь от **else **в блоке Условие. То есть, если такая дата и время заняты, берем следующий элемент для проверки.
- Также делаем связь от данного условия, если массив закончился и больше нет элементов. От else создаем блок Текст, в нем пишем:
Введите номер столика, который желаете забронировать.
Добавьте на этот экран блок Интенты и впишите интент:
$NUMBER
Добавляем кнопку Выбрать другое время.