Выход из состояния в FSM Aiogram
Проблема возникает в момент вызова другой функции с кнопки. Когда запускается определенное состояние, в котором бот воспроизводит меню, если пользователь нажмет на какую-либо другую копку на replay клавиатуре, то состояние завершится, но не выдаст новое действие которое запросил пользователь, что бы это действие сработало пользователь должен еще раз нажать на кнопку, которую он хочет активировать. Надеюсь проблема понятна. (В момент запущенного состояния, что бы пользователь смог открыть другое меню, его нужно вызвать два раза. 1 раз - завершает состояние, 2 раз - запускает новую функцию. Нужна идея фикса вот этой проблемы...)
poster = ['any url', 'any url', 'any url']
name = ['test1', 'test2', 'test3']
storage = MemoryStorage()
bot = Bot(TOKEN)
dp = Dispatcher(bot=bot,
storage=storage)
class Test(StatesGroup):
Q1 = State()
next_button = InlineKeyboardButton(text='next', callback_data='next')
back_button = InlineKeyboardButton(text='back', callback_data='back')
nbtn_callback = [next_button.callback_data, back_button.callback_data]
nbtn = InlineKeyboardMarkup(row_width=True)
nbtn_next = InlineKeyboardMarkup(row_width=True)
nbtn_next.add(next_button)
nbtn.row(back_button, next_button)
a = KeyboardButton('cancel')
b = KeyboardButton('Photo')
menu = ReplyKeyboardMarkup(resize_keyboard=True)
menu.row(a, b)
@dp.message_handler(commands=['start'])
async def start_bot(message: types.Message):
txt = "Добро пожаловать!\n"
await message.answer(txt, reply_markup=menu)
await message.delete()
@dp.message_handler(text='Photo', state=None)
async def photo(message: types.Message):
reply_markup = nbtn_next
await Test.Q1.set()
await bot.send_photo(
message.chat.id,
photo=poster[0],
reply_markup=reply_markup,
caption=name[0],
)
@dp.message_handler(text='cancel', state=None)
async def cancel(message: types.Message):
ph = "any url photo"
await bot.send_photo(chat_id=message.chat.id,
photo=ph)
@dp.callback_query_handler(state=Test.Q1)
async def photo_update(callback: types.CallbackQuery, state: FSMContext):
if callback.data == "next":
i = await state.get_data()
i = i.get("answer")
if i is None:
i = 1
else:
i += 1
file_path = poster[i]
await state.update_data(
{"answer": poster.index(file_path)}
)
file = InputMedia(media=file_path, caption=name[i])
await callback.message.edit_media(file, reply_markup=nbtn)
@dp.message_handler(content_types=types.ContentType.TEXT, state=Test.Q1)
async def stop_state(message: types.Message, state: FSMContext):
await state.finish()
Источник: Stack Overflow на русском