python-Discord.py Bot的权限系统

我正在使用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.

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

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

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

更新:

验证命令调用者权限的更好方法是使用命令扩展名的check功能,尤其是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)

转载注明原文:python-Discord.py Bot的权限系统 - 代码日志