Boord的权限系统

发布于 2021-01-29 16:06:32

我正在使用discord.py和asyncio制作discord机器人。该机器人具有类似kick和的命令,而ban这些命令显然对普通用户不可用。

我想制作一个简单的系统,该系统将检测用户角色所使用的权限ctx.message.author以获取发送命令的用户。

我不希望该漫游器检测到特定的角色名称,因为这些名称在服务器之间会有所不同。我还希望该机器人没有多个文件,以使其简单。

我看过discord.py文档和其他各种资源,但没有一个包含如何实现他们所讨论的各种方法的示例。

例如,这是我的机器人发出的单个命令:

async def kick(ctx, userName: discord.User):
    if True: #ctx.message.author.Permissions.administrator
        await BSL.kick(userName)
    else:
        permission_error = str('Sorry ' + ctx.message.author + ' you do not have permissions to do that!')
        await BSL.send_message(ctx.message.channel, permission_error)

if else声明是我自己尝试执行的操作。将#ctx.message.author.Permissions.administrator被注释掉,因为它不工作,取而代之的True用于测试目的。

感谢您的任何帮助和建议。

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Permissions是类的名称。要获得消息作者权限,您应该访问server_permissions作者的属性。

    if ctx.message.author.server_permissions.administrator:
     # you could also use server_permissions.kick_members
    

    更新:

    验证调用命令的人的权限的一种更好的方法是使用扩展的检查功能commands,特别是has_permissions检查。例如,如果您只想向拥有manage_roles权限的人打开命令ban_members,则可以这样编写命令:

    from discord import Member
    from discord.ext.commands import has_permissions, MissingPermissions
    
    @bot.command(name="kick", pass_context=True)
    @has_permissions(manage_roles=True, ban_members=True)
    async def _kick(ctx, member: Member):
        await bot.kick(member)
    
    @_kick.error
    async def kick_error(error, ctx):
        if isinstance(error, MissingPermissions):
            text = "Sorry {}, you do not have permissions to do that!".format(ctx.message.author)
            await bot.send_message(ctx.message.channel, text)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看