Как я могу прервать цикл в discord.py команда при выполнении другой команды?

#python #loops #command #discord.py

#python #циклы #команда #discord.py

Вопрос:

 @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() завершения, чего я не хочу. Любая помощь вообще будет оценена.

Ответ №1:

Используйте 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")