Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

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К показов