Почему не читается хендлер при двух роутерах callback_query (Aiogram 3.0.0b8)
Возникла проблема при написании телеграм-бота с примитивной экономикой. Первой идеей было сделать простую игру, в которой нужно было решать примеры, но я натолкнулся на проблему.
Кратко об игре: Чтобы зайти в стартовое "меню" этой игры, нужно было нажать кнопку из другого меню, либо выйти из самой игры (вернуться в меню).
Игра запускается и работает нормально. Если решить пример правильно - напишет, если неправильно - тоже напишет. Однако выйти из этой игры посредством кнопок, которые она предлагает невозможно. Приходится либо листать переписку с ботом, чтобы найти кнопку в другие меню (там автоматически пользователю перекидывается стейт verified_user для дальнейшей нормальной работы), либо останавливать бота.
Я не понимаю, почему не срабатывают хэндлеры kudos_calculator и kudos_calculator_playing чтобы выйти из игры или начать ее заново после того, как игра началась.
Часть кода из handlers.py:
@router.callback_query(lambda c: c.data == 'finance_menu')
async def finance_menu(cbq: types.CallbackQuery, state: FSMContext):
await cbq.message.answer('Вот твое финансовое меню (ЭТОТ ТЕКСТ НЕ ИЗ TEXT .PY, ЕГО НУЖНО ТУДА КИНУТЬ)',
reply_markup=kb.fin_menu)
await state.set_state(Verified.verified_user)
@router.callback_query(lambda c: c.data == 'kudos_calc')
@router.callback_query(lambda c: c.data == 'kudos_calc_finish')
async def kudos_calculator(cbq: types.CallbackQuery, state: FSMContext):
await cbq.message.answer('Добро пожаловать в Kudos Calculator! Это первая игра, где ты сможешь зарабатывать '
'KUDOS! Тебе нужно всего лишь решать математические примеры! Чтобы начать, '
'нажми на кнопку "Начать игру" (НЕ ИЗ ФАЙЛА ТЕКСТА)', reply_markup=kb.kudos_calc)
@router.callback_query(lambda c: c.data == 'kudos_calc_start')
@router.callback_query(lambda c: c.data == 'kudos_calc_restart')
async def kudos_calc_playing(cbq: types.CallbackQuery, state: FSMContext):
global a_value, b_value, c_value
a_value = randint(1, 999)
b_value = randint(1, 999)
c_value = a_value + b_value
await cbq.message.answer(f"{text.kudos_calc_solve}<b>{a_value}+{b_value}</b>?", reply_markup=kb.kudos_calc_quit)
await state.set_state(Verified.kudos_calc_solving)
@router.message(Verified.kudos_calc_solving)
async def kudos_calc_solving(msg: Message, state: FSMContext):
kudos = randint(1,3)
if str(msg.text) == str(c_value):
await msg.answer(f'Ты угадал! На твой счет зачислено {kudos} KUDOS', reply_markup=kb.kudos_calc_finish)
else:
await msg.answer('К сожалению, ты был не прав! Попробуй решить другой пример!', reply_markup=kb.kudos_calc_finish)
Весь код из kb.py: (Клавиатуры)
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove
game_start_btn = InlineKeyboardButton(text='Начать регистрацию', callback_data='start_reg')
game_start = InlineKeyboardMarkup(inline_keyboard=[
[game_start_btn],
])
menu_transfer_btn = InlineKeyboardButton(text='Перейти в меню', callback_data='to_menu_transfer')
menu_transfer = InlineKeyboardMarkup(inline_keyboard=[
[menu_transfer_btn],
])
menu_b1 = InlineKeyboardButton(text='Мой профиль', callback_data='my_profile')
menu_b2 = InlineKeyboardButton(text='Меню финансов', callback_data='finance_menu')
menu_b3 = InlineKeyboardButton(text='Топы', callback_data='top_menu')
menu_b4 = InlineKeyboardButton(text='Настройки', callback_data='settings') # ВНЕ ИСПОЛЬЗОВАНИЯ НА МОМЕНТ 26.06.2023
menu_b5 = InlineKeyboardButton(text='Информация (Credits)', callback_data='creator_info')
menu = InlineKeyboardMarkup(inline_keyboard=[
[menu_b1],[menu_b2],
[menu_b3],[menu_b5],
])
fin_menu_b1 = InlineKeyboardButton(text='Заработать в Kudos калькуляторе', callback_data='kudos_calc')
fin_menu = InlineKeyboardMarkup(inline_keyboard=[
[fin_menu_b1],[menu_transfer_btn],
])
kudos_calc_b1 = InlineKeyboardButton(text='Начать игру', callback_data='kudos_calc_start')
kudos_calc_b2 = KeyboardButton(text='Выйти из игры', callback_data='kudos_calc_finish')
kudos_calc_b3 = KeyboardButton(text='Ещё один пример', callback_data='kudos_calc_restart')
kudos_calc = InlineKeyboardMarkup(inline_keyboard=[
[kudos_calc_b1],[menu_b2],
])
kudos_calc_quit = ReplyKeyboardMarkup(keyboard=[
[kudos_calc_b2]
], resize_keyboard = True)
kudos_calc_finish = ReplyKeyboardMarkup(keyboard=[
[kudos_calc_b3],[kudos_calc_b2]
], resize_keyboard = True, input_field_placeholder='Чего бы тебе хотелось?')