Как задать разные действия telegram-боту для одинаковых условий?

Есть 2 условия для телеграмм бота. Первое:

if message.text.isdigit():
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)

    price.append(message.text)

    item1 = types.KeyboardButton('Не учитывать сумму')

    back = types.KeyboardButton('Назад')
    markup.add(item1, back)

    bot.send_message(message.chat.id, 'Введите минимальную сумму'.format(message.from_user), reply_markup=markup)

То есть юзер отправляет число и это число добавляется в список price

И второе условие:

if message.text.isdigit():
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)

    limit.append(message.text)

    item1 = types.KeyboardButton('Всё верно. Отправить')

    back = types.KeyboardButton('Начать заново')
    markup.add(item1, back)

    bot.send_message(message.chat.id, f'{price} ...... {limit} ....',
                                      reply_markup=markup)

Здесь так же юзер отправляет число, но тут оно отправляется в список limit

Проблема в том, что когда на этапе price юзер пишет число, то оно одновременно отправляется и в список limit, так как условие одно и то же. Есть варианты это исправить?


Ответы (1 шт):

Автор решения: Павел

Мало знаком с Telegram-ботами, но предложу такое решение с точки зрения здравого смысла.

Судя по тексту в вопросе ваши условия являются "одинаковыми" только на том уровне, на каком вы их реализовали.

Имею в виду, что в коде у вас проверяется только то, что пользователь ввел цифру, а на деле он мог ввести эту цифру в разные моменты времени, то, что вы называете этапами.

Но самой реализации этапов внутри бота у вас просто нет, в этом и проблема. Если знакомы с теорией автоматов, то вам будет легко понять о чем я говорю.

К чему я веду:

  1. Вам нужно в логике бота реализовать хранение текущего этапа current_stage, на котором сейчас находится пользователь в процессе взаимодействия.
  2. Тогда уже, когда он будет вводить цифру дополнительно проверять на каком сейчас этапе находится пользователь и от этого отстраивать дальнейшую логику.

Эта строка if message.text.isdigit(): превратится в if message.text.isdigit() and current_stage == SOME_STAGE:, а второй if заменится на аналогичный, но только с проверкой другого этапа.

  1. Это позволяет реализовать внутри бота различное взаимодействие при одном и том же поведении пользователя в разных состояниях, что решит вашу проблему за счет того, что разные ветки логики работы будут изолированы друг от друга.
→ Ссылка