有没有办法取消挂起的 bot.wait_for?

时间:2021-03-05 22:48:08

标签: discord.py

我有以下代码:

self.current_task = self.bot.wait_for('message', check=check, timeout=10 * 60)
response = await self.current_task

但是,如果同一类中的另一个函数中的条件变为真,我希望 bot.wait_for 取消。我试过做 self.current_task.close(),但是它在返回 nonetype 之前仍然等待响应/超时。

1 个答案:

答案 0 :(得分:0)

你可以有一个变量来评估条件是否满足,在检查函数中只需检查它是否满足并引发错误并在 try/except 块中捕获它

def check(m):
    if self.is_condition_met: # Change the variable accordingly
         raise # Whatever error you want
    return # normal check

一个例子是

class SomeCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.is_condition_met = False

    @commands.command()
    async def met(self, ctx):
        self.is_condition_met = True

    @commands.command()
    async def foo(self, ctx):
        await ctx.send("Please send a message")
 
        def check(m):
            if self.is_condition_met:
                raise RuntimeError("condition is met")
            return ctx.author == m.author

        try:
            message = await bot.wait_for("message", check=check, timeout=20.0)
        except TypeError:
            await ctx.send("Condition was met")
        except asyncio.TimeoutError:
            await ctx.send("Time is over")

如果您先调用 foo 命令,然后调用 met 命令,则等待应在有人发送消息后立即取消