Хранение состояния

Текущий бот

Золотая рыбка

Золотая рыбка

def weather(message):
    if message.text == '/start':
        bot.send_message(
            message.chat.id,
            'Это погодный бот: он умеет подсказывать погоду на сегодня и на завтра',
        )
    elif message.text == 'Привет':
        bot.reply_to(message, 'Ну привет! ' + message.from_user.first_name )
    elif message.text == 'Погода на сегодня':
        bot.reply_to(message, '14 градусов')
    elif message.text == 'Погода на завтра':
        bot.reply_to(message, '18 градусов')
    else:
        bot.reply_to(message, 'Я тебя не понял')

Золотая рыбка

Конечный автомат состояний

FSM

Конечный автомат состояний

FSM

Конечный

Автомат

Состояний

FSM

Продумываем шаги

Рисуем

Как бы мы реализовавали это?

while True:
    inp = input()
    if inp == 'Погода':
        inp = input()
        if inp == 'Сегодня':
           ...
        elif inp == 'Завтра':
           ...
        else:
           ...
           continue
    else:
        continue

Мы забыли про альтернативные выходы

Реализация в ботах

states = {100205: 'weather_date', 50123: 'main'}

@message_handler
def dispatcher(message):
  user_id = message.from_user.id
  current_user_state = states.get(user_id, 'main')

  if current_user_state == "main":
    main_handler(message)
  elif current_user_state == "weather_date":
    weather_date_handler(message)
  ...

Реализация в ботах

Реализация в ботах

states = {100205: 'weather_date', 50123: 'main'}

def main(message):
  if message.text == 'Погода':
    send_message('Уточни дату')
    states[message.from_user.id] = 'weather_date'
  ...

Реализация в ботах

states = {100205: 'weather_date', 50123: 'main'}

@message_handler
def dispatcher(message):
  user_id = message.from_user.id
  current_user_state = states.get(user_id, 'main')

  if current_user_state == "main":
    main_handleer(message)
  elif current_user_state == "weather_date":
    main_handleer(message)
  ...

[54636] State Storage

By b0g3r

[54636] State Storage

  • 325