无法为每个服务器 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.
我想知道为什么它检索的是 (<function get_adminrole at 0x03977220>
) 而不是 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 - 自定义命令前缀不起作用(没有命令运行)