Задать вопрос
@Anatoliy3247932847

Как остановить цикл при нажатии на кнопку aiogram?

У меня есть цикл, в нем с определенной периодичностью отправляются сообщения в бота aiogram в Telegram. При отправке сообщения появляются 2 кнопки: одна ссылкой, другая >>> должна останавливать цикл. Как мне обработать кнопку так, чтобы после ее нажатия цикла отправки сообщений прекратился.

Вот сам цикл:
for i in range(12):
        # можно просто callback ниже прописать и все работать должно
        await asyncio.sleep(5)
        await bot.send_message(callback_query.from_user.id,
                                f"Напоминание:\nУ вас есть скидка {db.get_sale(callback_query.from_user.id)}% на первую покупку по промокоду {db.get_promocode(callback_query.from_user.id)} на {db.get_style(callback_query.from_user.id)} набор\n\nУ вас есть скидка 15% на первое продление по {db.get_promocode(callback_query.from_user.id)} промокуду", reply_markup=keybards.TrueMenu)


А это кнопки

TrueMenu = InlineKeyboardMarkup(row_width=3)
TrueBtn1 = InlineKeyboardButton(text="Купить", url="https://t.me/CoolHead_admin")
TrueBtn2 = InlineKeyboardButton(text="Уже купил", callback_data="TrueMenu_2")
TrueBtn3 = InlineKeyboardButton(text="Уже продлил", callback_data="TrueMenu_3")
TrueMenu.insert(TrueBtn1).insert(TrueBtn2).insert(TrueBtn3)


Помогите новичку! )
Я пробовал хендлер с Callback настроить, но что то не вышло!
  • Вопрос задан
  • 1171 просмотр
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@teenager_python
В библиотеке aiogram, чтобы остановить цикл при нажатии на кнопку, вы можете использовать метод register_callback_query_handler() в сочетании с stop_propagation=True, чтобы предотвратить дальнейшую обработку событий.
# Создаем состояние, в котором мы ожидаем нажатие на кнопку
class MyStates(StatesGroup):
    waiting_for_button = State()

# Обработчик команды /start
@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    # Отправляем сообщение с кнопкой
    keyboard = types.InlineKeyboardMarkup()
    button = types.InlineKeyboardButton(text="Остановить", callback_data="stop")
    keyboard.add(button)
    await message.answer("Нажмите на кнопку, чтобы остановить цикл", reply_markup=keyboard)

    # Устанавливаем состояние "waiting_for_button"
    await MyStates.waiting_for_button.set()

# Обработчик нажатия на кнопку
@dp.callback_query_handler(Text(equals="stop"), state=MyStates.waiting_for_button)
async def stop_callback(query: CallbackQuery, state: FSMContext):
    # Останавливаем цикл и удаляем состояние
    await query.answer("Цикл остановлен")
    await state.finish()
    # Вызываем stop_propagation=True, чтобы предотвратить дальнейшую обработку событий
    return await query.message.edit_text("Вы остановили цикл", reply_markup=None, disable_web_page_preview=True, stop_propagation=True)

# Запускаем бота
if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы