Как мне определить элемент внутри on_raw_reaction_remove()?

#discord.py #discord.py-rewrite

#discord.py #discord.py-переписать

Вопрос:

Я попытался написать код, который удалит роль из участника при добавлении определенной реакции. Мой код работает нормально до конца, когда роль удаляется из участника, где появляется сообщение «Ошибка атрибута»; «AttributeError: объект ‘NoneType’ не имеет атрибута ‘remove_roles'»

Вот мой код:

 @client.event
async def on_raw_reaction_remove(payload):
    await client.wait_until_ready()

    guild = await client.fetch_guild(payload.guild_id)
    member = get(guild.members, id=payload.user_id)

    if payload.message_id == id:
        if payload.emoji.name == "a":
            role = discord.utils.get(guild.roles, name = "a")
        elif payload.emoji.name == "b":
            role = discord.utils.get(guild.roles, name = "b")           
        await member.remove_roles(role)
 

Я предполагаю, что я неправильно определяю member, но я понятия не имею, как это исправить

Ответ №1:

В этой ситуации client.get_user() работает лучше.

Вот исправленный код

 @client.event
async def on_raw_reaction_remove(payload):
    await client.wait_until_ready()

    guild = await client.fetch_guild(payload.guild_id)
    member = client.get_user(id=payload.user_id)

    if payload.message_id == id:
        if payload.emoji.name == "a":
            role = discord.utils.get(guild.roles, name = "a")
        elif payload.emoji.name == "b":
            role = discord.utils.get(guild.roles, name = "b")           
        await member.remove_roles(role)
 

Надеюсь, это помогло!

Комментарии:

1. К сожалению, нет, продолжает отображаться та же проблема; «Ошибка атрибута: объект ‘User’ не имеет атрибута’remove_roles'».

2. хммм, может быть, вам стоит попробовать client.get_member()

3. «Ошибка атрибута: объект ‘Client’ не имеет атрибута ‘get_member'», похоже, все еще не работает:(

4. Я знаю, что на данный момент я просто предполагаю, не зная, но guild.get_member(payload.user_id) определенно должен работать. Извините за мою невероятную глупость

Ответ №2:

Основная причина этого payload.member заключается None в том, что при использовании on_raw_reaction_remove .
На самом деле это потому, что discord не отправляет эти данные, поэтому discord.py имеет это как None .
Source-https://github.com/Rapptz/discord.py/issues/5871

Чтобы обойти это, вы получаете объект гильдии, о котором идет речь, затем берете объект-член из гильдии. Полезная нагрузка также не имеет объекта guild, поэтому мы также должны получить его.

Что я сделал, так это то, что я фактически создал объект-член и прикрепил его к полезной нагрузке вручную в случае on_raw_reaction_remove . Таким образом, оба on_raw_reaction_add и on_raw_reaction_remove имеют одинаковую полезную нагрузку для моей окончательной обработки.

 async def on_raw_reaction_remove(self, payload):    
  guild = self.get_guild(payload.guild_id)  #Self here is Client/Bot
  member = guild.get_member(payload.user_id)
  payload.member = member
  await reaction_role(payload, remove=True)
 

Кроме того, для этого требуется намерение привилегированных членов. Чтобы включить его, снова войдите на портал разработчика и найдите привилегированные намерения> намерение участника, затем установите ползунок в положение вкл.

 intent = discord.Intents.default()
intent.members = True
 

Намерение должно быть передано клиенту или оболочке бота, если используется расширение бота.

 commands.Bot.__init__(self, <...>, intents=intent)