权限检查 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)

但是任何成员都可以使用这些命令。因此,尝试遵循这个 = 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 等也可以用来指挥。

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

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

阅读 684
2 个回答

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

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

另外,我可能应该更新 我对那个问题的回答。在命令的上下文中,您可以使用内置于 discord.ext.commands 中的非常强大的 检查 来为您做很多这样的事情。 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.")

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

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

尝试改变

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

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

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

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