【问题标题】:Permission Check Discord.py Bot权限检查 Discord.py 机器人
【发布时间】: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 等,也可以用来指挥。

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

【问题讨论】:

    标签: python python-3.x discord discord.py


    【解决方案1】:

    据我在 discord.py 文档中看到的 discord.Userdiscord.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
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2020-12-02
      • 1970-01-01
      • 2021-04-24
      • 2021-04-04
      • 2021-05-03
      • 2021-07-17
      相关资源
      最近更新 更多