#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()
andon_reaction_add()
вместоon_raw_reaction_remove()
andon_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, я считаю, что на данный момент это последняя версия