注意:由于Discord.py Rewrite已正式发布并“替换”了异步版本,因此该帖子同时具有Discord.py和Discord.py-Rewrite标签。
================================================ =========
我正在尝试为Discord Bots制作自己的帮助格式化程序(将提供多语言支持的帮助格式化程序),但是我需要一种获得用户权限的方法 IN 命令,不是开头
我在“帮助格式化程序”中正在做的是打开文件并读取X行,以便X事物在Discord上打印。它运行完美,但是我想限制这一点,因为有人可以通过对admin命令执行帮助命令来看到“ admin命令”(如果我放了一个)。因此,我要做的是在每个文件的末尾添加查看该命令所需的权限。
在机器人方面,我希望机器人以 list 的身份获得用户的权限,该用户具有用户拥有的所有权限,而不是具有权限ID,但具有诸如manage_message
或ban_members
之类的东西,因此我可以在文件末尾读取此权限,然后查看 该权限是否在用户的权限列表中 。
预先感谢您的回答。
答案 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 上回答了您,但我认为这可能对有相同问题的人有用)