简体   繁体   English

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

[英]Discord.py different cooldown per user

I want to make a command that have only a cooldown if the user is not in a list This is my code:如果用户不在列表中,我想创建一个只有冷却时间的命令这是我的代码:

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

And this is how it should be:这就是它应该的样子:

@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")

Is there any possibility to make this instead of using a config?有没有可能做到这一点而不是使用配置?

You have to make a custom cooldown, here a very simple example您必须进行自定义冷却,这里有一个非常简单的示例

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

To use it:要使用它:

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

The first two values are the rate and per of the default cooldown, the next two values are for the "special" cooldown.前两个值是默认冷却时间的速率和每次,接下来的两个值是“特殊”冷却时间。 Next there's the bucket type, and lastly the list of elements (ids).接下来是桶类型,最后是元素列表(id)。

You can also use this method for different cooldown per roles/guilds/categories/channels...您还可以将此方法用于每个角色/公会/类别/频道的不同冷却时间...

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

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