在使用我的机器人时,我发现多个人可以同时使用同一命令。由于它的性质,我只希望一次执行一个命令。
是否有一种方法可以确保仅运行该命令的一个实例?如果有,请告诉我。我需要这种固定的方式,所以能提供任何帮助。
答案 0 :(得分:1)
您可以对所有超时时间较长的用户进行冷却,然后在命令末尾重置冷却时间:
from discord.ext.commands import cooldown
@bot.command()
@cooldown(1, 1000) # 1000 second cooldown
async def comm(ctx):
...
comm.reset_cooldown(ctx)
答案 1 :(得分:0)
使用全局变量也是一种选择。
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
我希望这很清楚。这是我第一次帮助别人。 我的机器人中也有这个。让我知道是否能为您提供更多帮助!
答案 2 :(得分:0)
在命令上使用@ commands.max_concurrecy(number,per =,wait = False)装饰器。
示例:
Retarget Solution
使用max_concurrency装饰器时,如果具有wait = False,则当实例超过指定数量时,它将返回MaxConcurrencyReached错误。错误显示与上述相同命令的示例如下
示例:
@commands.command()
@commands.max_concurrency(1, per=commands.BucketType.default, wait=False)
async def poll(self, ctx, *question):
**Code**
如果wait = True,则该命令将在队列中等待直到可以运行。
请记住,您的漫游器中也应包含此行
@poll.error
async def poll_handler(self, ctx, error):
if isinstance(error, commands.MaxConcurrencyReached):
(Whatever you want to do here)