Как принимать N количество сообщений от пользователя? Telegram API, Spring boot

Рейтинг: 0Ответов: 3Опубликовано: 14.04.2023

Не могу понять как заставить бота ждать ответ, или если говорить кратко, то ищу способ сделать сценарий из N-го количества ответов. Пример:

  • Юзер: /add
  • Бот: Введите название
  • Юзер: test
  • Бот: введите количество
  • Юзер: 12

И так далее, думаю суть ясна. Проблема появляется уже во время первого ответа, так как если я буду писать логику в одном кейсе (add), то при следующем сообщении от юзера в onUpdateReceived оно не попадёт в тот же кейс add. Искал варианты, и много где говорили, что нужно запомнить состояние бота, но там по логике они могли принимать 1 ответ, а мне нужно N(>1). В Python есть библотека, которая помогает решить эту проблему, может быть в Java тоже. Если знаете - напишите, буду очень благодарен!

Ответы

▲ 0

Чтобы сохранять состояния одного пользователя между запросами, используйте SpringSecurity session. После авторизации сессия возвращается в заголовке и на стороне клиента может быть сохранена для дальнейшего использования. Без SpringSecurity можно самому сделать имитацию сессии - при первом запросе в базе данных создать запись, для которой сгенерировать id сесии и туда же сложить данные из первого запроса. Этот идентификатор отправить в ответе фронтенду, и потом включить его второй запрос, тогда на бэкенде вы сможете из базы извлечь данные пришедшие с первым запросом соответствующие этой сессии

▲ 0

Столкнулся с похожей проблемой, решил созданием базы данных 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 Можно поискать варианты решения там. Как по мне она удобнее официальной.

▲ 0

Есть два пути решения проблемы:

  1. Найти готовое решение и его использовать
  2. Реализовать самостоятельно конечный автомат и хранить текущее состояние пользователя.