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