@ArtemMik
Python

Как выключить цикл в тг боте?

У меня есть тг бот, у него есть инлайн клавиша и после нажатия на неё срабатывает код библиотеки Telethon, который подключается к аккаунтам, я смог сделать чтобы при нажатии на инлайн клавишу у меня запускался код, но тут стоит вопрос а как выключить его?

Весь нужный код:

@dp.message_handler(text='вкл/выкл код')
async def all_message(message: types.CallbackQuery):
    if message.from_user.id == int(ADMIN_ID):
        await bot.send_message(message.chat.id, "Код запущен, если вы хотите отключить код, то нажмите /off")
        from main_fun import main
        asyncio.run(main())



@dp.message_handler(commands=['off'])
async def off_command(message: types.Message):
    if message.from_user.id == int(ADMIN_ID):
        await bot.send_message(message.chat.id, "Код был остановлен", reply_markup=admin_panel)
        # тут мне надо этот бесконечный цикл выключить, но чтобы тг бот остался рабочим
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
@codingoleg
Для aiogram 2.25.1 я решил этот вопрос через добавление и удаление задач и глобальные переменные. Возможно, костыли, но работает. В данном случае будет запускаться только одна задача, которая проверяется флагом is_running.
task = Future()
is_running = False

async def infinite_loop():
    counter = 0
    while True:
        await asyncio.sleep(1)
        print(counter)
        counter += 1

@dp.message_handler(text='вкл/выкл код')
async def all_message(message: types.Message):
    global task, is_running
    if message.from_user.id == int(ADMIN_ID):
        if is_running:
            await bot.send_message(message.from_user.id, "Код уже запущен")
        else:
            await bot.send_message(message.from_user.id,
                                   "Код запущен, если вы хотите отключить код, то нажмите /off")
            # Создаем задачу
            is_running = True
            task = asyncio.create_task(infinite_loop())
            # Добавляем в пул для выполнения
            await asyncio.gather(task)

@dp.message_handler(commands=['off'])
async def off_command(message: types.Message):
    global is_running
    if message.from_user.id == int(ADMIN_ID):
        if is_running:
            await bot.send_message(message.chat.id, "Код был остановлен")
            # Отменяем задачу
            task.cancel()
            is_running = False
            # Убираем из пула выполнения
            await asyncio.gather(task)
        else:
            await bot.send_message(message.chat.id, "Код еще не запущен")

executor.start_polling(dp, skip_updates=True)

Если вам нужно запустить несколько задач (одинаковых или нет) через команду вкл/выкл, просто удалите этот флаг и все проверки, связанные с ним. В этом случае проблема будет только с завершением более 1 задачи. Если нужно будете, напишите сюда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы