#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)