discord.py переписать | Разрешить только один экземпляр команды

Используя мой бот, я обнаружил, что несколько человек могут использовать одну и ту же команду одновременно. Я хотел бы, чтобы команда выполнялась по одному, из-за ее природы.

Есть ли способ убедиться, что запущен только один экземпляр команды? Если есть, пожалуйста, скажите мне. Мне нужно это быстро исправить, поэтому любая помощь приветствуется.

1 ответ

Решение

Вы можете иметь время восстановления для всех пользователей с большим таймаутом, а затем сбросить время восстановления в конце команды:

from discord.ext.commands import cooldown

@bot.command()
@cooldown(1, 1000)  # 1000 second cooldown
async def comm(ctx):
    ...
    comm.reset_cooldown(ctx)

Используйте декоратор @commands.max_concurrecy(number, per=, wait=False) в своей команде.

Пример:

@commands.command()
@commands.max_concurrency(1, per=commands.BucketType.default, wait=False)
async def poll(self, ctx, *question):
    **Code**

При использовании декоратора max_concurrency, если у вас есть wait=False, он вернет ошибку MaxConcurrencyReached, когда количество экземпляров превысит указанное число. Пример обработки ошибок той же команды, что и выше, показан ниже.

Пример:

@poll.error
async def poll_handler(self, ctx, error):
    if isinstance(error, commands.MaxConcurrencyReached):
         (Whatever you want to do here)

Если wait=True, команда будет ждать в очереди, пока не будет запущена.

Не забудьте, что эта строка также должна быть в вашем ботеfrom discord.ext import commands

Также возможно использование глобальной переменной.

global set_active
set_active = 0
...
...
@bot.command("turn_on")
async def "Your command name"(ctx):
    global set_active
    #start command
    if set_active == 1:
        await ctx.send("This is already active")
    else/elif:
        ......
    #end command
    set_active = 1

@bot.command("turn_off")
async def "Your command name"(ctx):
    global set_active
    #start command
    ......
    #end command
    set_active = 0

Надеюсь, это понятно. Я помогаю кому-то впервые. У меня это тоже есть в моем боте. Дайте мне знать, если я могу вам больше помочь!

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