как сделать задержку между командами telebot
Как сделать задержку между выполнениями команд в телеграм боте. Например что бы пользователь написал команду, а потом ещё раз и ему писало "Подождите 5 секунд перед выполнение этой команды" и так в течении 5 секунд. Помогите пожалуйста, буду очень рад вашей помощи.
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Пример ответа сделан в python-telegram-bot (в UPD добавил вариант с pytelegrambotapi), но реализацию можно переписать на другие библиотеки.
Действия:
- Заводите структуру, например, словарь или базу данных для хранения id чата и времени сообщения
- Получая сообщение проверяйте разницу между текущем временем и тем, что был сохранен
- Можно хранить текущее время в секундах,
timestamp - В примере время храню в объекте
datetime, при вычитании одногоdatetimeиз другогоdatetimeбудет получен объектtimedelta, у которого есть методtotal_seconds
- Можно хранить текущее время в секундах,
- Если разница меньше или равна заданных секунд, то отправляем сообщение о ожидании
import datetime as DT
...
CHAT_BY_DATETIME = dict()
def on_request(update: Update, context: CallbackContext):
message = update.effective_message
text = 'Получено!'
need_seconds = 50
current_time = DT.datetime.now()
last_datetime = CHAT_BY_DATETIME.get(message.chat_id)
# Если первое сообщение (время не задано)
if not last_datetime:
CHAT_BY_DATETIME[message.chat_id] = current_time
else:
# Разница в секундах между текущим временем и временем последнего сообщения
delta_seconds = (current_time - last_datetime).total_seconds()
# Осталось ждать секунд перед отправкой
seconds_left = int(need_seconds - delta_seconds)
# Если время ожидания не закончилось
if seconds_left > 0:
text = f'Подождите {seconds_left} секунд перед выполнение этой команды'
else:
CHAT_BY_DATETIME[message.chat_id] = current_time
message.reply_text(text, quote=True)
...
UPD. Пример:
import datetime as DT
# SOURCE: pip install pyTelegramBotAPI
import telebot
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
CHAT_BY_DATETIME = dict()
@bot.message_handler(commands=['help', 'start'])
def on_start(message: telebot.types.Message):
bot.send_message(message.chat.id, 'Write something')
@bot.message_handler(func=lambda message: True)
def on_request(message: telebot.types.Message):
text = 'Получено!'
need_seconds = 50
current_time = DT.datetime.now()
last_datetime = CHAT_BY_DATETIME.get(message.chat.id)
# Если первое сообщение (время не задано)
if not last_datetime:
CHAT_BY_DATETIME[message.chat.id] = current_time
else:
# Разница в секундах между текущим временем и временем последнего сообщения
delta_seconds = (current_time - last_datetime).total_seconds()
# Осталось ждать секунд перед отправкой
seconds_left = int(need_seconds - delta_seconds)
# Если время ожидания не закончилось
if seconds_left > 0:
text = f'Подождите {seconds_left} секунд перед выполнение этой команды'
else:
CHAT_BY_DATETIME[message.chat.id] = current_time
bot.reply_to(message, text)
bot.infinity_polling()
Результат:
