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

时间:2021-02-19 11:35:26

标签: discord discord.py bots

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

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 个答案:

答案 0 :(得分:0)

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

这可能发生在以下情况;

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

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

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

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

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