Хочу сделать так, чтобы бот задавал 4 вопроса подряд, а ответами на них были 4 кнопки.
<?php
const TOKEN = 'TOKEN';
const BASE_URL = 'https://api.telegram.org/bot';
$update = json_decode(file_get_contents('php://input'), JSON_OBJECT_AS_ARRAY);
function sendRequest(string $method, array $params = []) : array {
if(!empty($params))
$url = BASE_URL . TOKEN . '/' . $method . '?' . http_build_query($params);
else
$url = BASE_URL . TOKEN . '/' . $method;
return json_decode(file_get_contents($url), JSON_OBJECT_AS_ARRAY);
}
function stop(){
die;
}
function generateKeyboard(string $numberquestion, string $callback_data) : array{
return ['inline_keyboard' => [
[
['text' => 'Ответ 1', 'callback_data' => $numberquestions . ' Ответ 1\n' . $callback_data],
['text' => 'Ответ 2', 'callback_data' => $numberquestions . ' Ответ 2\n' . $callback_data], //Первый ряд кнопок
],[
['text' => 'Ответ 3', 'callback_data' => $numberquestions . ' Ответ 3\n' . $callback_data],
['text' => 'Ответ 4', 'callback_data' => $numberquestions . ' Ответ 4\n' . $callback_data], //Второй ряд кнопок
]
]
];
}
//Если обратный вызов, то создаём клавиатуру под конкретный вопрос.
if(array_key_exists("callback_query", $update)){
$keyboard;
$questions;
switch($update["callback_query"]["data"][0]){
case '1':
$keyboard = generateKeyboard('2', $update["callback_query"]['data']);
$questions = '2';
break;
case '2':
$keyboard = generateKeyboard('3', $update["callback_query"]['data']);
$questions = '3';
break;
case '3':
$keyboard = generateKeyboard('3', $update["callback_query"]['data']);
$questions = '4';
break;
default:
sendRequest('sendMessage', [
'chat_id' => $update["callback_query"]["message"]["chat"]["id"],
'text' => "Ответы на все вопросы:\n"
]);
break;
}
sendRequest('sendMessage',[
'chat_id' => $update["callback_query"]["message"]["chat"]["id"],
'text' => 'Вопрос ' . $questions,
'reply_markup' => json_encode($keyboard)
]);
stop();
}
//Выдаём самую первую клавиатуру
$keyboard =
['inline_keyboard' => [
[
['text' => 'Ответ 1', 'callback_data' => '1 Ответ 1\n'],
['text' => 'Ответ 2', 'callback_data' => '1 Ответ 2\n'], //Первый ряд кнопок
],[
['text' => 'Ответ 3', 'callback_data' => '1 Ответ 3\n'],
['text' => 'Ответ 4', 'callback_data' => '1 Ответ 4\n'], //Второй ряд кнопок
]
]
];
sendRequest(
'sendMessage',
[
'chat_id' => $update["message"]["chat"]["id"],
'text' => 'Вопрос 1',
'reply_markup' => json_encode($keyboard),
]);
?>
Первая клавиатуру выдаётся в любом случае, а потом когда появятся обратный вызов, то создаём клавиатуру с соответствующем номером вопроса. Чтобы определить какой номер выдавать смотрю на первый символ - $update["callback_query"]["data"][0]. Первая клавиатура обратным вызовом возвращает '1 ответ 1\n'. Потом эти данные передаются в вторую клавиатуру, которая уже передаст '2 ответ 1\n1 ответ 1\n' Если первый символ 1, значит выдаём вопрос 2, первый 2 - значит 3.
Логика очень топорная, но мне бы сейчас хоть как-нибудь реализовать.
Бот в первый раз выдал нормально клавиатуру - 1 вопрос, потом при нажатии на кнопку ответа, выдал вторую, и после это он уже перестал работать как надо. Начал выдавать действие в default, потом, даже когда пытаешься просто вызвать самую первую клавиатуру, то он её уже не выдаёт, а выдаёт default. Как сделать так, чтобы он последовательно выдавал клавиатуры?