Бронирование
Сделаем чат-бота, который будет уметь бронировать места. Для примера возьмем бронирование столиков. Бот будет уметь принимать дату и время, показывать свободные столики на указанную дату, давать пользователю выбрать нужный столик, записывать пользователя в базу данных.
Сценарий
Как это работает
- Создаем первый экран. Добавляем блок Текст с приветствием и просьбой ввести дату и время. Ниже добавляем блок Интенты, и добавим нашу системную сущность $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
Добавляем кнопку Выбрать другое время.
- Далее, от системной сущности $NUMBER делаем связь на новый экран с блоком Условие:
$res = _.findWhere($result, {"number":$NUMBER})
Тут мы по номеру, который ввел пользователь, проверяем, есть ли такой столик. Если пользователь ввел номер столика, которого нет в списке, то вернем его на предыдущий экран.
Если же такой номер есть, то сделаем новый экран на котором выведем пользователю информацию перед бронированием. Добавляем блок Текст:
Столик $res.table на $date в $res.time. Бронируем?
Также добавим кнопки:
От кнопки Отменить делаем связь на первый экран, на котором спрашиваем, на какое время пользователь хочет забронировать столик.
От кнопки Бронировать создаем новый экран с блоком Текст, в котором попросим пользователя оставить номер телефона и имя.
Добавим блок Интенты* и добавим интент:
* $NAME $PHONE *
и пример:
* $NAME $PHONE *
- После того, как пользователь введет номер телефона и имя, нам нужно отправить информацию о бронировании в нашу таблицу.
Чтобы отправить метку «занято» в нужную ячейку, необходимо знать этот адрес ячейки. Для этого делаем дополнительный лист в нашей таблице, выглядит он так:
Снова публикуем эту страницу с помощью нашего сервиса.
- Теперь мы можем по дате получить нужный адрес.
Делаем блок Http-запрос от интента $NAME $PHONE. Запрос выглядит так:
Тут мы создали две переменные:
letter
$httpResponse[0][$date]
— берем первый элемент массива, а он у нас всего один, и ищем по ключу букву, ключ у нас дата.
cell
$letter + $res.num
— склеиваем строку, наша буква, которую мы получили в переменной $letter и номер строки, num — это столбец из нашей первоначальной строки.
- Теперь у нас есть адрес ячейки.
Дальше, нам нужно оформить запись в ячейку.
От http-запроса Завершен успешно делаем новый http-запрос, в котором отправляем значение true в нужную ячейку. Это будет значить, что на эту дату столик будет занят. Чтобы отправить данные в нужную ячейку, нужно создать апплет через IFTTT.
Вам нужно пройти шаги, которые описаны в этой инструкции до шага 9. На шаге 9 у вас должны быть такие настройки:
В итоге настройки апплета будут выглядеть так:
Drive folder path — укажите папку на вашем Google диске. Например, можете в корне Google диска создать папку под названием «Work» и тогда в поле Drive folder path вам нужно просто указать Work
. Spreadsheet name — переместите в созданную папку на Google диске Google Таблицу, которую вы заполняли в этом уроке. Укажите в поле Spreadsheet name название таблицы. Which cell? — Value1
Value — Value2
После этого перейдите на https://ifttt.com/maker_webhooks, нажмите Documentaion и заполните эту ячейку названием ивента:
Чтобы протестировать, вы можете в поле value1
ввести значение ячейки какой-нибудь не отмеченной флажком ячейки, например, E2
.
В value2
напишите:
true
И нажмите Test It.
После этого в соответствующей ячейке должна появиться галочка:
И скопируйте получившуюся ссылку:
- В инструкции вы должны были получить адрес вебхука. После того, как мы получили нужный адрес, куда мы можем отправить данные, сделаем такой запрос:
метод POST
URL — полученная выше ссылка
BODY:
{ "value1": "$cell", "value2": "true"}
То есть, отправляем в определенную ячейку значение true
.
- От данного запроса делаем еще один http-запрос.
Отправим дополнительную информацию о клиенте в другую таблицу. Для этого вам нужно будет создать новую Google Таблицу, в которую будут заноситься данные о клиентах, которые забронировали столик.
И сделаем новый апплет через ifttt по данной инструкции — теперь нам нужно не добавлять запись в ячейку, а добавлять в таблицу новую строку.
Запрос выглядит так:
- метод POST* URL — получайте во время выполнения инструкции по созданию апплета IFTTT
BODY:
{ "value1": "$NAME.name", "value2": "$PHONE", "value3": "$cell"}
- То есть, тут мы отправим имя, номер телефона и адрес ячейки нашей основной таблицы. Новая таблица будет выглядеть так:
- От этого запроса Завершен успешно делаем новый экран с блоком Текст, в котором пишем пользователю информацию о том, что бронирование успешно выполнено.
На этом все, бот готов!
Вы можете добавить логику, когда пользователь может посмотреть, на какие даты свободны столики, и на какое время в этот день свободны столики.