Как я могу создать функцию-оболочку для команд discord.py?

avatar
Rikai
1 июля 2021 в 18:35
91
1
0

Я пытался создать оболочку @validate_channel, эта оболочка должна выполнять команду, только если она выполняется на сервере, а не на частном канале, я пытаюсь:

Функция команды:

@validate_channel
@bot.command(brief="Adds one or more members to the whitelist")
async def add(ctx: commands.Context, *users: discord.Member):
    if not check_permissions(ctx.author.id, ctx.guild):
        await ctx.send(NOT_ALLOWED_MSG)
    else:
        config = get_config(ctx.guild.id)
        allowed_users = config.get('allowed-users', [])
        if not users:
            await ctx.send(f"You didn't specify any users!")
            return
        for user in users:
            if user.id not in allowed_users:
                allowed_users.append(user.id)
        config['allowed-users'] = allowed_users
        update_config(ctx.guild.id, config)
        await ctx.send(f"Added {', '.join(user.name for user in users)} to the whitelist!")

Оболочка:

def validate_channel(func):
    async def inner(ctx: commands.Context, message, *args, **kwargs):
        if ctx.channel.type is discord.ChannelType.private:
            await ctx.send("This command cannot be run from direct messages.")
        else:
            return func

    return inner

Но это просто не работает, что бы я ни пытался, кто-нибудь может мне помочь?

Источник

Ответы (1)

avatar
Łukasz Kwieciński
1 июля 2021 в 18:43
0

Вместо возврата inner следует использовать commands.check вместо

def validate_channel():
    async def inner(ctx):
        if not ctx.channel.type is discord.ChannelType.private:  # or even better `not isinstance(ctx.channel, discord.DMChannel)`
            await ctx.send("You cannot use this command in DMs")
            return False
        return True   
   return commands.check(inner)


@validate_channel()
@bot.command()
async def ...

Лучший, более короткий и простой способ — использовать проверку commands.dm_only:

@commands.dm_only()
@bot.command()
async def ...
Rikai
1 июля 2021 в 19:32
0

Благодарю вас! Благодаря вашему комментарию я узнал о проверках discord.py и о том, как их использовать, мне удалось очистить свой код, а также реализовать функцию, о которой я просил в этом вопросе :)