Discord.py Rewrite-如何获得用户的权限列表?

时间:2019-04-16 14:19:02

标签: python python-3.x python-3.6 discord.py discord.py-rewrite

注意:由于Discord.py Rewrite已正式发布并“替换”了异步版本,因此该帖子同时具有Discord.py和Discord.py-Rewrite标签。

================================================ =========

我正在尝试为Discord Bots制作自己的帮助格式化程序(将提供多语言支持的帮助格式化程序),但是我需要一种获得用户权限的方法 IN 命令,不是开头

我在“帮助格式化程序”中正在做的是打开文件并读取X行,以便X事物在Discord上打印。它运行完美,但是我想限制这一点,因为有人可以通过对admin命令执行帮助命令来看到“ admin命令”(如果我放了一个)。因此,我要做的是在每个文件的末尾添加查看该命令所需的权限。

在机器人方面,我希望机器人以 list 的身份获得用户的权限,该用户具有用户拥有的所有权限,而不是具有权限ID,但具有诸如manage_messageban_members之类的东西,因此我可以在文件末尾读取此权限,然后查看 该权限是否在用户的权限列表中

预先感谢您的回答。

2 个答案:

答案 0 :(得分:0)

假设您具有一些将字典权限名称映射到字符串列表的字典:

perm_command_map = {
    "manage_messages": ["Command1", "Command2"],
    "kick_members": ["Command3", "Command4"]
}

您可以使用Member.permissions_in方法来获取Permissions对象,然后使用该对象来确定用户的权限,以获取用户有权访问的所有内容的列表(如果您只关心关于行会级别的权限,只需使用Member.permissions):

allowed_commands = []
permissions = message.author.permissions_in(message.channel)
for perm, commands in perm_command_map.items():
    if getattr(permissions, perm):
        allowed_commands.extend(commands)

答案 1 :(得分:0)

您制作自己的装饰器,实现与普通 has_permissions 装饰器相同的功能,但也将这些 perms 作为变量添加到命令实例中。

def custom_has_permissions(**perms) -> commands.check:
    async def predicate(ctx):
        # Add the perms to a variable, you can format this any way you'd want
        ctx.command.required_perms = [p.replace('_', ' ').title() for p in perms.keys()]
        # Just use the normal check
        return await commands.has_permissions(**perms).predicate(ctx)

    return commands.check(predicate)

现在你可以像这样使用这个新的装饰器

@custom_has_permissions(ban_members=True)
@commands.command()
async def ban(ctx, ...):
    # printing ctx.command.required_perms will give you ['Ban Members']
    ...

这样,命令在被调用后将保留您可以在子类帮助命令中使用的变量 required_perms

但是请注意,它只会保持在调用命令之后

您可以执行 await Command.can_run(ctx) 来运行检查,从而“加载”变量。

(我已经在 Discord 上回答了您,但我认为这可能对有相同问题的人有用)