Python-lib for telegram (thallid-tg)


Продолжаю выкладывать свои "наработки" по основным ботоводческим направлениям. В этот раз новое секретное оружие для телеграма.

https://github.com/ksantoprotein/thallid-tg

Снова писал код "с нуля", подключаю только то что нужно для своих ботов по мере надобности (ибо это не сложно). Иные библиотеки просто загромождены кучей функцией, из которых ты пользуешься в лучшем случае с пяток.

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

from ttgbase.api import Api, Menu
import menu

token = '...'
tg = Api(token)

tg.commands["private_text"] = функция для обработки приватных сообщений
tg.commands["chat_text"] = функция для обработки сообщений в чатах

commands = {}

bot_menu = Menu(menu.menu, commands, tg)

tg.run()

Итак, немного пояснений, все равно разработка в активной стадии и изменения будут, но принцип уже сформирован.

Загружаем класс апишек бота и самостоятельно пишем функции обработки сообщений который приходят боту как в чатах, так и приватно, как команды, так и реплеи. Просто нужно отдельно указать tg.commands что бот должен распознать и что при этом выполнить.

Далее загружаем менюшку. Формат менюшки примерно такой.

изображение.png

Это обычный словарь, где вы сами прорисовываете свою древовидную структуру переходов на уровни и кнопок. К примеру есть начальный уровень start, в action (подсмотрел формат из ВК) вы перечисляете списком кнопки указывая имя кнопки label, и текст который исполнит бот при нажатии на нее message, далее есть параметр to_level который указывает боту куда нуно переместиться после нажатия кнопки. И необязательный параметр row помогает вам отформатировать расположение кнопок по рядам...

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

Но просто переходить по кнопкам менюшки это пол дела, иногда боту нужно скормить те или иные данные, и для этого мы передаем в параметрах вызова апишек еще коммандную структуру.

изображение.png

Другими словами мы можем еще задать боту в каком месте и при нажатии какой кнопки (или наоборот не нажатии) нужно выполнить ту или иную функцию. Предполагаю, что из примера понятно как это реализуется. Если юнит был в подменю help и нажал кнопку Back, то при этом выполнится команда new_help1 (в моем случае выведет ему бла бла бла), а если юнит наберет по своему разумению что-то с клавиатуры, что не прописано в кнопках подменю хелп, то выполнится команда new_help.

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


Следующий этап наработок это сохранение промежуточно введеных значений пользователя в параметрах payload. Это так же избавит нас от третьего гемора в подобных ботах.


Comments 0