Как установить двойное/расширенное время восстановления для команды в discord.py?

Это базовая команда с базовым временем восстановления:

@client.command()
@commands.cooldown(5, 57600, commands.BucketType.user)
async def ping(ctx)
   await ctx.send("pong")

Таким образом, когда пользователь использует префикс команды (например, «!k»), а затем набирает «ping», бот отправит «pong!» в чат. Это очень простая команда, но затем появляется декоратор перезарядки. Из кулдауна:

@commands.cooldown(5, 57600, commands.BucketType.user)

мы можем сказать, что команду можно использовать 5 раз между 57600 секундами (16 часов), но что, если я хочу, чтобы команда использовалась только 5 раз за 16 часов, И между каждым использованием команды есть ДРУГОЙ кулдаун? Позволь мне объяснить...

Вы можете использовать команду 5 раз в течение 16 часов

Но когда вы используете команду, вам нужно подождать 1 час, чтобы использовать ее снова.

Таким образом, вы не сможете использовать команду 5 раз сразу менее чем за минуту.

Думайте об этом как о дереве, которое выращивает яблоко каждый час, но выращивает только 5 яблок в день... Как я могу запретить пользователю использовать команду 5 раз сразу? Спасибо -

Для этого вам, вероятно, потребуется реализовать собственный обработчик времени восстановления. Вы не можете добавить несколько проверок перезарядки на команду.

Eric Jin 09.04.2022 19:05
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
1
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Discord.py не позволяет выполнять несколько проверок времени восстановления для каждой команды, поэтому вам придется использовать собственный обработчик времени восстановления.

class CooldownManager:

    def __init__(self, executions_allowed: int, cooldown_time: float):
        self.state = {}
        self.executions_allowed = executions_allowed
        self.cooldown_time = cooldown_time

    def time_left(self, key) -> float:
        """Attempt to execute. Return 0 if ready, or the number of seconds until you're allowed to execute again."""
        if key not in self.state.keys():
            self.state[key] = []
        if len(self.state[key]) > 0:
            # Clean up executions that have aged away
            # self.state[key] is sorted with the newest first
            for i in range(len(self.state[key])-1, -1, -1):
                if self.state[key][i] + self.cooldown_time < time.time():
                    del self.state[key][i]
            if len(self.state[key]) < self.executions_allowed:
                self.state[key].append(time.time())
                return 0
            next_available_execution = self.state[key][len(self.state)-1] + self.cooldown_time
            return next_available_execution - time.time()
        else:
            self.state[key].append(time.time())
            return 0

    def assert_cooldown(self, data):
        """Run this at the beginning of the command."""
        time_left = self.time_left(data)
        if time_left > 0:
            raise commands.CommandOnCooldown('', retry_after=time_left)


cm1 = CooldownManager(1, 4.0)  # execute once every 4 seconds
cm2 = CooldownManager(3, 120.0)  # execute up to 3x every 2 minutes
@client.command(name='test')
async def multicooldown(ctx):
    # Check both cooldowns. This raises `CommandOnCooldown` just like the vanilla cooldown handler, so you can catch that later in your command error check.
    cm1.assert_cooldown(ctx.author.id)  # This is basically the bucket type. You can use things like ctx.author.id, ctx.guild.id, etc
    cm2.assert_cooldown(ctx.author.id)
    # Do whatever you want here
    await ctx.send('test')

Другие вопросы по теме