@Nolrox
Python-разработчик

Как сделать реагирование на реакции в discord.py?

Возможно ли сделать так, чтобы бот реагировал на реакцию определённого человека? Например чтобы бот по команде с упоминанием "+hi @test" отправлял сообщение "привет" с реакцией ✅, и если на эту реакцию нажимает именно этот @test, то он отправляет сообщение "привет @test". А если он не нажимает на реакцию 30 секунд, то сообщение удаляется. Если возможно, то как?
  • Вопрос задан
  • 598 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
В обработчике команды:
1. Делаешь хранилище, словарь-dict с ключом вида (message id, user id) и значением в виде объектов asyncio.Event.
2. Когда отправляешь сообщение для реакции, помещаешь в хранилище пару (id сообщения, id адресата), а значением задаешь новый asyncio.Event().
3. С помощью asyncio.wait_for() и Event.wait() ждешь срабатываения этого объекта Event или желаемого таймаута.
4. Если объект сработал и функция wait_for() вернула значение, то реакция была. Действуешь соответственно.
5. Если wait_for() выбросила asyncio.TimeoutError, то произошел таймаут. Действуешь соответственно.
В обоих случаях удаляешь из хранилища ключ (id сообщения, id адресата)

Что касается реакции, то тебе нужно событие on_raw_reaction_add() и ассоциированный с ним объект класса RawReactionActionEvent. Оттуда можно достать сведения о пользователе, сообщении и эмодзи. Ищешь в хранилище пару (id сообщения, id пользователя), если нашел - значит, это одно из наших специальных сообщений. В обработчике этого события выбираешь соответствующей этой паре объект asyncio.Event и дергаешь его метод set(), чтобы просигналить вышеприведенному алгоритму (он тогда пойдёт по ветке 4). Иначе не делаешь ничего.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы