'User' 对象没有属性 'add_roles'
'User' object has no attribute 'add_roles'
当尝试执行 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)
您正在尝试将角色添加到 user
个对象,但是它们只能添加到 member
个对象。 user
代表不和谐的用户,而 member
代表公会的成员。
More information on members in the documentation
用户对象不与公会直接关联。这就是它没有向其添加角色的功能的原因。由于角色是公会功能的一部分。
如果我们想解决这个问题,我们需要获得一个与公会相关联的对象。在这种情况下,最接近的匹配是 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 you see we get a payload object。
有效负载对象具有以下数据(更多请阅读文档):
- a member object
- 公会id
- 频道编号
- 用户编号
- 消息编号
请注意我们有一个 member object。
我们可以从中检索以下内容:
因此,将旧代码更新为以下内容可以提高性能,因为我们不需要不必要地通过机器人查找内容。注意:我在这个例子中删除了一些冗余代码,我假设你只在 1 个公会中 运行 这个机器人,因为你使用的是在其他公会中不起作用的特定 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)
当尝试执行 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)
您正在尝试将角色添加到 user
个对象,但是它们只能添加到 member
个对象。 user
代表不和谐的用户,而 member
代表公会的成员。
More information on members in the documentation
用户对象不与公会直接关联。这就是它没有向其添加角色的功能的原因。由于角色是公会功能的一部分。
如果我们想解决这个问题,我们需要获得一个与公会相关联的对象。在这种情况下,最接近的匹配是 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 you see we get a payload object。 有效负载对象具有以下数据(更多请阅读文档):
- a member object
- 公会id
- 频道编号
- 用户编号
- 消息编号
请注意我们有一个 member object。 我们可以从中检索以下内容:
因此,将旧代码更新为以下内容可以提高性能,因为我们不需要不必要地通过机器人查找内容。注意:我在这个例子中删除了一些冗余代码,我假设你只在 1 个公会中 运行 这个机器人,因为你使用的是在其他公会中不起作用的特定 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)