“用户”对象没有属性“ add_roles”

时间:2020-08-06 16:17:21

标签: python discord discord.py discord.py-rewrite

尝试在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)

2 个答案:

答案 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)