【问题标题】:Python - Is it possible to wait_for one event or another in Discord.py-v1.0?Python - 是否可以在 Discord.py-v1.0 中等待一个事件或另一个事件?
【发布时间】:2020-04-13 10:24:02
【问题描述】:

是否有任何使用wait_for 的方式来等待reaction_addreaction_remove

我已经看到有 on_reaction_addon_reaction_remove 函数,但我想要一种没有这些函数的方法。

我想要这样的东西:

reaction,user=await bot.wait_for('reaction_add/reaction_remove',check=check)

【问题讨论】:

    标签: python python-3.x discord.py discord.py-rewrite


    【解决方案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()
    

    【讨论】:

    • 如何从任务中获取reactionuser 变量?
    • @ProfessorDragon:done_tasks 中的对象是正常的等待对象,你只是碰巧知道awaiting 他们不会阻塞;你可以做for task in done_tasks: reaction, user = await task
    • 另外,您知道查看哪个事件发生的方法吗? (例如,判断它是添加还是删除的反应......)
    • @ProfessorDragon:在我链接的文档中,有一个示例(警告确保类型在传入时已经是任务)。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多