如何在执行另一个命令时打破 discord.py 命令中的循环?

How can I break a loop in a discord.py command upon execution of another command?

@client.command()
async def activate(ctx, quote, delay: int):
    await ctx.send("Successfully activated SpamMode")
    global a
    a = 1
    while a == 1:
        await ctx.send(quote)
        time.sleep(delay)

所以我在我的 discord 机器人中有这个命令(用 discord.py 制作),它所做的基本上是发送一条消息 quote,每条消息之间有一个延迟 delay(在秒)我用 while 循环实现了它,有没有办法在执行不同的命令时打破循环而不必等待 time.sleep(delay) 完成?

@client.command()
async def deactivate(ctx):
    global a
    a = 2
    await ctx.send("Successfully deactivated SpamMode")

所以基本上当前发生的情况是,如果我尝试使用此命令来停止上一个命令的工作,我必须等待 time.sleep() 完成,这是我不想要的。任何帮助都将不胜感激。

使用tasks.loop。您可以使用 cancel() 方法

立即停止它们

示例:

from discord.ext import tasks

@client.command()
async def activate(ctx, quote, delay: int):
    global spam_loop

    @tasks.loop(seconds=delay)
    async def spam_loop(q):
        await ctx.send(q)

    spam_loop.start(quote)
    await ctx.send("Successfully activated SpamMode")

@client.command()
async def deactivate(ctx):
    spam_loop.cancel()
    await ctx.send("Successfully deactivated SpamMode")