php telegram bot countdown timer
Делаю на php телеграм бота при помощи библиотеки Guzzle. Не удаётся реализовать стоп таймера обратного отсчёта при помощи inline_keyboard: таймер 3:00 + кнопка "стоп". Таймер работает обновляя это же сообщение с кнопкой:
if ($callback == "stop timer") {
file_put_contents('timer.txt', 1);
$bot->sendMessageCallbackUpdate("timer stopped", [[["text"=>"new button", "callback_data"=>"new data"]]]);
} else if ($callback == $timer) {
file_put_contents('timer.txt', 0);
$time = 180;
$min = floor($time/60);
$sec = $time % 60;
for ($min; $min >= 0; $min--) {
for ($sec; $sec >= 0; $sec--) {
if (file_get_contents('timer.txt') == 1) { //Даже такой костыль не работает
$bot->sendMessageCallbackUpdate("timer stopped", [[["text"=>"new button", "callback_data"=>"new data"]]]);
break 2;
}
sleep(1);
$text = sprintf("timer: %'.02d:%'.02d", $min, $sec);
$bot->sendMessageCallbackUpdate($text, [[["text"=>"stop", "callback_data"=>"stop timer"]]]);
}
$sec = 59;
}
}
$callback не начинает обрабатываться снова, пока не закончится весь цикл с функцией sleep(), а уже потом изменяет и сообщение с кнопкой, и файл.
При этом, если сделать подобную реализацию через прямое сообщение в чате - файл изменится, таймер остановится.
Но можно ли остановить таймер кнопкой в этом же сообщении? Или подскажите другую реализацию, пожалуйста.
Ответы (1 шт):
Поправка: через прямое сообщение в чате - файл изменится, таймер остановится.
Останавливается не каждый раз, особенно если прошло несколько циклов. Пока таймер не дойдёт до конца - новые команды бот исполнять не будет.
Я додумался до того, что нужно запустить таймер в новом процессе асинхронно, якобы sleep() замораживает весь скрипт. Но потом подумал - ведь новые вебхуки от телеграма должны приходить асинхронно и без того? Есть сообщение от юзера - вебхук открывает скрипт и исполняет его построчно.
Так почему цикл со sleep() мешает исполнить новый запрос боту? А что если для одного юзера бота висит sleep(), то и все остальные будут ждать?
Я в полном замешательстве, не знаю уже и куда копать. Дайте хоть какое-то направление.