Как остановить выполнение кода до ввода следующего сообщения

Пишу бота для своего сервера, есть вот такая функция

async def buy_currency(ctx, arg):
    embed_obj = discord.Embed()
    embed_obj.title = f'**Вы точно хотите получить {arg} валюты? (да/нет).**'
    embed_obj.colour = 0x0000E10B #C++ HEX - Colormania
    await ctx.send(embed=embed_obj)
    if ctx.message.text == 'да':
        garant_temp_text = f'''Ожидайте, вам напишет администратор для приобретения валюты.'''
        embed_obj = discord.Embed()
        embed_obj.description = garant_temp_text
        embed_obj.title = '**Заявка на покупку зарегестрирована.**'
        embed_obj.colour = 0x0000E10B #C++ HEX - Colormania
        await ctx.send(embed=embed_obj)

        user = bot.get_user(414776948145782784)
        garant_t_help_text = f'''Игрок {ctx.author.mention} хочет купить валюту.'''
        embed_obj = discord.Embed()
        embed_obj.description = garant_t_help_text
        embed_obj.title = '**Покупка валюты**'
        embed_obj.colour = 0x0000E10B #C++ HEX - Colormania
        await user.send(embed=embed_obj)
    else:
        await ctx.send('wtf')

Нужно, что бы код после if ctx.message.text выполнялся ТОЛЬКО после ввода ещё одного сообщения.


Ответы (1 шт):

Автор решения: eri

Обработку заказа ввдели в отдельную функцию.

Параметры клади в какой-то список, стек, очередь вместе с этой функцией. Например создай карирование через functools.partials

Да\нет принимай новым сообщением, забирай функцию с очереди и выполняй.


Отвечая на вопрос - прерывать программу тоже можно.

Нужно создать объект типа asyncio.Future https://docs.python.org/3/library/asyncio-future.html#asyncio.Future И поместить его в словарик.

yesno_fut[user] = loop.create_future()

Дальше делаешь if (await yesno_fut[user]) :

На этом месте твоя функция преврвалась.

При ответе да вызывается новый обработчик, в котором

yesno_fut[user].set_result(True)

После этого await что был выше исполнится и в if попадет True

→ Ссылка