Как принимать N количество сообщений от пользователя? Telegram API, Spring boot
Не могу понять как заставить бота ждать ответ, или если говорить кратко, то ищу способ сделать сценарий из N-го количества ответов. Пример:
- Юзер: /add
- Бот: Введите название
- Юзер: test
- Бот: введите количество
- Юзер: 12
И так далее, думаю суть ясна. Проблема появляется уже во время первого ответа, так как если я буду писать логику в одном кейсе (add), то при следующем сообщении от юзера в onUpdateReceived оно не попадёт в тот же кейс add. Искал варианты, и много где говорили, что нужно запомнить состояние бота, но там по логике они могли принимать 1 ответ, а мне нужно N(>1). В Python есть библотека, которая помогает решить эту проблему, может быть в Java тоже. Если знаете - напишите, буду очень благодарен!
Ответы (3 шт):
Чтобы сохранять состояния одного пользователя между запросами, используйте SpringSecurity session. После авторизации сессия возвращается в заголовке и на стороне клиента может быть сохранена для дальнейшего использования.
Без SpringSecurity можно самому сделать имитацию сессии - при первом запросе в базе данных создать запись, для которой сгенерировать id сесии и туда же сложить данные из первого запроса. Этот идентификатор отправить в ответе фронтенду, и потом включить его второй запрос, тогда на бэкенде вы сможете из базы извлечь данные пришедшие с первым запросом соответствующие этой сессии
Столкнулся с похожей проблемой, решил созданием базы данных H2, где создавал boolean колонки, где отмечал пройдённый этап, для каждого нового chatId. Их нужно сохранять сразу при первом контакте с пользователем, например при нажатии /start.
В вашем случае тоже можно ставить галочку после каждого ответа пользователя.
Бот: Введите название
Юзер: test
-- UPDATE TABLENAME -- SET is_user_send_name = true -- WHERE chat_id='1111' findNextFalseFieldForUser()Бот: введите количество
Юзер: 12
-- UPDATE TABLENAME -- SET is_user_send_count = true -- WHERE chat_id='1111'
Решение кажется мне сомнительным, но оно работает. Есть ещё интересная альтернативная библиотека: https://github.com/pengrad/java-telegram-bot-api Можно поискать варианты решения там. Как по мне она удобнее официальной.
Есть два пути решения проблемы:
- Найти готовое решение и его использовать
- Реализовать самостоятельно конечный автомат и хранить текущее состояние пользователя.