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

Бронирование

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

Сценарий

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

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

| В дальнейшем вы можете дополнить прием даты и времени согласно данной инструкции. А пока же нам хватит и этого. Бот будет принимать такие значения, как «20 января 13:00».

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

Вы можете скопировать эту таблицу.

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

  1. Теперь, когда у нас есть готовая таблица, нам нужно к ней обратиться. Чтобы получать данные оттуда, воспользуемся нашим сервисом. Обратите внимание, что мы публикуем только 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

  1. От сущности $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 — формируем дату, складываем день и месяц.

  1. Далее от блока Http-запрос завершен успешно создаем блок Условие, в нем пишем: _.property($date)($result[$index]) === false

_.property — возвращает функцию, которая вернет ключ key любого переданного ей объекта. Тут мы берем первый элемент массива $result[$index] и проверяем дату $date. Если ячейка в нашей таблице пустая, функция должна вернуть false.

  1. От этого условия создаем новый экран с блоком Текст. Если условие сработает, мы можем вывести номер столика и время:

Столик: $result[$index].tableВремя: $result[$index].time

  1. На этот же экран добавляем блок Переход:

  1. От блока Переход создаем новый экран с блоком Условие. В этом условии мы увеличим нашу переменную $index на 1. Тем самым мы сможем взять следующий элемент массива: $index = $index + 1

  1. После того как мы увеличили $index, нужно проверить, есть ли в нашем массиве элемент под таким индексом. Поэтому снова создаем Условие и пишем: $index < $result.length

  1. Если условие сработает, то делаем переход на экран, где мы проверяли свободную дату.

  1. Теперь у нас получился цикл. Сделаем связь от **else **в блоке Условие. То есть, если такая дата и время заняты, берем следующий элемент для проверки.

  1. Также делаем связь от данного условия, если массив закончился и больше нет элементов. От else создаем блок Текст, в нем пишем:

Введите номер столика, который желаете забронировать.

Добавьте на этот экран блок Интенты и впишите интент:

$NUMBER

Добавляем кнопку Выбрать другое время.

  1. Далее, от системной сущности $NUMBER делаем связь на новый экран с блоком Условие:

$res = _.findWhere($result, {"number":$NUMBER})

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

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

Столик $res.table на $date в $res.time. Бронируем?

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

  1. От кнопки Отменить делаем связь на первый экран, на котором спрашиваем, на какое время пользователь хочет забронировать столик.

  2. От кнопки Бронировать создаем новый экран с блоком Текст, в котором попросим пользователя оставить номер телефона и имя.

Добавим блок Интенты* и добавим интент:

* $NAME $PHONE *и пример:

* $NAME $PHONE *

  1. После того, как пользователь введет номер телефона и имя, нам нужно отправить информацию о бронировании в нашу таблицу.

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

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

  1. Теперь мы можем по дате получить нужный адрес.

Делаем блок Http-запрос от интента $NAME $PHONE. Запрос выглядит так:

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

  • letter

$httpResponse[0][$date] — берем первый элемент массива, а он у нас всего один, и ищем по ключу букву, ключ у нас дата.

  • cell

$letter + $res.num — склеиваем строку, наша буква, которую мы получили в переменной $letter и номер строки, num — это столбец из нашей первоначальной строки.

  1. Теперь у нас есть адрес ячейки.

Дальше, нам нужно оформить запись в ячейку.

От 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.

После этого в соответствующей ячейке должна появиться галочка:

И скопируйте получившуюся ссылку:

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

  • URL — полученная выше ссылка

  • BODY:

{ "value1": "$cell", "value2": "true"}

То есть, отправляем в определенную ячейку значение true.

  1. От данного запроса делаем еще один http-запрос.

Отправим дополнительную информацию о клиенте в другую таблицу. Для этого вам нужно будет создать новую Google Таблицу, в которую будут заноситься данные о клиентах, которые забронировали столик.

И сделаем новый апплет через ifttt по данной инструкции — теперь нам нужно не добавлять запись в ячейку, а добавлять в таблицу новую строку.

Запрос выглядит так:

  • метод POST* URL — получайте во время выполнения инструкции по созданию апплета IFTTT

BODY:

{ "value1": "$NAME.name", "value2": "$PHONE", "value3": "$cell"}

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

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

На этом все, бот готов!

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