Выбор пиццы
На этом шаге создадим сценарий, в котором бот будет предлагать клиенту пиццу на выбор, а затем формировать заказ.
Создание сценария
Создайте файл сценария pizza.sc в папке src.
require: pizza.csv
name = pizza
var = pizza
theme: /
state: ChoosePizza
a: Какую пиццу будем заказывать сегодня?
script:
for (var id = 1; id < Object.keys(pizza).length + 1; id++) {
var regions = pizza[id].value.region;
if (_.contains(regions, $client.city)) {
var button_name = pizza[id].value.title;
$reactions.buttons({text: button_name, transition: 'GetName'})
}
}
state: GetName
script:
$session.pizza_name = $request.query;
go!: /ChooseVariant
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
state: ChooseVariant
a: Выберите, пожалуйста, вариант:
script:
for (var id = 1; id < Object.keys(pizza).length + 1; id++) {
if ($session.pizza_name == pizza[id].value.title) {
var variations = pizza[id].value.variations;
for(var i = 0; i < variations.length; i++){
var button_name = variations[i].name + " за " + variations[i].price + " руб."
$reactions.inlineButtons({text: button_name, callback_data: variations[i].id })
}
}
}
a: Для возврата в меню выбора пиццы, нажмите "Меню"
buttons:
"Меню" -> /ChoosePizza
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
state: GetVariant
event: telegramCallbackQuery
script:
$session.pizza_id = parseInt($request.query);
go!: /ChooseQuantity
state: ChooseQuantity
a: Выберите, пожалуйста, количество:
buttons:
"1" -> ./GetQuantity
"2" -> ./GetQuantity
"3" -> ./GetQuantity
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
state: GetQuantity
script:
$session.quantity = parseInt($request.query);
$session.cart.push({name: $session.pizza_name, id: $session.pizza_id, quantity: $session.quantity});
a: Хотите ли выбрать что-нибудь еще, или перейдем к оформлению заказа?
buttons:
"Меню" -> /ChoosePizza
buttons:
"Оформить заказ" -> /Cart
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
Подключение модулей
В начале сценария под тегом require подключаем справочник pizza.csv. Здесь var = pizza указывает на то, что далее обращаться к справочнику можно по ключевому слову pizza.
require: pizza.csv
name = pizza
var = pizza
Теперь подключим сценарий pizza.sc к основному сценарию main.sc:
require: pizza.sc
Стейты
Сценарий бота состоит из следующих стейтов:
ChoosePizza— выбор пиццы из справочника.GetName— сохранение выбранного клиентом варианта.ChooseVariant— выбор вариантов приготовления пиццы.GetVariant— сохранение параметров для выбранной пиццы.ChooseQuantity— выбор количества пиццы для заказа.GetQuantity— сохранение введенного количества пиццы.
Структура сценария
ChoosePizza
На этом этапе клиент уже выбрал город, в котором он хочет заказать пиццу. Поэтому выведем из каталога список из пицц, доступных в этом городе.
state: ChoosePizza
a: Какую пиццу будем заказывать сегодня?
script:
for (var id = 1; id < Object.keys(pizza).length + 1; id++) {
var regions = pizza[id].value.region;
if (_.contains(regions, $client.city)) {
var button_name = pizza[id].value.title;
$reactions.buttons({text: button_name, transition: 'GetName'})
}
}
В скрипте стейта ChoosePizza обращаемся к справочнику pizza.csv и выбираем названия пицц, которые можно заказать в выбранном городе. Затем с помощью функции $reactions.buttons используем выбранные параметры в качестве названия кнопок и добавляем переход в стейт GetName.
GetName
Теперь сохраним выбор клиента. В скрипте стейта GetName сохраняем название выбранной пиццы в переменную $session.pizza_name. Мы сможем использовать её для получения доступа к информации о данной пицце и отображения ее названия в корзине. Затем осуществим переход в стейт ChooseVariant.
state: GetName
script:
$session.pizza_name = $request.query;
go!: /ChooseVariant
ChooseVariant
В скрипте стейта ChooseVariant, по аналогии со скриптом для выбора пиццы, создаем кнопки для выбора варианта приготовления. На этот раз воспользуемся функцией $reactions.inlineButtons. В отличие от $reactions.buttons такие кнопки отображаются внутри диалога в виде реплик бота.
state: ChooseVariant
a: Выберите, пожалуйста, вариант:
script:
for (var id = 1; id < Object.keys(pizza).length + 1; id++) {
if ($session.pizza_name == pizza[id].value.title) {
var variations = pizza[id].value.variations;
for(var i = 0; i < variations.length; i++){
var button_name = variations[i].name + " за " + variations[i].price + " руб."
$reactions.inlineButtons({text: button_name, callback_data: variations[i].id })
}
}
}
a: Для возврата в меню выбора пиццы, нажмите "Меню"
buttons:
"Меню" -> /ChoosePizza
GetVariant
В стейте GetVariant событие telegramCallbackQuery срабатывает по клику на инлайн-кнопку из стейта ChooseVariant. В скрипте сохраняем параметры пиццы в переменную $session.pizza_id. Мы сможем использовать её для получения доступа к информации о данной пицце и отображения ее в корзине. Затем осуществляем переход в стейт ChooseQuantity для выбора количества пицц.
state: GetVariant
event: telegramCallbackQuery
script:
$session.pizza_id = parseInt($request.query);
go!: /ChooseQuantity
ChooseQuantity
В стейте ChooseQuantity клиент выбирает количество пицц кликом на соответствующую кнопку и переходит в стейт GetQuantity.
state: ChooseQuantity
a: Выберите, пожалуйста, количество:
buttons:
"1" -> ./GetQuantity
"2" -> ./GetQuantity
"3" -> ./GetQuantity
GetQuantity
В скрипте стейта GetQuantity сохраняем количество выбранных пицц в переменную $session.quantity, а также добавляем выбранный вариант в корзину с помощью функции $session.cart.push.
Далее добавим две кнопки Меню и Оформить заказ. По ним будем решать, в какой стейт отправить клиента дальше: обратно в меню или к корзине для оформления заказа.
state: GetQuantity
script:
$session.quantity = parseInt($request.query);
$session.cart.push({name: $session.pizza_name, id: $session.pizza_id, quantity: $session.quantity});
a: Хотите ли выбрать что-нибудь еще, или перейдем к оформлению заказа?
buttons:
"Меню" -> /ChoosePizza
buttons:
"Оформить заказ" -> /Cart
ClickButtons
Добавим вложенный стейт ClickButtons в стейты ChoosePizza, ChooseVariant и ChooseQuantity. Он будет выполнять такую же функцию, как и в сценарии main.sc.
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
Тестирование
Протестируем результат работы сценария в Telegram. Результат запуска:
Далее перейдем к оформлению заказа.