Discord.py - 检查用户是不是具有执行命令的特定角色

Posted

技术标签:

【中文标题】Discord.py - 检查用户是不是具有执行命令的特定角色【英文标题】:Discord.py - Check if user has specific role to make the commandDiscord.py - 检查用户是否具有执行命令的特定角色 【发布时间】:2019-04-04 21:10:54 【问题描述】:

我想检查执行命令的用户是否有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.

如何检查用户的角色列表中是否有角色管理员,然后他可以执行此命令?

【问题讨论】:

您的角色是否命名为“Admin”,并且拼写和大小写完全一致? 是的,一样 【参考方案1】:

使用装饰器@commands.has_role(name='Admin') 已经在保护该方法免受非管理员用户的攻击。

它在调用方法时引发异常,而不是在方法内部。

编辑:正如 Patrick 在 cmets 中提到的,您需要实施错误处理才能捕获错误:https://discordpy.readthedocs.io/en/rewrite/ext/commands/commands.html#error-handling

【讨论】:

可能想要缩小 except 子句 是的,OP 知道怎么做;他有没有在方法中做到这一点。但这里的重点是它是从装饰器包装中引发的,而不是在函数内部。 好吧,有趣。你能确认unban是一个成员函数吗? 解禁功能我之前测试过但是当我添加@commands.has_role(name='Admin')它给了我这个错误但它自己的功能 @Tezirg 问题中的协程将作为回调调用。要处理该调用产生的错误,他们必须写一个error handler。

以上是关于Discord.py - 检查用户是不是具有执行命令的特定角色的主要内容,如果未能解决你的问题,请参考以下文章

我的 discord.py 机器人有啥方法可以检查用户是不是具有使用命令的特定权限?

discord.py 如何检查用户是不是在服务器上?

如何检查用户是不是提供了参数 discord.py

检查用户是不是在语音频道 discord.py

Discord.py, MongoDB 检查用户是不是已经在

检查语音频道中的人是不是打开了视频(discord.py)[关闭]