Сделаем чатбота, который будет уметь бронировать места. Для примера возьмем бронирование столиков. Бот будет уметь принимать дату и время, показывать свободные столики на указанную дату, давать пользователю выбрать нужный столик, записывать пользователя в базу данных.

Вы всегда можете найти шаблон этого сценария на экране создания сценариев.

Сценарий



Как это работает

Создаем первый экран. Добавляем блок Текст с приветствием и просьбой ввести дату и время. Ниже добавляем блок Фраз, напишем там один пример фраз, нашу системную сущность $DATETIME.



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



Пример таблицы.

Первый столбец таблицы — время (time), далее название столика (table), номер столика (number), номер строки (num) - будет нужен при записи данных в нашу таблицу, дата.

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

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-запрос и вставляем туда наш урл. Выглядеть запрос будет так:



Разберем переменные, которые мы создаем в http-запросе на вкладке Response:

$time = $DATETIME.hour + ":" + "00" - берем из DATETIME только часы и прибавляем строку "00", чтобы часы соответствовали формату, который у нас в таблице;

$result = _.where($httpResponse, {"time": $time}) - метод из underscorejs;

$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})



Тут мы по номеру, который ввел пользователь, проверяем, есть ли такой столик. Если пользователь ввел номер столика, которого нет в списке, то вернем его на предыдущий экран.



Если же такой номер есть, то сделаем новый экран на котором выведем пользователю информацию перед бронированием. Добавляем блок текст:



Также добавим кнопки:



От кнопки Отменить делаем связь на первый экран. От кнопки Бронировать создаем новый экран с блоком Текст, в котором попросим пользователя оставить номер телефона и имя. Добавим блок Фразы и пропишем в нём пример $NAME $PHONE



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



Снова публикуем эту страницу с помощью нашего сервиса.

Теперь мы можем по дате получить нужный адрес. Делаем блок Http-запрос от нашей последней фразы, где указали $NAME $PHONE. Запрос выглядит так:



Тут мы создали две переменные:

$letter = $httpResponse[0][$date] - берем первый элемент массива, а он у нас всего один, и ищем по ключу букву, ключ у нас дата.
$cell = $letter + $res.num - склеиваем строку, наша буква, которую мы получили в переменной $letter и номер строки, num - это столбец из нашей первоначальной строки.

Теперь у нас есть адрес ячейки. От http-запроса Завершен успешно делаем новый http-запрос, в котором отправляем значение true в нужную ячейку. Это будет значить, что на эту дату столик будет занят. Чтобы отправить данные в нужную ячейку, нужно создать апплет через ifttt. Как отправлять данные через ifttt, можно почитать тут. Учтите, что нужно будет выбрать Update cell in spreadsheet.



В итоге настройки апплета будут выглядеть так:



После того, как мы получили нужный адрес, куда мы можем отправить данные, сделаем такой запрос:



То есть отправляем в определенную ячейку значение true. От данного запроса делаем еще один http-запрос, отправим дополнительную информацию о клиенте в другую таблицу, сделаем новый аплет через ifttt. Запрос выглядит так:



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



От этого запроса Завершен успешно делаем новый экран с блоком Текст, в котором пишем пользователю информацию о том что бронирование успешно выполнено.



На этом все, бот готов! Вы можете добавить логику, когда пользователь может посмотреть, на какие даты свободны столики, на какое время в этот день свободны столики.

Была ли эта статья полезна?
отменить
Спасибо!