YaKotikTvoy
@YaKotikTvoy
Стьюдик

Как сделать, чтобы бот последовательно выдавал клавиатуру?

Хочу сделать так, чтобы бот задавал 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. Как сделать так, чтобы он последовательно выдавал клавиатуры?
64af558bce87d500693130.png
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы