'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。 有效负载对象具有以下数据(更多请阅读文档):

请注意我们有一个 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)