无法为每个服务器 discord.py 获取自定义管理员角色

Posted

技术标签:

【中文标题】无法为每个服务器 discord.py 获取自定义管理员角色【英文标题】:Can't get custom admin roles for each server discord.py 【发布时间】:2020-11-29 13:48:04 【问题描述】:

我正在尝试创建一个“系统”,人们可以在其中更改有权访问管理命令的角色,但是它给我带来了一个错误,我不明白这怎么可能

代码:

def get_prefix(client, message):
    with open("prefixes.json", 'r') as f:
        prefixes = json.load(f)
    return prefixes[str(message.guild.id)]


@bot.command(name="changeadminrole", help="Choose the role that can execute admin commands")
async def changeadmin(ctx, role: Role):
    with open("admins.json", 'r') as f:
        admins = json.load(f)

    admins[str(ctx.guild.id)] = role.name

    with open("admins.json", 'w') as f:
        json.dump(admins, f, indent=4)

    await ctx.send(f"Admin role changed to role.mention")

然后检查人们是否具有所需的角色,我只是这样做:

@bot.command(name="kick", help="Kicks a member from the server")
@commands.has_role(get_adminrole)

即使我有这个角色,它也会给我这个错误:

discord.ext.commands.errors.MissingRole: Role <function get_adminrole at 0x03977220> is required to run this command.

我想知道为什么它检索的是 (&lt;function get_adminrole at 0x03977220&gt;) 而不是 admins.json 文件中存在的角色名称:


    "506201000374435850": "Absolute Admin"

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这是我用来做的全部代码。

我刚刚拿到了这里的角色,你可以继续写剩下的代码。

@bot.command()
async def changeadmin(ctx, *, role: discord.Role):
    # Code here
    await ctx.send(f"Admin role changed to role.mention")

最好保存角色 id insted of name 这样你就可以跳过role = .... 而只是return admins[str(message.guild.id)]

def get_adminrole(message):
    with open("admins.json", 'r') as f:
        admins = json.load(f)
    role = discord.utils.get(message.guild.roles, name=admins[str(message.guild.id)])
    return role.id

这里是如何使用 kick 命令的变通方法

@bot.command()
async def kick(ctx):
    admin_role_id = get_adminrole(ctx)
    if ctx.author not in ctx.guild.get_role(admin_role_id).members:
        await ctx.send("You are not an Admin")
        return

    # code here

【讨论】:

我按照你说的做了,现在我有 AttributeError: 'NoneType' object has no attribute 'id' 错误...它位于 get_adminrole 函数 return role.id 确保您的公会中有一个具有给定名称的角色。如果您打印role,它将显示None 修复它.. 不是 role = discord.utils.get(message.guild.roles, name=admins[str(message.guild.id)]) 就像你建议的那样我使用了 role = discord.utils.get(message.guild.roles, id=admins[str(message.guild.id)])

以上是关于无法为每个服务器 discord.py 获取自定义管理员角色的主要内容,如果未能解决你的问题,请参考以下文章

discord py - 自定义命令前缀不起作用(没有命令运行)

Discord.py 机器人不响应自定义表情符号

discord.py emoji 所有服务器机器人

Discord bot 添加对消息 discord.py 的反应(无自定义表情符号)

Discord.py 向自定义 ID 用户发送 DM

如何从 .json 文件 discord.py 中获取信息