aiogram bot. Как в машине состояний принимать текст до тех пор, пока не будет введено нужное количество слов?
Есть бот на aiogram, который принимает заказы. Я использую машину состояний, и мне нужно, чтобы бот мог фильтровать введенное пользователем тз, то есть если слов меньше 10, то тз считается коротким и нужно расписать его подробнее
@dp.message_handler(state=Form.order)
async def ordering(message: types.Message, state: FSMContext):
global o
async with state.proxy() as data:
ordr = message.text
if 'Обратно в меню' in ordr:
await message.answer('Меню', reply_markup=kb.inline_kb_full)
await Form.next()
elif len(ordr.split()) < 10:
await message.answer('Слишком короткое тз, распишите подробнее')
await Form.order.set()
elif len(ordr.split()) >= 10:
ind = len(o) + 1
o.append([ind, ordr])
await message.answer('Ваш заказ принят. Ожидайте, в ближайшее время с вами свяжутся', reply_markup=kb.inline_kb_full)
await Form.next()
я попытался сделать это следующим образом: если слов < 10, то заново сделать
await Form.order.set()
однако это не работает, потому что если сначала ввести слов < 10, а потом больше, то бот просто не отвечает. Как это можно пофиксить?
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
@dp.message_handler(state=Form.order)
async def ordering(message: types.Message, state: FSMContext):
# собственно забудьте про глобальные переменные. Юзайте стейт дату.
# которая у вас открыта но вы её игнорите
async with state.proxy() as data:
ordr = message.text
if 'Обратно в меню' in ordr:
await message.answer('Меню', reply_markup=kb.inline_kb_full)
await Form.next()
elif len(ordr.split()) < 10:
await message.answer('Слишком короткое тз, распишите подробнее')
# просто оставьте текущий стейт, смысл его менять?
# await Form.order.set()
elif len(ordr.split()) >= 10:
# вот так записывайте в стейт
# не уверен для чего вам номер заказа, но я лично не вижу особого смысла
# у вас у каждого юзера своя data, потому вы не ошибетесь открыв его у него
data['order'] = ordr
await message.answer('Ваш заказ принят. Ожидайте, в ближайшее время с вами свяжутся',
reply_markup=kb.inline_kb_full)
# только если условие выполнено меняйте стейт
await Form.next()
PS. Очень важно помнить что при state.finish() данные будут утеряны. Потому учитывайте это