Уведомление о событиях в календаре в Telegram Bot

Привет, друзья. У меня есть много календарей — это и личные, и рабочие календари. Про события в некоторых из них я бы хотел получать нотификации прямо в Телеграм. Собственно, я решил сделать бота, который это будет делать.

Если вам интересно посмотреть только конечный результат, то вот же он:

Немного про техническую часть. Календари могут быть представлены в разных форматах. Однако чаще всего, календари экспортируются из разных систем (например, яндекс.календарь) в виде ссылки на ics файл. Соответственно, реализацию бота можно разбить на следующие этапы:

  1. Пользователь добавляет в бота ссылка на ics файлы, про которые юзер хочет получать уведомления. Тут же нужно указать за сколько минут до события бот должен присылать нотификацию.
  2. Бот должен переодически переиндексировать все календари. Это необходимо, чтобы получать новые события, а также менять информацию о тех евентах, которые изменились (например, поменялось время)
  3. Бот должен переодически просыпаться и брать те евенты, по которым пришло время для уведомления. В общем, типичная очередь отложенных задач, ничего особенного.

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

  • Kotlin — как язык
  • Micronaut — как базовый фреймворк (я из него использую DI, Http client и сборку докер образа)
  • GraalVM (Substrate VM) — как рантайм. То есть, я AOT компилирую бота в бинарник, который уже никак не зависит от JVM.

Комментарии по выбронному стеку.

  • Котлин — норм, но и Java 15 — тоже норм, и не факт, что есть смысл в Котлине на бэке.
  • Micronaut — супер впечатления. Читать исходники очень приятно, так как код более прямолинейный, чем в Спринге. (создателям пришлось так писать код, чтобы была поддержка Graalvm native image
  • Нативные образы Грааля — очень сыро. Все проблемы, которые возникли в ходе реализации бота, были только с этим. По двум из проблем (а их было больше) завёл баги — https://github.com/oracle/graal/issues/2942 и https://github.com/micronaut-projects/micronaut-gcp/issues/287
  • Из примечательного — бот может работать с лимитом в 100 MB на контейнер. Конечно, стандартной джаве это вряд ли удастся.

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

Категории: Программирование