Можно ли использовать wait_for таким образом, что он будет ждать reaction_add или reaction_remove?

Я видел, что есть функции on_reaction_add и on_reaction_remove, но я бы хотел сделать это без них.

Я хочу что-то вроде этого:

reaction,user=await bot.wait_for('reaction_add/reaction_remove',check=check)
2
Professor Dragon 21 Дек 2019 в 05:52

1 ответ

Лучший ответ

Поскольку это похоже на использование средств asyncio, используйте встроенные средства. Просто создайте задачу для каждого, затем используйте asyncio.wait, чтобы дождаться первого срабатывания:

pending_tasks = [bot.wait_for('reaction_add',check=check),
                 bot.wait_for('reaction_remove',check=check)]
done_tasks, pending_tasks = await asyncio.wait(pending_tasks, return_when=asyncio.FIRST_COMPLETED)

Когда одна из задач завершится, это вернется, и задача, которая была удовлетворена, появится в наборе done_tasks. Если после завершения одной из них вас больше не интересуют другие задачи, вы можете продолжить и отменить другие, например:

for task in pending_tasks:
    task.cancel()
3
ShadowRanger 21 Дек 2019 в 03:20