尝试在await member.add_roles(role)
是用户的情况下执行member
时,出现以下错误:
'User' object has no attribute 'add_roles'
但是,当我在网上看时,却没有提及这样的错误,这意味着该错误不会发生。
如果有帮助,这是发生此错误的代码部分:
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
guild = discord.utils.get(bot.guilds, name='The Molehill')
channel = bot.get_channel(740608959207047250)
member = await bot.fetch_user(payload.user_id)
message = await channel.fetch_message(payload.message_id)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
rules_message = message=await channel.fetch_message(740891855666806866)
role = discord.utils.get(guild.roles, name="Worker Mole", id=739514340465705027)
if payload.emoji.name == EMOJI:
if message == rules_message:
await member.add_roles(role)
await bot.send(MESSAGE)
答案 0 :(得分:2)
您正在尝试将角色添加到user
对象中,但是只能将它们添加到member
对象中。 user
代表不和谐的用户,而member
代表行会的成员。
More information on members in the documentation
答案 1 :(得分:1)
用户对象未与公会直接链接。这就是它没有向其添加角色的功能的原因。角色是公会功能的一部分。
如果要解决此问题,我们需要获取与公会链接的对象。在这种情况下,最接近的匹配是member
对象。
因此,代替检索用户对象和检索成员对象应该可以解决问题:
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
guild = discord.utils.get(bot.guilds, name='The Molehill')
channel = bot.get_channel(740608959207047250)
member = await guild.get_member(payload.user_id)
message = await channel.fetch_message(payload.message_id)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
rules_message = message=await channel.fetch_message(740891855666806866)
role = discord.utils.get(guild.roles, name="Worker Mole", id=739514340465705027)
if payload.emoji.name == EMOJI:
if message == rules_message:
await member.add_roles(role)
await bot.send(MESSAGE)
但是当我们阅读有关on_raw_reaction_add
的文档时。我们看到,这样可以更加高效,而无需通过机器人进行查找。
例如,在event documentation中,您看到一个payload object。 有效负载对象具有以下数据(更多内容请阅读文档):
请注意,我们有一个member object。 我们可以从中检索以下内容:
因此,将旧代码更新为以下代码可以提高性能,因为我们不需要通过机器人不必要地查找内容。注意:在此示例中,我删除了一些冗余代码,我假设您只在1个行会中运行了该漫游器,因为您使用的是特定ID,而该ID在其他行会中将无效。
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
member = payload.member
guild = member.guild
# If you want to run your bot on multiple guilds. Then the code under this comment should be updated.
channel = guild.get_channel(740608959207047250)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
role = guild.get_role(739514340465705027)
if payload.emoji.name == EMOJI:
await member.add_roles(role)
await bot.send(MESSAGE)