Задать вопрос
@Nolrox
Python-разработчик

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

Возможно ли сделать так, чтобы бот реагировал на реакцию определённого человека? Например чтобы бот по команде с упоминанием "+hi @test" отправлял сообщение "привет" с реакцией ✅, и если на эту реакцию нажимает именно этот @test, то он отправляет сообщение "привет @test". А если он не нажимает на реакцию 30 секунд, то сообщение удаляется. Если возможно, то как?
  • Вопрос задан
  • 615 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 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). Иначе не делаешь ничего.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
23 дек. 2024, в 16:13
50000 руб./за проект
23 дек. 2024, в 15:25
5000 руб./за проект
23 дек. 2024, в 14:47
4500 руб./за проект