权限检查Discord.py Bot

时间:2018-10-01 14:54:02

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

我正在开发一款用于基本审核的Discord机器人,该机器人至少目前至少kickbanmute。但是问题是其他成员也可以使用它。我只希望有几个指定的角色可以使用它。

也不想根据@role对其进行处理,因为跨不同服务器的角色名称不同。还希望使机器人尽可能简单。

现在,我开始是这样的:

@client.command(name='ban')
async def mod_ban(member: discord.User):
    try:
        await client.ban(member, delete_message_days=0)
        await client.say('**{0}** has been banned.'.format(str(member)))
    except Exception as error:
        await client.say(error)

但是任何成员都可以使用命令。因此,尝试遵循此= Permission System for Discord.py Bot并最终得到:

@client.command(name='ban')
async def mod_ban(context, member: discord.User):
    if context.message.author.server_premission.administrator:
        try:
            await client.ban(member, delete_message_days=0)
            await client.say('**{0}** has been banned.'.format(str(member)))
        except Exception as error:
            await client.say(error)
    else:
        await client.say('Looks like you don\'t have the perm.')

哪个错误使我着陆:;-;

raise MissingRequiredArgument('{0.name} is a required argument that is missing.'.format(param))
discord.ext.commands.errors.MissingRequiredArgument: member is a required argument that is missing.

此外,除了context.message.author.server_premission.administrator外,我不仅希望具有管理员权限的角色使用此命令。我还希望其他一些角色具有很少的权限,例如manage messagemanage roles等,也可以用于命令。

预先感谢您的帮助!另外,如果我错过了任何愚蠢或愚蠢的事情,对不起;-;

3 个答案:

答案 0 :(得分:1)

据我在discord.py文档中所见,discord.Userdiscord.Member是不同的。

尝试更改 async def mod_ban(context, member: discord.User): async def mod_ban(context, member: discord.Member):

答案 1 :(得分:0)

在第二个示例中,您没有将上下文传递到协程中(正如@Andrei建议的那样,您只能禁止成员):

<QuerySet [<Books: Book Title>]>

此外,我可能应该更新my answer to that question。在命令的上下文中,您可以使用内置在@client.command(name='ban', pass_context=True) async def mod_ban(context, member: discord.Member): ... 中的非常强大的checks来为您完成很多工作。 has_permissions完全按照您的要求进行操作,验证用户是否具有任何必要的权限。

discord.ext.commands

答案 2 :(得分:0)

如果您使用discord.py重写,则可以使用检查(Discord.py rewrite checks) 哪个(很明显)检查某些事情,例如命令调用者的角色或权限

您可以在第一个装饰器下方使用这两个装饰器

@commands.has_role("rolename"/roleid)
@commands.has_any_role("rolename"/roleid,"rolename"/roleid,"rolename"/roleid ...)

其中rolename是一个字符串,其中包含角色的确切名称,一个字母一个字母,一个空格一个字符,而roleid是角色的ID,如果可以提及的话,您可以通过在任意位置键入@rolename来获取它服务器聊天室的数量

请注意,如果要传递多个角色进行检查,必须使用第二个装饰器