Что такое бот

1. Что такое бот, как его понять изнутри

Если описать внутреннее представление бота в двух словах, то бот (в рамках этого конструктора) это совокупность именованных страниц с текстом и кнопками. Текст и кнопки на экране вашего клиента - это результат выполнения какой либо команды. Имя блока текста совпадает с менем команды для простоты восприятия.

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

Так давайте попытаемся понять - что такое бот. Посмотрим ссылку на любой сайт. После имени сайта вы видине несколько зачастую английских слов разделенных символом / (слеш), например, https://www.reg.ru/support в данном случае запись /support - это ничто иное как страница которую сайт вам должен показать. Не кажется ли вам, что это и есть команды ботам, которые мы используем в телеграме? Так вот бота можно представить как сайт. И когда вы пишете бота, то представьте, что вы пишете сайт. А что такое сайт - это совокупность отдельных страничек с ссылками-пероеходами. Адрес ссылки вы также прописываете на сайте как /help /support и т.д. Так вот в боте мы то же будем придерживаться этой системы - страницы с именем. Именем страницы и будет наша команда Например первая же страница любого бота это /start - совпадает с именем команды?

2. Пишем бота

Если мы уже поняли, что мы будем писать сайт, простите, бот, то мы будем писать каждую страничку отдельно. В любом боте точно так же это и реализовано. Ссылками перехода у нас будут инлайн кнопки под сообщением. Кнопки, которые вы часто видите под строкой ввода сообщения я намеренно использовать не буду. По мне они некрасивые, портят вид, портят единый стиль. Все можно сделать с инлайн кнопками.

Второй момент. По умолчанию интерфейс с такими инлайн кнопками расчитан на то, что у нас каждый раз меняется сообщение, меняется текст и новый состав кнопок. А значит нам надо в каждом экране (сообщении, блоке - можно по разному называть) надо ВСЕГДА предусматривать кнопки для возврата назад или перехода куда-нить дальше.

В ботах у которых есть и инлайн кнопки и кнопки внизу сообщения я очень часто видел сатуацию, когда серия диалогов заканчивалась и дальше мынажимаем инлайн кнопку, а ничего не происходит. Нам нужно после этого нажимать кнопку под сообщением для запуска новой цепочки диалога. А по сути получается, что программисты просто бросили ветку и не написали обработчик на законченном диалоге. С одной стороны правильно - пользователю больше нечего ответить, а с другой стороны выглядит как откровенный баг в боте. Ибо кнопка если есть, значит она должна что-то делать и точка.

Интерфейс данного конструктора лишен такого недостатка. Каждая кнопка у вас будет запускать команду (вида /команда), т.е. являться ссылкой на какой-то существующий (вами написанный) блок. А из него дальше и дальше. Как вы построите карту переходов зависит только от вашей фантазии.

3. Подготовка, ТЗ

Чтоб не путаться во время написания своего бота, настоятельно рекомендую взять листок бумаги и написать ТЗ

ТЗ - это некое волшебное слово, которое вам поможет значительно быстрее сделать своего бота.

ТЗ - это техническое задание. Нарисуйте диаграму бота со стрелками. В каждом блоке вы пишете какой текст будет выводиться. Стрелками вы соединяете свои блоки и вверху каждого блока вы пишете имя самого блока. Все имена блоков на английском языке без пробелов. Например имена могут быть help support menu backlog и т.д.

После вы соединяете стрелками блоки - это будут ваши переходы. Предположим стрелка идет в блок help, значит на самой стрелке подпишите help. оно вам поможет при формировании кнопок. Позже вы будете просто смотреть в какой блок приходит стрелка - так она и будет именоваться и, забегая вперед, скажу, что именно это имя и будет вписано в команду на кнопке. Как только вы построили диаграму - вы сделали 50% работы Вам останется только перенабрать тексты в бота.

4. Что такое контроллеры и экшены

В предыдущей главе мы рисовали ТЗ. Но тз может быть на столько большим, что вам не хватило листика и вы потянулись за другим. А теперь внимание! Возимите и напишите в уголке предыдущщего листика андлийское имя - какие блоки на этом листике, например это catalog

далее вы берете второй листик и сразу подписывайте в углу, например, это будут экраны с вашими реквизитами, формой оплвты и отправки сообщения вам о том, что клиент оплатил. Вы подписали этот листик pay.

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

А теперь плано переходим от наших листиков в конструктор. Те имена которые вы подписали над самим блоком - это экшены. А те имена которыми озаглавили сам лист - это коннтроллер. К примеру у вас лист озаглавлен support, а на листе есть блоки show, about и т.д Нам надо как-то именовать функции Мы смело можем написать так support__show (разделено двумя знаками подчеркивания) Так вот это и будет ваше полное имя функции.

Чтоб легче понять представьте, что у вас семья - и в семье Вася, Петя. И фамилия у все семьи Ивановы. Пооное имя у каждого будет иванов__вася и иванов__петя. И есть другая семья - там тож есть петя и слава и фамилия у них петровы. Их полные именя будут петров__петя и петров__слава

Вот мы и подошли к тому, что контроллер - это просто визуальное предствление, которое помогает разделить большой проект на законченные логические группы. Основной контроллер в боте у нас всегда есть - я его сразу обозвал main И в данном контроллере присутсвует наша команда старт (start) Полное имя команды будет выглядеть как /main__start Так же для команд контроллера main можно не писать main, а просто писать /start (Но это только для контроллера main и только!) если у вас в контроллере main будет еще одна команда help - то ее имя будет /help и /main__help Бот будет одинаково выполнять и то и то. Для других контроллеров всегда надо писать имя /контроллер__экшн

Вот именно и так выглядят ВСЕ команды нашего бота - сколько бы их ни было.