Создание Main хендлера в aiogram

У меня есть три хендлера, каждый отвечает за обработку конкретной команды. Я хочу немного упростить работу для пользователя.

К примеру, юзер шлет запрос в бот, main хендлер его ловит и выдает юзеру инлайн клавиатуру с тремя кнопками. И при нажатии на какую-либо кнопку на клавиатуре, отправлялся запрос в конкретный хендлер для обработки. То есть, нужно в callbackdata передать объект message (именно объект, не его текст, чтобы могли следующие хендлеры с ним работать).

Но он может не влезть из-за ограничения. Натолкните на мысль, можно ли решить такой вопрос без создания велосипеда?


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

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

Рекомендую познакомиться с фабрикой калбека from aiogram.utils.callback_data import CallbackData

создаем фабрику vote

callback = CallbackData('vote', 'action', 'amount')

создаем калбек на фабрике vote

callback =callback.new(action=f'main', amount=f'open')

создаем клавиатуру

markup = types.InlineKeyboardMarkup()

указываем в калбек дату наш сгенерированный калбек

markup.add(types.InliteKeyboardButton(text='text', callback_data=callback))

отправляем сообщение await message.answer(text, reply_markup=markup)

сразу покажу как его словить

@dp.callback_query_handler(callback .filter(action='vote')) def .... Плохо могу передать мыслю читай по коду

→ Ссылка
Автор решения: oleksandrigo

Есть способ получить текущее сообщение в любом месте кода.

from aiogram import types

types.Message.get_current()

Ну и как аналоги

types.CallbackQuery.get_current()
types.User.get_current()
types.Chat.get_current()
Dispatcher.get_current()
Bot.get_current()

О а еще можно просто сохранить в стейт и потом вызвать его.

@dp.message_handler(commands=["start"])
async def start(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data["whatever_data"] = message.text
    await f()


async def f():
    cur_state = dp.current_state()
    async with cur_state.proxy() as data:
        print(data)
→ Ссылка