我只是想让我的机器人在不一致的情况下向用户添加角色。虽然语法看起来很简单,但显然我做错了事。我是python的新手,所以我希望一些正确方向的指针!
active_record
在此示例中,他成功检索了成员,他找不到Egg角色,并且未添加该角色。 [编辑:我更正了该行以检索角色,该行有效,但仍然没有添加角色。添加了错误处理程序]
答案 0 :(得分:2)
关键问题是add_roles()将角色添加到Member对象而不是用户。
进行了一些调整...
add_role()
,以避免使用角色作为命令和变量。await member.add_roles(role)
尝试:
def get_member(discordname):
for guild in bot.guilds:
for member in guild.members:
if member.name == discordname:
return member
@bot.command(name='add_role')
async def add_role(ctx):
await ctx.message.channel.send("Testing roles")
member = get_member("Waldstein")
print(f'member is {member} type {type(member)}')
role = get(ctx.guild.roles, name="Egg")
print("role: ", role.name)
await member.add_roles(role)
print("done")
答案 1 :(得分:0)
为了答案,我正在写整个discord.utils.get
而不是get
。这是您的命令重写:
import discord
@bot.command()
async def role(ctx):
await ctx.send("Testing roles!")
member = discord.utils.get(bot.get_all_members(), name="Waldstein")
# be careful when getting objects via their name, as if there are duplicates,
# then it might not return the one you expect
print(f"id: {member.id}")
print(f"member: {member}")
role = discord.utils.get(ctx.guild.roles, name="Egg") # you can do it by ID as well
print(f"role: {role.name}")
await member.add_roles(role) # adding to a member object, not a user
print("Done!")
如果这不起作用,请尝试打印出类似这样的内容:
print(ctx.guild.roles)
,它应该返回机器人可以看到的每个角色。这样您可以手动调试它。
可能导致此问题的一件事是,如果机器人没有必要的权限,或者它的角色是以下,则您尝试获取的角色即鸡蛋处于位置1在层次结构中,机器人的最高角色是在位置2。
参考:
Guild.roles
Client.get_all_members()
Member.add_roles()
utils.get()
commands.Context
-我注意到您在使用一些多余的代码,请看一下以了解ctx