Дерево сценариев в telegram-боте php

503
26 июня 2017, 20:45

Всем привет. Делаю чат-бота для телеграм. На данный момент есть многомерное меню, которое работает на callback-ах инлайнкнопок. Все бы было хорошо, но есть проблема: к примеру, человек нажимает "заказать", затем выбирает товар. Затем ему нужно ввести адрес и время доставки, а также телефон. Скажите, пожалуйста, каким образом это можно сделать? Т.е. если человек просто введет адрес доставки, то ему будет выдаваться "не выбран товар" или "ошибка", а если он выберет товар, то он пойдет по этому сценарию. Вопрос прост - как сделать сценарий? ps библиотека telegram-bot-sdk.

<?php
    DEFINE('ROOT', 'root const here');
    require_once(ROOT.'components/Db.php');
    require_once(ROOT.'models/Product.php');
    include('vendor/autoload.php'); //include telegram-bot-sdk
    use Telegram\Bot\Api; 
    use Telegram\Bot\Keyboard\Keyboard;
    use Telegram\Bot\Actions;
    use Telegram\Bot\Commands\Command;
    use Telegram\Bot\Objects\CallbackQuery;
    $telegram = new Api('api token here'); //Устанавливаем токен, полученный у BotFather
    $result = $telegram -> getWebhookUpdates(); //Передаем в переменную $result полную информацию о сообщении пользователя
    $keyboard = Keyboard::make()
    ->inline()
    ->row(
        Keyboard::inlineButton(['text' => 'Показать меню', 'callback_data' => '/show_menu']),
        Keyboard::inlineButton(['text' => 'Купить цветы', 'callback_data' => '/buyflowers'])        
    );
    $keyboard_flowers = Keyboard::make()
    ->inline()
    ->row(
        Keyboard::inlineButton(['text' => 'Розы', 'callback_data' => '/buyflowers_roses'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Пионы', 'callback_data' => '/buyflowers_piony'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Шляпные коробки', 'callback_data' => '/buyflowers_hatbox'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Коробочки со сладостями', 'callback_data' => '/buyflowers_sweetbox'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Акции и спецпредложения', 'callback_data' => '/buyflowers_sales'])
    );
    $keyboard_menu = Keyboard::make()
    ->inline()
    ->row(
        Keyboard::inlineButton(['text' => 'Связаться с нами', 'callback_data' => '/contact_us'])        
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Купить цветы', 'callback_data' => '/buyflowers'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Стать партнером', 'callback_data' => '/partner'])
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Перейти на сайт', 'url' => 'https://kands.spb.ru/']) 
    )
    ->row(
        Keyboard::inlineButton(['text' => 'Акции и спецпредложения', 'callback_data' => '/buyflowers_sales'])  
    );
    $contact = $result['message']['contact'];
    $text = $result["message"]["text"]; //Текст сообщения
    $chat_id = $result["message"]["chat"]["id"];    
    $name = $result["message"]["from"]["username"]; //Юзернейм пользователя
    if ($result->isType('callback_query')) {
        $data = $result['callback_query']['data'];
        $chat = $result['callback_query']['message']['chat']['id'];
        switch ($data) {
            case '/buyflowers':
                $telegram->sendMessage([
                    'chat_id' => $chat,
                    'text' => 'Выберите категорию:', 
                    'reply_markup' => $keyboard_flowers
                ]);
                break;
            case '/show_menu':
                $telegram->sendMessage([
                    'chat_id' => $chat,
                    'text' => 'Меню: ', 
                    'reply_markup' => $keyboard_menu
                ]);
                break;
            default:
                # code...
                break;
        }        
    }

    $telegram->sendMessage([
        'chat_id' => $chat_id,
        'text' => 'Стартовая страница. Выберите дальнейшие действия.',
        'reply_markup' => $keyboard
    ]);


?>
`
Answer 1

Используйте ForseReply при отправке сообщений с запросами адреса и пр., а затем проверяйте входящие сообщения на наличие непустого поля reply_to_message и смотрите в текст этого поля. В зависимости от его содержимого можно будет понять, какой именно шаг сценария выполняется.

Похожий вопрос на en SO

READ ALSO
Записать запросы в табличку базы данных

Записать запросы в табличку базы данных

Вопрос такой: создал табличку в ней поле 'text' в него хочу поместить текст запросов к этой же базе через точку с запятойчто-бы потом можно было...

260
Объединение UPDATE и INSERT

Объединение UPDATE и INSERT

Добрый день!

223
Логика выбора уникальных записей из mysql

Логика выбора уникальных записей из mysql

Есть таблица под названием personal043В этой таблице есть id, card_id, zubno, naimenovanie, date

215
Рекомендуете ли вы чистить память от результата запроса?

Рекомендуете ли вы чистить память от результата запроса?

Что скажете по этому поводу, до этого я не чистил памятьВ офф

196