Как сделать кастомный кулдаун для discord.app_commands?

Я хочу сделать кулдаун для всех команд но чтобы распространялся он только на юзера.
Допустим есть команда A и команда B, и мне нужно чтобы после того как пользователь использовал команду A, он не мог использовать команды А и B определенное время.
У меня есть пример реализации с декоратором
@discord.app_commands.checks.dynamic_cooldown(обработчик)
, но этот кулдаун распространяется только на одну команду, и для всей гильдии. Мне же нужно на все команды и для одного пользователя.
Также нужно чтобы можно было сделать обработчик по типу этого
@bot.tree.error
async def on_app_command_error(
    interaction: discord.Interaction,
    error: app_commands.AppCommandError
):
    if isinstance(error, app_commands.CommandOnCooldown):
        embed = discord.Embed(
            description="Вы сможете использовать эту команду через "
            f"**{int(error.retry_after)}s**",
            color=embed_color
        )
        await interaction.response.send_message(embed=embed, ephemeral=True)
    else:
        raise error
когда команды находятся в кулдауне
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Встроенного такого функционала нет, пишите или свой декоратор с проверкой (если нужно делать эту проверку перед определенными командами) или проверку внутри событий on_message и on_interaction (если нужно сразу на все команды)
Внутри обращаетесь к БД или храните словарь, примерно с примерно следующим форматом:
{ user_id: (guild_id, last_command_datetime) }
- Если пользователя нет в словаре, добавляете с текущим временем и гильдией и пускаете в команду
- Если он есть и таймдельта между его временем и текущим больше кулдауна обновляете время и пускаете в команду
- Иначе вызвать кастомную ошибку или дискордовскую CommandOnCooldown
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы