📜  为命令 discord.py 添加冷却时间 (1)

📅  最后修改于: 2023-12-03 15:36:01.263000             🧑  作者: Mango

为命令 discord.py 添加冷却时间

在编写 Discord 机器人时,通常需要添加冷却时间 (Cooldown) 来防止用户频繁使用某些命令,从而保证机器人的稳定性。

本文将介绍使用 discord.py 库为命令添加冷却时间的方法。

安装 discord.py

在开始之前,我们需要安装 discord.py 库。你可以使用以下命令来安装:

pip install discord.py
如何添加冷却时间

discord.py 库提供了一个 commands.cooldown 装饰器,可以轻松地为命令添加冷却时间。

下面是一个例子:

from discord.ext import commands
import random

bot = commands.Bot(command_prefix='!')

@bot.command()
@commands.cooldown(1, 60, commands.BucketType.user)
async def roll(ctx):
    """Roll a random number between 1 and 100."""
    await ctx.send(f'You rolled a {random.randint(1,100)}!')

在上面的例子中,@commands.cooldown(1, 60, commands.BucketType.user) 表示该命令最多可以在 60 秒内被使用 1 次,且限制是基于用户的。如果用户在冷却时间内尝试再次使用该命令,则会收到一个错误提示。

你可以根据需要修改 160 来设置冷却时间。

命令级别的冷却时间

你还可以为不同的命令设置不同的冷却时间。例如,如果你有两个命令 !roll!flip,你可以针对它们分别设置不同的冷却时间:

@bot.command()
@commands.cooldown(1, 60, commands.BucketType.user)
async def roll(ctx):
    """Roll a random number between 1 and 100."""
    await ctx.send(f'You rolled a {random.randint(1,100)}!')

@bot.command()
@commands.cooldown(1, 30, commands.BucketType.user)
async def flip(ctx):
    """Flip a coin."""
    await ctx.send('You flipped a coin and it landed on {}!'.format(random.choice(['heads', 'tails'])))

在上面的例子中,!roll!flip 分别有不同的冷却时间,分别为 60 秒和 30 秒。

在错误中处理冷却时间

当一个命令被冷却限制时,discord.py 会自动处理错误。但是,我们也可以手动处理这些错误,例如在命令返回错误时显示剩余冷却时间。

以下是一个例子:

@bot.command()
@commands.cooldown(1, 60, commands.BucketType.user)
async def ping(ctx):
    """Ping the bot."""
    await ctx.send('Pong!')

@ping.error
async def ping_error(ctx, error):
    if isinstance(error, commands.CommandOnCooldown):
        await ctx.send(f'Please wait {error.retry_after:.0f} seconds before using this command again.')
    else:
        raise error

在上面的例子中,我们使用了 @ping.error 装饰器来处理命令错误。如果命令被冷却限制,我们会向用户返回一个提示,告诉他们需要等待多长时间才能再次使用该命令。

结论

在编写 Discord 机器人时,添加冷却时间是非常重要的。通过使用 discord.py 的 commands.cooldown 装饰器,我们可以轻松地为命令添加冷却时间,并有效地保护机器人的稳定性。