FSM aiogram Как сделать правильно?
Всем привет!
Хочу сделать так:
1)Бот отправляет инлайн клавиатуру с названиями корпусов
2)Пользователь выбирает корпус
3)Бот просит ввести номер аудитории с клавиатуры
4)К примеру, пользователь ввел "233", т.к начинается с цифры "2", бот отправит фотографию 2го этажа.
Инлайн клавиатура:
kb_student = InlineKeyboardMarkup(row_width=1).add(
InlineKeyboardButton(text='Студенческая жизнь', callback_data='culture')) \
.add(InlineKeyboardButton(text='Учебный процесс', callback_data='ucheba')) \
.add(InlineKeyboardButton(text='Навигация в кампусе', callback_data='gps')) \
.add(InlineKeyboardButton(text='Навигация в корпусах', callback_data='nav'))
kb_korpusa = InlineKeyboardMarkup(row_width=4).row(
InlineKeyboardButton(text='Главный корпус', callback_data='korp_gk')).row(
InlineKeyboardButton(text='Корпус №1', callback_data='korp_1'))
Вот часть кода, которая отвечает за это:
class number(StatesGroup):
number_of_korpus = State()
number_audit = State()
@dp.message_handler(commands=['start', 'help'])
async def command_start(message: types.Message):
await message.answer(f'Привет!\n'
'Я - твой личный помощник.\n'
'И я помогу тебе в твоей адаптации.\n', reply_markup=kb_student)
await message.delete()
@dp.callback_query_handler(text='nav')
async def nav_call(callback: types.CallbackQuery):
await number.number_of_korpus.set()
await callback.message.answer('Выберите корпус', reply_markup=kb_korpusa)
@dp.callback_query_handler(state=number.number_of_korpus)
async def audit_(callback: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
data['number_of_korpus'] = callback.message.text
await number.next()
await callback.message.answer('С помощью клавиатуры введите номер аудитории')
@dp.message_handler(state=number.number_audit)
async def naviga(callback: types.CallbackQuery, state: FSMContext):
if callback.data == Text(startswith='1'):
await bot.send_photo(callback.message.chat.id, photo=open("путь к файлу"))
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Пробуйте
class InputClassroomNumber(StatesGroup):
number_classroom = State()
@dp.message_handler(commands=['start', 'help'])
async def command_start(message: types.Message):
kb_student = InlineKeyboardMarkup(row_width=1).add(
InlineKeyboardButton(text='Студенческая жизнь', callback_data='culture')) \
.add(InlineKeyboardButton(text='Учебный процесс', callback_data='ucheba')) \
.add(InlineKeyboardButton(text='Навигация в кампусе', callback_data='gps')) \
.add(InlineKeyboardButton(text='Навигация в корпусах', callback_data='nav'))
await message.answer(text=f'Привет!\n'
f'Я - твой личный помощник.\n'
f'И я помогу тебе в твоей адаптации.\n',
reply_markup=kb_student)
await message.delete()
@dp.callback_query_handler(text='nav')
async def nav_call(callback: types.CallbackQuery):
kb_korpusa = InlineKeyboardMarkup(row_width=4).row(
InlineKeyboardButton(text='Главный корпус', callback_data='korp:gk')).row(
InlineKeyboardButton(text='Корпус №1', callback_data='korp:1'))
await callback.message.answer('Выберите корпус', reply_markup=kb_korpusa)
@dp.callback_query_handler(text_startswith='korp:')
async def corp_choise(callback: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
data['corpus_name'] = callback.data
await callback.message.answer('С помощью клавиатуры введите номер аудитории')
await InputClassroomNumber.number_classroom.set()
@dp.message_handler(state=InputClassroomNumber.number_classroom)
async def naviga(message: types.Message, state: FSMContext):
if message.text.isdigit():
async with state.proxy() as data:
data['classroom_number'] = message.text
# в data["corpus_name"] у вас будет korp:gk или korp:1, помните это
await message.answer(text=f'Вы выбрали аудиторию корпуса {data["corpus_name"]} '
f'{data["classroom_number"]}')
# так как нужно просто отсекать число то вот так
floor = message.text[:1]
# Как вы храните свои изображения я хз, потому вот как вариант для вас
data_with_img = {
"korp:gk": "path",
"korp:1": "path2",
}
await message.answer_photo(photo=open('plans/' + data_with_img[data["corpus_name"]] + '.jpg', 'rb'))
await state.reset_state(with_data=False)