Python 对多个discord.py bot命令进行相同的冷却?
这是用Python 对多个discord.py bot命令进行相同的冷却?,python,discord,discord.py,Python,Discord,Discord.py,这是用discord.py编写的 我有多个类似以下的命令: @bot.command(name ="hi") async def hi(ctx): link = ["https://google.com", "https://youtube.com"] chosen = random.choice(link) url = chosen embed = discord.Embed(title="Your Link", description=f"[Click Her
discord.py
编写的
我有多个类似以下的命令:
@bot.command(name ="hi")
async def hi(ctx):
link = ["https://google.com", "https://youtube.com"]
chosen = random.choice(link)
url = chosen
embed = discord.Embed(title="Your Link", description=f"[Click Here]({url})", color=0x00ff00)
if ctx.message.guild == None:
await ctx.author.send('You can not use this command in your DM!')
pass
else:
await ctx.author.send(embed=embed)
如果有人使用其中一个命令,则应对所有命令进行冷却(例如,如果使用了!hi
,则冷却将同时应用于!hi
和!bye
)
我知道您可以使用
@commands.cooldown(1600,commands.BucketType.user)
,但这只会对当前命令应用冷却。这就是cooldown
装饰器在代码中的定义:
def cooldown(rate, per, type=BucketType.default):
def decorator(func):
if isinstance(func, Command):
func._buckets = CooldownMapping(Cooldown(rate, per, type))
else:
func.__commands_cooldown__ = Cooldown(rate, per, type)
return func
return decorator
我们可以对此进行修改,以便只创建一个在命令之间共享的冷却对象:
def shared_cooldown(rate, per, type=BucketType.default):
cooldown = Cooldown(rate, per, type=type)
def decorator(func):
if isinstance(func, Command):
func._buckets = CooldownMapping(cooldown)
else:
func.__commands_cooldown__ = cooldown
return func
return decorator
my_cooldown = shared_cooldown(1, 600, commands.BucketType.user)
@bot.command()
@my_cooldown
async def hi(ctx):
await ctx.send("Hi")
@bot.command()
@my_cooldown
async def bye(ctx):
await ctx.send("Bye")
我们将通过调用它来获取装饰器,然后将其应用于命令:
def shared_cooldown(rate, per, type=BucketType.default):
cooldown = Cooldown(rate, per, type=type)
def decorator(func):
if isinstance(func, Command):
func._buckets = CooldownMapping(cooldown)
else:
func.__commands_cooldown__ = cooldown
return func
return decorator
my_cooldown = shared_cooldown(1, 600, commands.BucketType.user)
@bot.command()
@my_cooldown
async def hi(ctx):
await ctx.send("Hi")
@bot.command()
@my_cooldown
async def bye(ctx):
await ctx.send("Bye")