Как отменить команды asyncio.sleep в discord.py - PullRequest
0 голосов
/ 12 марта 2020

У меня в боте есть команда таймера, она использует 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 Ответ

0 голосов
/ 12 марта 2020

Ссылка Прервать все asyncio.sleep, выполняющиеся в настоящее время

Кредиты на { ссылка } для кода асинхронности.

Вы можете добавить эту функцию (Винсент):

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(), или он будет не работает.

Теперь проблема, с которой мы сталкиваемся сейчас, заключается в том, что с этим кодом; мы отменяем все таймеры; что, конечно, не то, что мы хотим, поскольку будут очевидные конфликты. Как вы могли go сделать это, зависит только от вас; но вы можете попытаться добавить идентификатор в функцию сна, которая хранится в userID. Это действительно зависит от вас, но это теория и основной код c.

...