Задать вопрос
selfish-psycho
@selfish-psycho

Как сделать расширенное ветвление логики телеграм бота?

Делаю телеграм бота, не могу придумать лучшего варианта для отслеживания сообщений пользователя по условиям.
Допустим, есть схема, по которой нужно производить разные операции (условия кидаю по inline_keyboard для отслеживания callback_data):
[Найти по ФИО] или [Найти по email]
В первом случае выбрасывается сообщение "Введи ФИО", во втором, соответственно, "Введи email". Как отличить, что пользователь ввел email, а не ФИО и наоборот? Это лишь пример, костыли в виде поиска "@" в сообщении не сработают.
Сейчас работает очень тяжёлая конструкция с записью в отдельный на сервере файл массивов с айдишниками последних сообщений, увеличенными на 2, сравнение айдишника текущего сообщения с тем, что лежит в файле и, при совпадении, дергается его значение (которое привязывается к ниму по нажатию на конкретную кнопку). Выглядит как решение, но, на практике, довольно сложно поддерживать такую конструкцию, когда условие не одно.
  • Вопрос задан
  • 424 просмотра
Подписаться 2 Простой 12 комментариев
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
Всё это решается машиной состояний. Скорее всего он есть в вашем фреймворке по умолчанию. А если и нет - то написать его ничего не стоит - создавайте состояния и для каждого chat_id храните текущее состояние. В каждом состоянии есть функции-триггеры, которые приводят к переключению состояния на другое, попутно выполняя что-то полезное
Я о конечных автоматах узнал из этой статьи, в своё время
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽