как сделать задержку между командами telebot

Как сделать задержку между выполнениями команд в телеграм боте. Например что бы пользователь написал команду, а потом ещё раз и ему писало "Подождите 5 секунд перед выполнение этой команды" и так в течении 5 секунд. Помогите пожалуйста, буду очень рад вашей помощи.


Ответы (1 шт):

Автор решения: gil9red

Пример ответа сделан в UPD добавил вариант с ), но реализацию можно переписать на другие библиотеки.

Действия:

  • Заводите структуру, например, словарь или базу данных для хранения 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()

Результат:

введите сюда описание изображения

→ Ссылка