Задать вопрос

Как обрабатывать ввод сообщения пользователя в строке вместе с callback_query в Telegram боте на PHP?

Всем привет, я столкнулся с проблемой при написании Телеграм бота на ПХП без библиотек, буду очень признателен Вашей помощи или подсказкам. Заранее извиняюь за свой код, так как в нем думаю будет не особо приятно разбираться.

Сначала опишу вкратце как у меня работает бот, и после перейду непосредственно к самой проблеме.

Получаю инфу через webhook и обрабатываю всё двумя switch-case, один для обработки сообщений от пользователя, пока что он только обрабатывает /start и второй switch-case для обработки callback_query (инлайн кнопок). Получается при нажатии на /start сообщение обрабатывается первым свитчом и сразу отправляет сообщение с инлайн кнопками и дальнейшее общение пользователя с ботом, происходит посредством выбора одной из предоставленных кнопок, так же все сохраняется в БД

Пример кода ниже без сохранения в БД:
$output = json_decode(file_get_contents('php://input'), TRUE);
$chat_id = $output['message']['chat']['id'];
$message = $output['message']['text'];
$callback_query = $output['callback_query'];
$data = $callback_query['data'];
$callback_query_id = $callback_query['id'];
$message_id = $output['callback_query']['message']['message_id'];
$message_id_message = $output['message']['message_id'];
$chat_id_in = $callback_query['message']['chat']['id'];]
//Handler of messages
switch($message) {
    case '/start':
        $button1 = ['text'=>'Almaty', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Astana', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;
}
//handler of callback_query
switch($data){
    case 'almaty':
        deleteMessage($chat_id_in, $message_id);
        deleteMessage($chat_id_in, $message_id-1);
        $inline_keyboard = [
            [
                ['text'=>'aujezovskij', 'callback_data'=>"aujezovskij"]
            ],
            [
                ['text'=>'Go back', 'callback_data'=>"goback"]
            ]
        ];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case 'astana':
        deleteMessage($chat_id_in, $message_id);
        deleteMessage($chat_id_in, $message_id-1);

        $inline_keyboard = [
            [
                ['text'=>'esilskij', 'callback_data'=>"esilskij"]
            ],
            [
                ['text'=>'Go back', 'callback_data'=>"goback"]
            ]
        ];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case "goback":
        deleteMessage($chat_id_in, $message_id);
        $button1 = ['text'=>'Almaty', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Astana', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case "aujezovskij":
    case "esilskij":
        deleteMessage($chat_id_in, $message_id);
        $inline_keyboard = [
            [
                ['text'=>'flats', 'callback_data'=>"kvartiry"]
            ],
            [
                ['text'=>'rooms', 'callback_data'=>"komnaty"]
            ],
            [
                ['text'=>'all', 'callback_data'=>"all"]
             ],
             [
                ['text'=>'Go back', 'callback_data'=>"$city"]
             ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
            sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
            break;
}

На определённом этапе, пользователю отправляется сообщение с вопросом "Напишите необходимый диапазон стоимости (пример: 80-120), либо нажмите кнопку <Без ограничений>". И в дальнейшем будет еще пару подомных вопросов на протяжении всего опросника.

Скрин этого вопроса:
604a0691db161612953181.jpeg

Проблема заключается в том что я не знаю как можно обработать текстовый ввод(то есть ценовой диапазон который пользователь должен ввести), чтобы сохранить его в нужный столбец в БД.
Самая последняя попытка была реализовать это все через таблицу типа очередей. На этапе этого вопроса я создавал запись в таблицу с chat_id + с какого именного вопроса он пришел и что то по типу статуса (ожидается или закончен). Получается в первом свитче, где до этого был только case /start я добавил case default где вытаскивал значения из бд и через if сравнивал их. Такая реализации в принципе работала за исключением того, что тогда переставали работать кнопки, так как из-за case default компилятор застревал там и не переходил во второй свитч, который обрабатывал callback_query.

Вот выдернутый кусок этого кода:
// Message handler
switch($message) {
    case '/start':
        $button1 = ['text'=>'Алматы', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Астана', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    default:
        $pdo = getPDO();
        $stmt = $pdo->prepare("
                        SELECT suspense, suspense_from from user_suspense
                        WHERE chat_id = 201502307
                    ");
        $stmt->execute();
        $status = $stmt->fetch();
        if ($status['suspense_from'] == "price" AND $status['suspense'] == 'wait'){
            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                        UPDATE users
                        SET price=:price
                        WHERE chat_id = $chat_id
                    ");
                $stmt->execute([
                    ':price' => $message
                ]);
                $stmt = $pdo->prepare("
                        UPDATE user_suspense
                        SET suspense = :suspense
                        WHERE chat_id = $chat_id
                    ");
                $stmt->execute([
                    ':suspense' => 'proceed'
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage() . "\n", FILE_APPEND);
            }
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                            SELECT suspense from user_suspense
                            WHERE chat_id = $chat_id
                        ");
                $stmt->execute();
                $status = $stmt->fetch();
            deleteMessage($chat_id, $status['chat_id_in']);
            deleteMessage($chat_id, $message_id_message);
            sendMessageNomarkup($chat_id, 'fffff');
        }
        break;
}
//Callback Query handler
switch($data){
case "price":
            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                    INSERT INTO 
                      user_suspense (chat_id)
                    VALUES (:chat_id)
                ");

                $stmt->execute([
                    ':chat_id'=> $chat_id_in
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage()."\n", FILE_APPEND);
            }

            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                        UPDATE user_suspense
                        SET suspense=:suspense, suspense_from=:suspense_from, chat_id_in=:chat_id_in
                        WHERE chat_id = $chat_id_in
                    ");

                $stmt->execute([
                    ':suspense' => 'wait',
                    ':suspense_from' => $data,
                    ':chat_id_in' => $message_id+1
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage() . "\n", FILE_APPEND);
            }
            deleteMessage($chat_id_in, $message_id);
            $inline_keyboard = [
                [
                    ['text'=>"Doesn't matter", 'callback_data'=>"commission"]
                ],
                [
                    ['text'=>'Go back', 'callback_data'=>"remont"]
                ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
            sendMessage($chat_id_in, "Write price range \n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n Example: 100-200", $replyMarkup);
        break;
}
  • Вопрос задан
  • 344 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы