Всем привет, я столкнулся с проблемой при написании Телеграм бота на ПХП без библиотек, буду очень признателен Вашей помощи или подсказкам. Заранее извиняюь за свой код, так как в нем думаю будет не особо приятно разбираться.
Сначала опишу вкратце как у меня работает бот, и после перейду непосредственно к самой проблеме.
Получаю инфу через 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), либо нажмите кнопку <Без ограничений>". И в дальнейшем будет еще пару подомных вопросов на протяжении всего опросника.
Скрин этого вопроса:
Проблема заключается в том что я не знаю как можно обработать текстовый ввод(то есть ценовой диапазон который пользователь должен ввести), чтобы сохранить его в нужный столбец в БД.
Самая последняя попытка была реализовать это все через таблицу типа очередей. На этапе этого вопроса я создавал запись в таблицу с 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;
}