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