• Конечный автомат, в чем ошибка?

    Ranc58
    @Ranc58
    Backend python developer
    Вы не обяъвили STATE_DICT )

    В Вашем случае :
    import config
    import telebot
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}


    Во вторых не надо везде хендлить. Для этого вам и нужен конечный автомат - он отслеживает состояние и сам перекидывает на нужную функцию.

    Ниже полный пример. Должен работать(не уверен так как писал на память, но логика верная)

    import config
    import telebot
    from telebot import types
    
    bot = telebot.TeleBot(config.token)
    STATE_DICT = {}
    
    
    @bot.message_handler(commands=['start'])
    def start(message):
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        markup.add('Кнопка1')
        markup.add('Кнопка2')
        question = 'Выбери'
        chat_id = message.chat.id
        STATE_DICT[chat_id] = 'START'
        bot.send_message(chat_id, question, reply_markup=markup)
    
    
    def start_work(message):
        chat_id = message.chat.id
        markup = types.ReplyKeyboardMarkup(
            one_time_keyboard=False,
            resize_keyboard=True
        )
        if message.text == 'Кнопка1':
            STATE_DICT[chat_id] = 'VAR1'
            markup.add('Кнопка3')
            markup.add('Кнопка4')
            bot.send_message(chat_id, 'Вы выбрали ответ 1', reply_markup=markup)
        else:
            STATE_DICT[chat_id] = 'VAR2'
            markup.add('Кнопка5')
            markup.add('Кнопка6')
            bot.send_message(chat_id, 'Вы выбрали ответ 2', reply_markup=markup)
    
    
    def var1(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка3':
            bot.send_message(chat_id, 'Конец с кнопкой3')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой2')
    
    
    def var2(message):
        chat_id = message.chat.id
        if message.text == 'Кнопка5':
            bot.send_message(chat_id, 'Конец с кнопкой5')
        else:
            STATE_DICT[chat_id] = 'VAR2'
            bot.send_message(chat_id, 'Конец с кнопкой6')
    
    
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        states = {
            'START': start_work,
            'VAR1':  var1,
            'VAR2':  var2,
        }
        chat_id = message.chat.id
        states[STATE_DICT[chat_id]](message)
    
    
    if __name__ == '__main__':
      bot.polling(none_stop=True)
    Ответ написан
    1 комментарий
  • Почему зависает бот при отправке сообщения в подменю telegram?

    Ranc58
    @Ranc58
    Backend python developer
    По поводу вопроса 2:
    Реализуйте конечный автомат и отслеживайте состояние.
    Совсем упрощенный пример:
    @bot.message_handler(func=lambda message: True)
    def start_finite_machine(message):
        if STATE_DICT[chat_id] == 'position_1':
            position_1(message)
        elif STATE_DICT[chat_id] == 'position_2':
             position_2(message)
        elif STATE_DICT[chat_id] == 'position_3':
            position_3(message)
    Ответ написан
    1 комментарий