Декоратор не срабатывает на состояние FSM aiogram 3
Всем привет, может банальный вопрос, но голову уже сломал и конкретных ответов не нашёл.
Декоратор вроде ловит изменение состояния FSM, но async def
как будто работают только после отправки сообщения пользователем.
Конкретно в той части, где юзер отправляет картинку для считывания текста (ContentType.PHOTO
), FSM должна переключиться на финальную часть регистрации, отправив сообщения с картой клиента.
Но этого не происходит, причем событие "поймано" по логам.
Подскажите, с чем это может быть связано? Я только неделю в питоне, ума не приложу...
Вот FSM:
class Registration(StatesGroup):
start = State()
name_add = State()
phone_add = State()
loc_add = State()
ltd_add = State()
ltd_loc_add = State()
bank_name = State()
card = State()
Вот сам код:
@router.message(F.text == 'Зарегистрироваться')
async def user_star(message: Message, state: FSMContext, bot: Bot)->None:
await bot.delete_message(message.chat.id, message.message_id)
await state.set_state(Registration.start)
await message.answer('Как Вас зовут?', reply_markup=types.ReplyKeyboardRemove())
await state.update_data(name_add=message.text)
await state.set_state(Registration.name_add)
@registration_router.message(Registration.name_add)
async def user_name(message: Message, state: FSMContext,)->None:
global name
name = message.text
await message.reply('Приятно познакомиться!')
await message.answer(f'{str(name)}, напишите свой номер телефона, либо поделитесь контактом', reply_markup=share_phone())
await state.set_state(Registration.phone_add)
@registration_router.message(F.content_type == ContentType.CONTACT)
async def contact_handler(message: types.Message, state: FSMContext)->None:
global phone
phone = str(message.contact.phone_number)
await message.reply('Спасибо, обещаем не спамить :)', reply_markup=types.ReplyKeyboardRemove())
await state.update_data(phone_add=message.contact.phone_number)
await message.answer('Теперь напишите адрес и название Вашего заведения')
await state.set_state(Registration.loc_add)
@registration_router.message(Registration.phone_add)
async def user_phone(message: Message, state: FSMContext, bot: Bot)->None:
global phone
phone = message.text
await message.reply('Спасибо, обещаем не спамить :)')
await state.update_data(phone_add=message.text)
await message.answer('Теперь напишите адрес и название Вашего заведения')
await state.set_state(Registration.loc_add)
@registration_router.message(Registration.loc_add)
async def user_loc(message: Message, state: FSMContext, bot: Bot)->None:
global location
location = message.text
await message.answer('Отлично, осталось немного формальностей:')
await asyncio.sleep(1)
await state.update_data(loc_add=message.text)
await bot.send_message(chat_id=message.chat.id, text='Напишите форму и название Вашего юр. лица.'
'\nК примеру "ООО Гойда" или "ИП Иванов Иван Иванович"'
'\nИНН: 1234567890')
await asyncio.sleep(1)
await message.answer('Либо отправьте картинкой карточку юр. лицо с реквизитами.')
if message.photo:
await state.set_state(Registration.card)
await state.set_state(Registration.ltd_add)
@registration_router.message(F.content_type == ContentType.PHOTO)
async def download_photo(message: Message, bot: Bot, state: FSMContext):
await bot.send_message(chat_id=message.chat.id, text='Обрабатываем картинку...')
await state.set_state(Registration.card)
await bot.download(
message.photo[-1],
destination=f"C:\\Users\\Homie\\Desktop\\bot\\Orc\\{message.photo[-1].file_id}.jpg")
global photo_loc
photo_loc = f"C:\\Users\\Homie\\Desktop\\bot\\Orc\\{message.photo[-1].file_id}.jpg"
global id_card
id_card = f'{str(ocr_photo(filename=photo_loc)).replace('[', '').replace(']', '').replace(r'\n', '\n').replace(r'\r', '\r').replace(r'\t', '\t')}'
await asyncio.sleep(1)
global i
i = 1
@registration_router.message(Registration.ltd_add)
async def user_ltd(message: Message, state: FSMContext) -> None:
global ltd
ltd = message.text
await state.update_data(ltd_add=message.text)
await message.answer('Так, хорошо. Ваш юридический адрес?')
await state.set_state(Registration.ltd_loc_add)
@registration_router.message(Registration.ltd_loc_add)
async def user_ltd_loc(message: Message, state: FSMContext, bot: Bot) -> None:
global ltd_loc
ltd_loc = message.text
await message.answer('Принял')
await asyncio.sleep(1)
await state.update_data(ltd_loc_add=message.text)
await bot.send_message(chat_id=message.chat.id, text='Осталось совсем чуть-чуть!')
await asyncio.sleep(1)
await bot.send_message(chat_id=message.chat.id, text='Введите основные реквизиты банка: р/cч, кор/сч, БИК')
await state.set_state(Registration.bank_name)
@registration_router.message(Registration.bank_name)
async def user_bank_name(message: Message, state: FSMContext, bot: Bot) -> None:
global bank_name
bank_name = message.text
await state.update_data(bank_name=message.text)
await bot.send_message(chat_id=message.chat.id, text='Поздравляю, мы закончили! :)')
await asyncio.sleep(1)
await message.answer('Готово!', reply_markup=profile())
await state.set_state(Registration.card)
@registration_router.message(Registration.card)
async def user_card(message: Message, state: FSMContext, bot: Bot) -> None:
await bot.send_message(chat_id=message.chat.id, text='Подведём итоги...')
await asyncio.sleep(1)
id_name = str(name)
id_phone = str(phone)
id_loc = str(location)
id_ltd = str(ltd)
id_ltd_loc = str(ltd_loc)
id_bank = str(bank_name)
pic_id = str(id_card)
await bot.send_message(chat_id=message.chat.id, text=f'Итак, Ваш профиль:')
await asyncio.sleep(1)
await bot.send_message(chat_id=message.chat.id, text=f'\nВаше имя: {id_name}'
f'\nВаш телефон: {id_phone}'
f'\nАдрес заведения: {id_loc}'
f'\nЮр. лицо: {id_ltd}'
f'\nЮр. адрес: {id_ltd_loc}'
f'\nРеквизиты: {id_bank}'
)
if i == 1:
await bot.send_message(chat_id=message.chat.id, text=f'\nВаше имя: {id_name}'
f'\nВаш телефон: {id_phone}'
f'\nАдрес заведения: {id_loc}'
f'\nКарта юр. лица: {pic_id}')
await bot.send_message(chat_id=message.chat.id, text='Спасибо за регистрацию! :)', reply_markup=menu_reg())