@commands.has_permissions(administrator=True) 不能正常工作?

Posted

技术标签:

【中文标题】@commands.has_permissions(administrator=True) 不能正常工作?【英文标题】:@commands.has_permissions(administrator=True) not working properly? 【发布时间】:2021-05-22 09:37:51 【问题描述】:

我正在尝试制作一个简单的版主机器人。 代码看起来像这样。

import discord
from discord.ext import commands
from random import choice
import os


client = commands.Bot(command_prefix=commands.when_mentioned_or("%"), description='A simple Moderator bot')

def colour():
  l = [ 1752220, 3066993, 3447003, 10181046, 15844367, 15105570, 15158332, 3426654, 16580705 ]
  return choice(l)


@client.event
async def on_ready():
  change_status.start()
  print("The Bot is online!")


@client.command()
@commands.has_permissions(administrator=True)
async def kick(ctx, user : discord.Member = None, *,reason = "No reason provided"):
  await user.kick(reason = reason)
  await ctx.send("Kicked the user.")
 

@client.command()
@commands.has_permissions(administrator=True)
async def ban(ctx, user : discord.Member = None, *,reason = "No reason provided"):
      await user.ban(reason = reason)
      await ctx.send("Banned the user")
    

@client.command()
@commands.has_permissions(administrator=True)
async def warn(ctx, user : discord.Member = None, *,reason = "No reason provided"):
      await user.send(f"You have been **Warned** by **ctx.author.name** in the **ctx.guild.name** for the reason: **reason** ")
      await ctx.send("Warned the user")
    

client.run(os.environ['token'])

在这个只有警告命令成功运行的情况下,所有命令都会抛出一个看起来像这样的错误。

Ignoring exception in command kick:
Traceback (most recent call last):
File "main.py", line 140, in kick
await user.kick(reason = reason)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/member.py", line 524, in kick
await self.guild.kick(self, reason=reason)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/guild.py", line 1886, in kick
await self._state.http.kick(user.id, self.id, reason=reason)
File "/app/.heroku/python/lib/python3.6/site-packages/discord/http.py", line 241, in request
raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions

它抛出了一个丢失的权限,但我是服务器的所有者,甚至将机器人添加为管理员。 甚至尝试通过设置管理员角色并为其授予所有权限,但仍然没有运气。 这个错误一再出现。

即使有人知道如何在多个角色之间进行检查,例如是否有人拥有管理员踢成员权限然后执行此操作,请告诉我如何执行此操作。 在此先感谢您的帮助。 如果需要更多信息,请告诉我。

【问题讨论】:

您尝试踢出的用户是否也具有管理员角色?机器人无法踢出具有比他更高层级的角色的人。 哦,是的。我试图踢出机器人,而机器人获得了管理员权限。你能告诉如何解决这个问题。就像应该有办法以管理员角色踢机器人一样。 你的机器人不应该有管理员角色,并且机器人永远无法踢出比他更高角色层次的人。 那么有没有办法让最高角色可以踢除主人以外的所有人 只需为机器人创建一个角色,然后在角色层次结构中将其放在管理员/所有者角色的下方。它可以踢除主人以外的所有人。 【参考方案1】:

您在控制台的最后一行遇到的错误; discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions 是因为机器人缺少针对机器人当前拥有的给定权限执行这些操作的权限。

这可能发生在以下情况;

尚未通过邀请链接启用足够的 Bot 权限 成员的角色高于或等于机器人 @everyone 角色没有权限

此外,这些问题与您编写的代码无关,可以通过角色层次结构或机器人邀请链接权限在您的服务器中修复。

我还建议比较角色,以确保用户首先无法尝试对更高级别的成员进行审核,这也有助于缓解问题

有了这个,您可以使用>=top_role 属性来比较用户与您尝试审核的成员的角色,如果您的权限低于您尝试审核的成员适度,它将阻止其余代码运行。这是一个简单的方法,

if member.top_role >= ctx.author.top_role:
    await ctx.send(f"You can only moderate members below your role")         
    return

【讨论】:

以上是关于@commands.has_permissions(administrator=True) 不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

允许您创建角色的命令

使用 Discord py 删除特定用户的消息

discord.py 保存服务器的变量设置更改

Discord.py Clean命令删除引脚

Discord Python Bot- 修复清除命令

如何让用户选择自己的嵌入颜色