如何取消 discord.py 中的 asyncio.sleep 命令

Posted

技术标签:

【中文标题】如何取消 discord.py 中的 asyncio.sleep 命令【英文标题】:How to cancel asyncio.sleep commands in discord.py 【发布时间】:2020-06-23 22:51:29 【问题描述】:

我的机器人中有一个计时器命令,它使用 asyncio.sleep。如果用户愿意,我想发出一个命令来取消计时器。

@bot.command()
async def timer(ctx, time: int):
   await ctx.send('Timer set for ' + str(time) + ' seconds')
   await asyncio.sleep(time)
   await ctx.send('Time over!')

有没有办法这样做,(我更喜欢不创建新文件的方法,在同一个文件中进行)

【问题讨论】:

【参考方案1】:

引用Interrupt all asyncio.sleep currently executing

感谢https://***.com/users/2846140/vincent 的异步代码。

您可以添加此功能(由 vincent 提供):

def make_sleep():
    async def sleep(delay, result=None, *, loop=None):
        coro = asyncio.sleep(delay, result=result, loop=loop)
        task = asyncio.ensure_future(coro)
        sleep.tasks.add(task)
        try:
            return await task
        except asyncio.CancelledError:
            return result
        finally:
            sleep.tasks.remove(task)

    sleep.tasks = set()
    sleep.cancel_all = lambda: sum(task.cancel() for task in sleep.tasks)
    return sleep

在这种情况下的用法是:

@bot.command()
async def timer(ctx, time: int):
   await ctx.send('Timer set for ' + str(time) + ' seconds')
   await sleep(time)
   await ctx.send('Time over!')

@bot.command()
async def canceltimers(ctx):
    sleep.cancel_all()
    await asyncio.wait(sleep.tasks)
    await ctx.send('Timers cancelled')

您的bot.run(token) 将放在sleep = make_sleep() 之前的位置,否则它将不起作用。

现在,我们现在面临的问题是这段代码;我们取消所有的计时器;这当然不是我们想要的,因为会有明显的冲突。你如何去做这完全取决于你。但是您可以尝试在由 userID 存储的 sleep 函数中添加一个标识符。这完全取决于您,但这是其背后的理论和基本代码。

【讨论】:

以上是关于如何取消 discord.py 中的 asyncio.sleep 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个命令终止 discord.py 中的异步函数

我需要帮助在 discord py 中创建 discord py temp 静音命令

如何删除discord.py中的消息[重复]

如何删除 discord.py 中的消息信息?

Discord.py如何删除服务器中的所有角色

如何访问discord.py中的哪个语音通道用户写入命令?