权限检查 Discord.py 机器人

Posted

技术标签:

【中文标题】权限检查 Discord.py 机器人【英文标题】:Permission Check Discord.py Bot 【发布时间】:2019-03-06 17:17:51 【问题描述】:

我正在开发一个用于基本审核的不和谐机器人,至少现在可以使用 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 等,也可以用来指挥。

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

【问题讨论】:

【参考方案1】:

据我在 discord.py 文档中看到的 discord.User 与 discord.Member 不同。

尝试改变

async def mod_ban(context, member: discord.User):

async def mod_ban(context, member: discord.Member):

【讨论】:

MemberUser 的子类,但你说得对,User 没有ban 的必要属性来确定它们被禁止进入哪个服务器。 【参考方案2】:

如果你使用 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 来获取它您的服务器聊天室

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

【讨论】:

【参考方案3】:

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

@client.command(name='ban', pass_context=True)
async def mod_ban(context, member: discord.Member):
    ...

另外,我可能应该更新my answer to that question。在命令的上下文中,您可以使用内置于discord.ext.commands 中的非常强大的checks 来为您做很多事情。 has_permissions 完全符合您的要求,验证用户是否拥有任何必要的权限。

from discord.ext.commands import has_permissions, CheckFailure

@client.command(name='ban', pass_context=true)
@has_permissions(administrator=True, manage_messages=True, manage_roles=True)
async def mod_ban(ctx, member: discord.Member):        
    await client.ban(member, delete_message_days=0)
    await client.say('**0** has been banned.'.format(str(member)))

@mod_ban.error
async def mod_ban_error(error, ctx):
    if isinstance(error, CheckFailure):
        await client.send_message(ctx.message.channel, "Looks like you don't have the perm.")

【讨论】:

from discord.ext.commands import has_permissions, MissingPermissions 抛出此错误:ImportError: cannot import name 'MissingPermissions' @THEBlueBRAD.M 看起来在异步时它会引发CheckFailure

以上是关于权限检查 Discord.py 机器人的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 在命令方法上使用多个权限检查装饰器

Discord.py:有一个检查有两个不同的错误输出

如何使用 discord.py 制作一个检查某个服务器通道中所有消息的机器人

(discord.py) 检查消息是不是包含列表中的元素的正确方法是啥?

如何在 discord.py 中循环任务

(discord.py) 如何获取用户拥有多少权限的列表