Discord 尽管已授予Bot管理员权限,但仍请求Kick成员权限

Discord 尽管已授予Bot管理员权限,但仍请求Kick成员权限,discord,discord.py,Discord,Discord.py,所以我正在建立一个机器人,并对其进行测试。我的一个小功能是踢、禁止和取消禁止用户,设置在cog中,如下所示: 导入不一致 从discord.ext导入命令 类主持人(commands.Cog): def uuu init uuuu(自我,机器人): self.bot=bot #踢指令 @commands.command() @commands.has_权限(kick_members=True) 异步def kick(self,ctx,成员:discord.member,*,reason=None

所以我正在建立一个机器人,并对其进行测试。我的一个小功能是踢、禁止和取消禁止用户,设置在cog中,如下所示:

导入不一致
从discord.ext导入命令
类主持人(commands.Cog):
def uuu init uuuu(自我,机器人):
self.bot=bot
#踢指令
@commands.command()
@commands.has_权限(kick_members=True)
异步def kick(self,ctx,成员:discord.member,*,reason=None):
(‘就要踢了’)
等待成员。踢(原因=原因)
@commands.command()
@commands.has_权限(kick_members=False)
异步def kick(self,ctx,成员:discord.member,*,reason=None):
等待ctx.send(如果'您没有权限踢任何成员,{ctx.message.author.title}!')
#禁止命令
@commands.command()
@commands.has_权限(ban_members=True)
异步定义禁止(self,ctx,成员:discord.member,*,reason=None):
等待成员。禁止(原因=原因)
等待ctx.send(f'banked{member.notice})
@commands.command()
@commands.has_权限(kick_members=False)
异步定义禁止(self,ctx,成员:discord.member,*,reason=None):
等待ctx.send(如果“您没有禁止任何成员的权限,{ctx.message.author.title}!”)
#UNBAN命令
@commands.command()
@commands.has_权限(ban_members=True)
异步def unban(自身、ctx、*、成员):
禁止的用户=等待ctx.guild.bans()
member_name,member_discriminator=member.split('#')
对于禁用用户中的禁用条目:
user=ban_entry.user
如果(user.name,user.discriminator)=(member\u name,member\u discriminator):
等待ctx.guild.unban(用户)
等待ctx.send(f'Unbanned{user.notice})
返回
@commands.command()
@commands.has_权限(kick_members=False)
异步def unban(self,ctx,成员:discord.member,*,reason=None):
等待ctx.send(如果您没有取消对任何成员的绑定的权限,{ctx.message.author.ntify}!')
#明确的信息
@commands.command()
@commands.has_权限(manage_messages=True)
异步def清除(自身、ctx、金额=2):
等待ctx.channel.purge(限制=数量)
@commands.command()
@commands.has_权限(manage_messages=False)
异步def清除(自身、ctx、金额=2):
等待ctx.send(如果“您没有以这种方式删除邮件的权限,{ctx.message.author.title}!”)
def设置(机器人):
bot.add_cog(主持人(bot))
现在我已经用一些空格格式化了上面的代码,这样它就可以放在一个代码块中,所以如果复制粘贴到其他地方,您可能会遇到缩进错误。

接下来,bot本身拥有管理员权限以及单独的踢和禁止权限。它还位于角色层次结构的顶部,如下所示:

我的机器人叫JunkBot

现在,作为服务器所有者,每当我尝试使用命令.kick@user,它都会弹出以下错误:

错误的文本形式为:

Ignoring exception in command kick:
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 855, in invoke
    await self.prepare(ctx)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 777, in prepare
    if not await self.can_run(ctx):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 1087, in can_run
    return await discord.utils.async_all(predicate(ctx) for predicate in predicates)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\utils.py", line 348, in async_all
    for elem in gen:
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 1087, in <genexpr>
    return await discord.utils.async_all(predicate(ctx) for predicate in predicates)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 1790, in predicate
    raise MissingPermissions(missing)
discord.ext.commands.errors.MissingPermissions: You are missing Kick Members permission(s) to run this command.
忽略命令kick中的异常:
回溯(最近一次呼叫最后一次):
文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\ext\commands\bot.py”,第939行,在invoke中
等待ctx.command.invoke(ctx)
文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\ext\commands\core.py”,第855行,在invoke中
等待自我准备(ctx)
文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\ext\commands\core.py”,第777行,在prepare中
如果不等待self.can_运行(ctx):
文件“C:\Users\Admin\AppData\Local\Programs\Python\Python38-32\lib\site packages\discord\ext\commands\core.py”,第1087行,在can\U run中
return wait discord.utils.async_all(谓词中谓词的谓词(ctx))
文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\utils.py”,第348行,异步\u all
对于gen中的元素:
文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\ext\commands\core.py”,第1087行,在
return wait discord.utils.async_all(谓词中谓词的谓词(ctx))
谓词中第1790行的文件“C:\Users\Admin\AppData\Local\Programs\Python38-32\lib\site packages\discord\ext\commands\core.py”
提升丢失权限(丢失)
discord.ext.commands.errors.MissingPermissions:您缺少Kick Members运行此命令的权限。
ban、unban和clear messages命令也会出现类似错误

有趣的是,作为所有者,我得到了这个错误,但是假设另一个用户,我的一个朋友没有踢,禁止或消息管理角色,完美地运行他们的代码行,她从机器人那里得到消息,她没有踢,禁止或清除消息的权限。附上截图


我不知道我哪里出错了。请帮我调试它。

这不是错误处理的工作方式。您应该查看文档部分,了解如何处理缺少的权限

编辑,因为人们提醒我提供更多信息

您不应该通过
拥有\u权限来处理错误。从您的代码中可以看出,您希望在调用程序没有使用该命令所需的权限时发送消息。这可以通过错误处理程序实现。错误处理程序将捕获
MissingPermissions
异常,并基于此执行操作。以下是一个例子:

@commands.Cog.listener()
命令上的异步定义错误(self、ctx、error):#这是捕获错误的事件
if isinstance(错误,commands.MissingPermissions):#查看错误是否是缺少权限的错误
等待ctx.send(f“您没有执行此操作的权限,{ctx.author.antify}!”)
这使用了一个全局错误处理程序,这意味着无论何时捕获错误,它都将捕获它