Как выбрать когда и какие обработчики будут выполняться?

Допустим, у меня есть этот код в Aiogram. Мне нужно, чтобы при запуске обработчика @dp.message(Text('Begin')) проверялись только те обработчики, которые находятся внутри этого обработчика. А когда пользователь написал End , то обработчики в @dp.message(Text('Begin')) уже не проверялись. И все что вне этого обработчика проверялось

Минимально воспроизводимый пример:

import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Text
from aiogram.filters.command import Command
from aiogram.utils.keyboard import ReplyKeyboardBuilder

logging.basicConfig(level=logging.INFO)
bot = Bot(token="TOKEN")
dp = Dispatcher()




@dp.message(Command("start"))
async def cmd_start(message: types.Message):
    builder = ReplyKeyboardBuilder()
    builder.row(
        types.KeyboardButton(text="Begin"),
    )
    await message.answer('Hello, press to button',        reply_markup=builder.as_markup(resize_keyboard=True))


@dp.message(Text('Begin'))
async def new_client_services(message: types.Message):
    builder = ReplyKeyboardBuilder()
    builder.row(
        types.KeyboardButton(text="End"),
    )
    await message.answer("Please write down all your items lying on the table one by one",
                         reply_markup=builder.as_markup(resize_keyboard=True))

    @dp.message(Text('End'))
    async def end_save_services(message: types.Message):
        await message.reply("Excellent",
                            reply_markup=types.ReplyKeyboardRemove())

    @dp.message()
    async def with_puree(message: types.Message):
        #  add part mysql
        await message.answer(f"Items {message.text} add✅\n")


@dp.message()
async def end_save_services(message: types.Message):
    await message.reply("Please, push button")


async def main():
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())


Нашел похожий вопрос, но все же он другой
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix
yellow
Судя по коду, Ваша проблема решается через FSM:

Создаете какой нибудь такой StatesGroup
form_router = Router()

class Form(StatesGroup):
    items = State()


В первой функции активируете состояние через state.set_state
@form_router.message(Text('Begin'))
async def new_client_services(message: types.Message, state: FSMContext):
    builder = ReplyKeyboardBuilder()
    builder.row(
        types.KeyboardButton(text="End"),
    )

    await state.set_state(Form.items)

    await message.answer("Please write down all your items lying on the table one by one", reply_markup=builder.as_markup(resize_keyboard=True))


А потом делаете такие декораторы, один который просто ловит все сообщения во время состояния "items", второй реагирует только в состоянии "items" с текстом "End". Там где состояние нужно завершить, вызывается "state.clear()"
@form_router.message(Form.items, Text('End'))
async def end_save_services(message: types.Message, state: FSMContext):
    await state.clear()
    await message.reply("Excellent", reply_markup=types.ReplyKeyboardRemove())

@form_router.message(Form.items)
async def with_puree(message: types.Message, state: FSMContext):
    await message.answer(f"Items {message.text} add✅\n")


https://docs.aiogram.dev/en/dev-3.x/dispatcher/fin...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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