我想使用角色提及从服务器中具有相应角色的用户中删除角色。 例如,“%remove_role@TEAM_A”从具有“TEAM_A”角色的人员的角色中删除“TEAM_A”。 我在谷歌上努力搜索,但我找不到答案或方法,所以我自己做了,但我没能完成,所以我在这里写了一个问题。
这是我的代码。
@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”部分。 代码被执行,但角色没有被移除。
我想知道哪里出错了,我需要帮助来制作我想要的东西。
答案 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
,因为 role
是 discord.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
,并且您可以轻松地检查它,而不是将它与硬编码列表进行比较。