Discord py,如何使用角色 metanion 删除权限

时间:2021-01-02 08:21:52

标签: discord discord.py

我想使用角色提及从服务器中具有相应角色的用户中删除角色。 例如,“%remove_role@TEAM_A”从具有“TEAM_A”角色的人员的角色中删除“TEAM_A”。 我在谷歌上努力搜索,但我找不到答案或方法,所以我自己做了,但我没能完成,所以我在这里写了一个问题。

  • 第一。 %rmrole 团队名称
  • 第二。检查您输入的团队名称是否在“role_list”中。
  • 第三。删除服务器上用户输入的团队名称的角色。

这是我的代码。

@bot.command()
async def rmrole(ctx, team_name):
    key = 0
    role = get(ctx.guild.roles, name=team_name)
    team_list = []
    print(role)
    # typo check
    role_list = ["TEAM_A", "TEAM_B", "TEAM_C", "TEAM_D"]
    if role in role_list:
        type_error = 1
    else:
        type_error = 0

    # remove_role
    empty = True
    if type_error == 1:
        for member in ctx.guild.members:
            if role in member.roles:
                await member.remove_roles(role)
                empty = False
        if empty:
            await ctx.send("anyone has this role.")
    else:
        await ctx.send("check the typos."    
async def remove_role(ctx, role: discord.Role)

我担心如果我这样写,用户会收到很多警报。 因此,在正文中,我以文本形式输入角色名称,并以扫描代码中角色的方式编写。

搜索并找到了“#remove_role”部分。 代码被执行,但角色没有被移除。

我想知道哪里出错了,我需要帮助来制作我想要的东西。

1 个答案:

答案 0 :(得分:1)

你的错误很简单:

role_list = ["TEAM_A", "TEAM_B", "TEAM_C", "TEAM_D"]
if role in role_list:
    type_error = 1
else:
    type_error = 0

此代码将始终失败并导致 type_error = 0,因为 rolediscord.role.Role 类而不是字符串。这意味着比较您通过 get 获得的角色和表示其名称的字符串将始终失败:因此,永远不会访问删除角色的代码的第二部分。否则它会起作用。

相反,你想要:

if role.name in role_list:
    type_error = 1
else:
    type_error = 0

或者更好的是,改为:

if role is None:
    return await ctx.send("Role doesn't exist")

...因为我个人不太明白您的代码的意义:如果 role = get(ctx.guild.roles, name=team_name) 失败(即角色不存在),role 将是 None,并且您可以轻松地检查它,而不是将它与硬编码列表进行比较。