Discord.py Bot 的权限系统

新手上路,请多包涵

我正在使用 discord.py 和 asyncio 制作一个 discord 机器人。该机器人有像 kickban 这样的命令,这显然不应该对普通用户可用。

我想制作一个简单的系统,它将使用 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 用于测试目的。

感谢您提前提供任何帮助和建议。

原文由 user9123 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

Permissions 是班级的名字。要获得消息作者权限,您应该访问作者的 guild_permissions 属性。

 if ctx.message.author.guild_permissions.administrator:
 # you could also use guild_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(ctx, error):
    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)

原文由 Patrick Haugh 发布,翻译遵循 CC BY-SA 4.0 许可协议

你也可以使用装饰器。

 @bot.command(name = "Kick")
@bot.has_permissions(kick_user = True)
@bot.bot_has_permissions(kick_user = True)
async def _kick(ctx, member: Member):
    #Do stuff...

检查用户和机器人权限的优势意味着可以更轻松地处理来自提供有用的“权限不足”错误消息的错误。

原文由 RushTheFox 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题