Кулдаун для всех сообщений и команд в Telegram-боте
Хочу реализовать в Telegram-боте кулдаун (задержку) после любого входящего сообщения или команды.
Требуется, чтобы после ввода любой команды или текста бот не принимал ничего от пользователя в течение 4 секунд и отвечал сообщением с оставшимся временем ожидания, например: Подожди 3 сек...
Это касается как команд @bot.message_handler(commands=...), так и обычных текстовых сообщений @bot.message_handler(func=...).
Как лучше всего реализовать такую задержку?
Ответы (1 шт):
Как вариант, храните в словаре время следующего разрешённого запроса для каждого пользователя. При каждом сообщении сравнивайте текущее время с разрешённым — если пользователь ещё на "кулдауне", выводите оставшееся время ожидания.
И небольшой пример для вас:
import telebot
import time
API_TOKEN = "TOKEN"
bot = telebot.TeleBot(API_TOKEN)
# {user_id : time}, когда можно снова отправлять
user_access_time = {}
COOLDOWN_SECONDS = 4
@bot.message_handler(func=lambda message: True)
def handle_all(message):
user_id = message.from_user.id
now = time.time()
access_time = user_access_time.get(user_id, 0)
# Текущее время должно быть больше запретного (Условно 16:12 < 16:11)
if now < access_time:
remaining = int(access_time - now)
bot.send_message(message.chat.id, f"Подожди {remaining} сек...")
return
# Новое время для следующего запроса
user_access_time[user_id] = now + COOLDOWN_SECONDS
bot.send_message(message.chat.id, f"Запрос обработан: {message.text}")
bot.infinity_polling()
