Как сделать кулдаун для команд в python

Доброго времени суток.

Есть бот, которому нужно сделать кулдаун на команды.

Вот как он выглядит:

email = 'email'
password = 'password'
comid = 'comid'
chatid = 'chatid'

class Bot:

    def run(self):

        while True:
            messages = sub_client.get_chat_messages(chatId=chatid, size=10) # Получает последние 10 сообщений в чате
            for id, message, author, authorid in zip(messages.messageId,
                                                     messages.content,
                                                     messages.author.nickname,
                                                     messages.author.id):

                 if message.lower() == "!бот":  # Команда 1
                     try:
                        send_message(message="Бот", chatId=chatid)
                     except:
                        send_message(chatId=chatid, message="Не правильно.", replyTo=id)

                 if message.lower() == "!ping":  # Команда 2
                     try:
                        send_message(message="Pong!", chatId=chatid)
                     except:
                        send_message(chatId=chatid, message="Не правильно.", replyTo=id)

                 if message.lower() == "!привет":  # Команда 3
                     try:
                        send_message(message="пока", chatId=chatid)
                     except:
                        send_message(chatId=chatid, message="Не правильно.", replyTo=id)

Как-то так он выглядит(много чего удалил, этот кусок кода как наглядный пример)

Нужно сделать кулдаун в 5 секунд для каждой команды, при этом чтобы программа не останавливалась, как в случае с time.sleep, а давала возможность вызова других команд.

Возможно стоит каждую команду обернуть в функцию, думал над этим, но не уверен, так как не знаю как реализовать кулдаун в python.

Спасибо за помощь.


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

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

Простой вариант: сохранять для каждой команды последнее время ее выполнения и проверять перед выполнением команды, что с предыдущего ее вызова прошел кулдаун.

И да, лучше обернуть каждую команду (точнее каждый ваш ответ) в отдельную функцию, потому что вы зашьетесь потом проверять кучу условий, если добавите в них хоть каплю функционала.

class Bot:
    def run():
        from time import time

        last_time = [0] * 3

        while True:
            messages = sub_client.get_chat_messages(chatId=chatid, size=10)
            for id, message, author, authorid in zip(messages.messageId,
                                                     messages.content,
                                                     messages.author.nickname,
                                                     messages.author.id):
                message = message.lower()

                if message == '!бот':
                    if time() > last_time[0] + 5:
                        try:
                            send_message(message="Бот", chatId=chatid)
                        except:
                            send_message(chatId=chatid, message="Не правильно.", replyTo=id)

                        last_time[0] = time()

                else if ...
→ Ссылка