Объект 'Пользователь' не имеет атрибута 'add_roles' - PullRequest
0 голосов
/ 06 августа 2020

При попытке выполнить 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 ]

2 голосов
/ 06 августа 2020

Вы пытаетесь добавить роль к объекту user, однако они могут быть добавлены только к объектам member. В то время как user представляет пользователя в разногласиях, member представляет члена гильдии. Дополнительная информация о членах в документации

0 голосов
/ 06 августа 2020

Пользовательский объект не связан напрямую с гильдией. По этой причине у него нет функций для добавления к нему ролей. Поскольку роли являются частью функций гильдии.

Если мы хотим исправить это, нам нужно получить объект, связанный с гильдией. В этом случае наиболее близким совпадением является объект 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. Мы видим, что это может быть намного эффективнее без необходимости поиска через бота.

Например, в документации событий вы видите, что мы получаем объект полезной нагрузки . Объект полезной нагрузки имеет следующие данные (и многое другое, просто прочтите документацию):

  • объект-член
  • идентификатор гильдии
  • идентификатор канала
  • идентификатор пользователя
  • идентификатор сообщения

Обратите внимание, что у нас есть объект-член . Мы можем получить из него следующее:

Таким образом, обновление старого кода до следующего увеличивает производительность, поскольку нам это не нужно. искать информацию через бота без всяких опасений. Примечание: в этом примере я удалил некоторый избыточный код, я предполагаю, что вы запускаете этого бота только в одной гильдии, потому что вы используете определенные c 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)
...