Discord.py - Проверьте, есть ли у пользователя определенная роль для выполнения команды - PullRequest
0 голосов
/ 31 октября 2018

Я хочу проверить, есть ли у пользователя, который выполняет команду, Admin role

Это мой код:

@client.command(pass_context=True)
@commands.has_role(name='Admin')
async def unban(self, ctx, user):
    """
    unbans a user name
    :user: user name not mentioned
    """
    try:
        ban_list = await client.get_bans(ctx.message.server)
        if not ban_list:
            await self.client.send_message(ctx.message.channel, 'Ban list is empty')
            return
        for bans in ban_list:
            if user.lower() in str(bans).lower():
                try:
                    await self.client.unban(ctx.message.server, bans)
                    await self.client.send_message(ctx.message.channel, 'Unbanned')
                except discord.Forbidden:
                    await client.send_message(ctx.message.channel, "I don't have permissions to unban")
                    return
                except discord.HTTPException:
                    await client.send_message(ctx.message.channel, 'Unban failed')
                    return
            else:
                await client.send_message(ctx.message.channel, 'This user is not banned from this server')
    except:
        await client.send_message(ctx.message.channel, "You don't have ``Admin`` role")

Но когда я пытаюсь выполнить команду без роли Admin, она показывает мне эту ошибку:

    Ignoring exception in command unban
Traceback (most recent call last):
  File "C:\Users\danyb\Anaconda3\lib\site-packages\discord\ext\commands\bot.py", line 846, in process_commands
    yield from command.invoke(ctx)
  File "C:\Users\danyb\Anaconda3\lib\site-packages\discord\ext\commands\core.py", line 367, in invoke
    yield from self.prepare(ctx)
  File "C:\Users\danyb\Anaconda3\lib\site-packages\discord\ext\commands\core.py", line 344, in prepare
    self._verify_checks(ctx)
  File "C:\Users\danyb\Anaconda3\lib\site-packages\discord\ext\commands\core.py", line 339, in _verify_checks
    raise CheckFailure('The check functions for command {0.qualified_name} failed.'.format(self))
discord.ext.commands.errors.CheckFailure: The check functions for command unban failed.

Как проверить, есть ли у пользователя роль администратора в его списке ролей, и может ли он выполнить эту команду?

1 Ответ

0 голосов
/ 31 октября 2018

Использование декоратора @commands.has_role(name='Admin') уже защищает метод от пользователей, не являющихся администраторами.

Вызывает исключение при вызове метода, а не внутри метода.

РЕДАКТИРОВАТЬ: Как упоминал Патрик в комментариях, вам нужно будет реализовать обработку ошибок, чтобы перехватить ошибку: https://discordpy.readthedocs.io/en/rewrite/ext/commands/commands.html#error-handling

...