Python discord.py on_reaction_removed() не вызывается

#python #discord.py

#python #discord.py

Вопрос:

Я пишу discord-бота. У меня есть следующий код:

 @client.event
async def on_reaction_add(reaction, user):
    print("on_reaction_add called")

@client.event
async def on_reaction_remove(reaction, user):
    print("on_reaction_remove called")

# same problem if I remove this part
@client.event
async def on_raw_reaction_remove(payload):
    print("on_raw_reaction_remove called")
  

Однако, если я запускаю бота и реагирую на событие, а затем снова удаляю реакцию, я вижу:

 on_reaction_add called
on_raw_reaction_remove called
  

Как вы можете видеть, on_reaction_remove никогда не вызывается. У меня должны быть правильные разрешения, поскольку on_reaction_add() работает правильно. Это также означает, что сообщение должно быть в кэше сообщений, поскольку в противном on_reaction_add случае оно также не будет работать. on_raw_reaction_remove все еще вызывается, поэтому он, должно быть, правильно определил, что я удалил реакцию.

Обратите внимание, что даже если я не включаю on_raw_reaction_remove событие, я получаю ту же проблему.

Есть ли проблема с моим кодом, это проблема с discord.py или есть что-то, чего я не понимаю?

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

1. Почему вы используете on_reaction_remove() and on_reaction_add() вместо on_raw_reaction_remove() and on_raw_reaction_add() в первую очередь?

2. @MrMetacom Очень удобно иметь доступ к сообщению, и в любом случае меня интересуют только последние сообщения, поэтому не проблема, если реакции будут пропущены до запуска бота

Ответ №1:

Проблема в том, что, в отличие on_reaction_add от, on_reaction_remove требуется, чтобы и сообщение, и пользователь могли быть найдены в кэше.

К счастью, убедиться, что каждый пользователь находится в кэше, довольно просто. Вам нужно Intents.members включить intent в вашем боте, чтобы он мог предварительно извлекать список участников канала при запуске и on_reaction_remove мог быть вызван правильно.

Смотрите недавно добавленный комментарий в документации

Ответ №2:

Если вы прочитаете документацию on_raw_reaction_remove , вы заметите что-то, в ней говорится:

Вызывается, когда к сообщению добавляется реакция. В отличие от on_reaction_add() , это вызывается независимо от состояния внутреннего кэша сообщений.

Это означает, что необработанные события вызываются, даже если сообщения нет в кэше бота, тогда как обычные реакции вызываются, когда сообщение находится в кэше бота.

В этом проблема, сообщение, из которого вы удаляете реакцию, отсутствует в кэше бота, поэтому оно не запускает обычное событие, но оно запускает необработанное событие.

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

1. Хорошо, но почему on_reaction_add тогда вызывается? Разве это не зависит от того же кэша? Сообщение, о котором идет речь, было отправлено ботом всего за несколько секунд до этого, срок действия кэша не должен истекать так быстро

2. используете ли вы последнюю версию discord.py ?

3. Я использую версию 1.5.1, я считаю, что на данный момент это последняя версия