繁体   English   中英

Discord.py 每个用户的冷却时间不同

[英]Discord.py different cooldown per user

如果用户不在列表中,我想创建一个只有冷却时间的命令这是我的代码:

@commands.command(name='cooldown')
@commands.cooldown(1, 300, commands.BucketType.user)
async def cdown(self, ctx):
  await ctx.send("Executed")

这就是它应该的样子:

@commands.command(name='cooldown')
if not user in no_cooldown_users:
  @commands.cooldown(1, 300, commands.BucketType.user)
async def cdown(self, ctx):
  await ctx.send("Executed")

有没有可能做到这一点而不是使用配置?

您必须进行自定义冷却,这里有一个非常简单的示例

from discord.ext import commands

class CustomCooldown:
    def __init__(self, rate, per, alter_rate, alter_per, bucket, *, elements):
        self.elements = elements
        # Default mapping is the default cooldown
        self.default_mapping = commands.CooldownMapping.from_cooldown(rate, per, bucket)
        # Alter mapping is the alternative cooldown
        self.alter_mapping = commands.CooldownMapping.from_cooldown(alter_rate, alter_per, bucket)
        # Copy of the original BucketType
        self._bucket_type = bucket

    def __call__(self, ctx):
        key = self.alter_mapping._bucket_key(ctx.message)

        if self._bucket_type is commands.BucketType.member: # `BucketType.member` returns a tuple
            key = key[1] # The second (last) value is the member ID, the first one is the guild ID

        if key in self.elements:
            # If the key is in the elements, the bucket will be taken from the alternative cooldown
            bucket = self.alter_mapping.get_bucket(ctx.message)
        else:
            # If not, from the default cooldown
            bucket = self.default_mapping.get_bucket(ctx.message)

        # Getting the ratelimit left (can be None)
        retry_after = bucket.update_rate_limit()

        if retry_after: # If the command is on cooldown, raising the error
            raise commands.CommandOnCooldown(bucket, retry_after)
        return True

要使用它:

@command.commands()
@commands.check(CustomCooldown(1, 300, 1, 0, commands.BucketType.user, elements=[list of ids]))
async def foo(self, ctx):
    ...

前两个值是默认冷却时间的速率和每次,接下来的两个值是“特殊”冷却时间。 接下来是桶类型,最后是元素列表(id)。

您还可以将此方法用于每个角色/公会/类别/频道的不同冷却时间...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM