Бот записи без сети · Шаг 2 из 4
Ход разговора
Записаться — это не одно сообщение, а разговор: что делаем, в какой день, во сколько, всё верно? Бот между сообщениями ничего не помнит сам: Telegram присылает их по одному, и каждое может быть ответом на свой вопрос — или командой посреди разговора, «/otmena», когда человек передумал.
Поэтому бот хранит состояние — на каком шаге разговор и что уже выбрано, — и на каждое сообщение отвечает по одному правилу: состояние и сообщение → ответ и новое состояние. Это машина состояний, и на ней сделан любой бот записи.
Что сделать
По состоянию разговора и новому сообщению решите, что ответить и в каком состоянии остаться.
Что приходит
sostoyanie— словарь:{"shag": "den", "usluga": "ТО"}— на каком шаге разговор и что уже выбраноsoobshchenie— разобранное сообщение из шага 1:("komanda", "zapis")или("tekst", "2")okna— свободное время по дням:{"03.12": ["09:00", "11:00"], "04.12": []}
Что вернуть
Пару (ответ, новое_состояние): строка ответа и новый словарь; полученный словарь не меняйте.
Допишите функцию shag в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Бот зовёт shag на каждое сообщение и запоминает новое состояние до следующего. Решите шаг — и с ботом можно будет поговорить: он спросит, что делаем, когда и во сколько.
Разговор начинается в {"shag": "nachalo"}. Человек пишет /zapis — бот отвечает «Что делаем? 1 — ТО, 2 — шиномонтаж, 3 — диагностика.» и переходит в {"shag": "usluga"}. Человек пишет 2 — бот спрашивает день и переходит в {"shag": "den", "usluga": "шиномонтаж"}.
shag({"shag": "nachalo"}, ("komanda", "zapis"), {"03.12": ["09:00"]})
('Что делаем? 1 — ТО, 2 — шиномонтаж, 3 — диагностика.', {'shag': 'usluga'})
Шаги разговора: nachalo → usluga → den → vremya → podtverdit → gotovo. Услуги — по номерам: 1 — ТО, 2 — шиномонтаж, 3 — диагностика. Состояние несёт то, что уже выбрано: usluga, den, vremya.
Команды действуют на любом шаге:
zapis→ «Что делаем? 1 — ТО, 2 — шиномонтаж, 3 — диагностика.», состояние{"shag": "usluga"}(всё выбранное забывается);otmena→ «Запись отменена.» и{"shag": "nachalo"}; если разговор и так вnachaloилиgotovo— «Отменять нечего.» и{"shag": "nachalo"};snyat→ «Снимаю вашу запись…» и{"shag": "snyat"};startиpomosh→ справка «Я записываю в автосервис Валеры. /zapis — записаться, /snyat — снять свою запись, /otmena — прервать разговор.», состояние прежнее;- любая другая → «Не знаю такой команды. /pomosh — что я умею.», состояние прежнее.
Текст (и пустое сообщение, как текст "") — по шагу:
nachalo,gotovo,snyat→ «Напишите /zapis, чтобы записаться.» и{"shag": "nachalo"};usluga:1,2или3→ вопрос о дне и шагdenсusluga. Вопрос о дне: «Какой день? Свободно: 03.12, 05.12.» — дни изoknaв их порядке, только те, где свободный список не пуст. Если таких дней нет — «Свободных дней нет — позвоните Валере.» и{"shag": "nachalo"};den: день, у которого вoknaесть свободное время, → «Во сколько? Свободно: 09:00, 11:00.» (время этого дня по порядку) и шагvremyaсden;vremya: время из свободных в этот день → «Записываю: шиномонтаж, 03.12 в 11:00. Верно? (да/нет)» и шагpodtverditсvremya;podtverdit:да→ «Проверяю время…» и шагgotovo(выбранное сохраняется — запишет его шаг 4);нет→ «Хорошо, не записываю. /zapis — начать заново.» и{"shag": "nachalo"}.
Непонятный ответ на шагах usluga, den, vremya — «Не понял. » и тот же вопрос заново, на podtverdit — «Не понял. Ответьте «да» или «нет».»; состояние прежнее.
Возвращайте новый словарь, а полученный не меняйте: оболочка хранит старое состояние, пока не получит ответ.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.