Telegram Bot API на Kotlin — конкурс пет-проектов
Написал на Kotlin библиотеку с поддержкой WebApp в JS таргете и множеством разных DSL.
1К открытий4К показов
Добрый день ? Я Алексей Овсянников, автор библиотеки KTgBotAPI, о которой и хотел бы рассказать в рамках конкурса пет-проектов.
Что за библиотека такая
Изначально задачей библиотеки была строгая типизация работы с Telegram Bots API. Так уж вышло, что со временем это переросло в нечто большее, теперь это — мультиплатформенная библиотека с поддержкой WebApp в JS таргете и кучей разных DSL.
О зарождении
По счастливому стечению обстоятельств, на момент начинания библиотеки я уже имел опыт публикации JVM-библиотек, работы с Kotlin и работы с Telegram Bots API. Понятное дело, что тогда (около пяти лет назад) уже были какие-то решения для этих задач, но:
- Как минимум, бОльшая часть была написана на Java для JVM — ни о какой null-safety и других фишках Kotlin не шло речи.
- Ни одна из изученных мной библиотек не обладала хотя бы намёком на какую-то безопасность при работе — поля запросто могли отсутствовать, а методы не применяться.
- Тогда еще не так популярны были всякие DSL + поскольку библиотеки были на JVM, очень много чего скрывалось в документации или в лучшем случае в JavaDoc’ах
Самой большой болью было то, что библиотеки калькировали API, из-за чего постоянно происходили выстрелы в ногу: то поле отсутствует для какого-то типа, то метод не применим для чата.
Трудности по-пути
Трудностей было много. Например, на первую версию ушел месяц, без учёта тестов. На входе у пользователей библиотеки до сих пор сохраняются сложности в связи со строгой типизацией и тем, что за ней следует, например, базовый Chat имеет только идентификатор, все остальные параметры для общей абстракции чатов просто отсутствуют.
Также, каждая итерация поддержки Telegram Bots API вносила свои приколы: например, форумы — это просто группы с галочкой форумов, у которых для сообщений есть поле threadId
. Само собой, каждое обновление заставляло перелопачивать иерархию типов, что иногда приводило к болючим изменениям. Цена прогресса, так сказать ?
Из забавностей, в одном из обновлений ребята из команды Telegram толи вывалили наружу, толи подглядели в либу и почти скопировали какую-то иерархию типов (кажется, для прав) — это было очень интересно видеть почти 1-в-1 названия для типов и их отношения друг к другу в официальном API и моей либе ?
Сообщество
Отдельное спасибо я хочу сказать сообществу. Новые идеи, репорты багов, а иногда даже и самостоятельный вклад — многое произошло благодаря сообществу. Например, текущая дока появилась в том виде, в каком она есть, благодаря одному из пользователей либы — он подсказал, куда можно смотреть, чтобы получить доку, в которую можно будет предлагать правки и которая будет удобна в использовании.
К чему я (мы) пришел
Я начинал работу над библиотекой один. Со временем приходили люди и привносили идеи. Так появилось много всего:
- удобный API, вроде как дублирующий методы в оригинальном API, но на самом деле также разделённый по типам и строго декларирующий, какие параметры с какими можно сочетать;
- различные DSL вроде Keyboards DSL и Text Entities DSL;
- некоторые библиотеки вокруг: PlaguBot для унификации частей ботов (плагинов), различные FSM и BehaviorBuilder.
Вместо выводов
Библиотека жива. Сейчас во многом она в ситуации поддержки — возможности целенаправленно развивать её и её экосистему особо нет, но тем не менее всё время появляются какие-то классные штуки, как то отдельная абстракция для предварительной информации о чатах или различные дополнения документации.
Спасибо за внимание ?
1К открытий4К показов