Skip to content

Delphington/LinterBot

Repository files navigation

📌 Link Tracker

Spring Boot Kafka Hibernate Docker Testcontainers Swagger PostgreSQL Redis


Чтобы бот заработал нужно в переменные среды загрузить TELEGRAM_TOKEN


📝 Описание проекта

Приложение для отслеживания обновлений контента по ссылкам. При появлении новых событий отправляется уведомление в Telegram.

Проект написан на Java 23 с использованием Spring Boot 3.

Проект состоит из 2-х приложений:

  • Bot
  • Scrapper

Для работы требуется PostgreSQL, Redis, Kafka.

📟 Схема приложения

Scrapper


🤖 Бот

📌 Функционал

Бот поддерживает следующие команды:

  • /start — регистрация пользователя.
  • /help — список всех доступных команд.
  • /track — добавление ссылки для отслеживания
  • /untrack — удаление ссылки из списка отслеживаемых.
  • /list — получение списка всех отслеживаемых ссылок.
  • /tag — выводит все ссылки, у которых есть определенный тег (/tag < tag >)
  • /taglist — все теги, которые ввел пользователь
  • /untag — удаление тега у ссылки (/untag < tag > < link >)
  • /filter — позволяет добавить фильтр
  • /filterlist — выводит все фильтры пользователя
  • /unfilter — удаление фильтров (/unfilter < filter >)

🔄 Взаимодействие со Scrapper

Бот общается со Scrapper API через:

  • ScrapperTgChatClient — регистрация и удаление чатов.
  • LinkClient — управление ссылками (добавление, удаление, получение списка ссылок).
  • TagClient — получение списка тегов, получение ссылки по тегу и удаление тега у ссылки.
  • ScrapperFilterClient — управление фильтрами (добавление, удаление, получение списка фильтров)

📩 Получение обновлений

  • Бот получает обновления о ссылках через UpdateController по HTTP либо через KafkaUpdateListener по Kafka.
  • Scrapper отправляет данные по OpenAPI-контракту.
  • Обновления рассылаются чатам через NotificationService.

📜 Дополнительно

🧠 Кеширование Redis

Бот кеширует ответы для следующих команд:

  • /tag
  • /tag
  • /list

🔄 Кеш автоматически сбрасывается в следующих случаях:

  • При добавлении или удалении ссылки (/track, /untrack, /untag)

При вызове команд бот сначала проверяет наличие ответа в кеше. Если данные найдены — используется кеш. В противном случае происходит обращение к Scrapper API, и результат сохраняется в кеш.


🗂️ Scrapper

📌 Функционал

Scrapper обрабатывает запросы от бота:

Все контроллеры работают по OpenAPI-контракту.

🔄 Получение обновлений

  • LinkUpdateScheduler.
  • 📡 Источники данных:
  • ⚙️ Обработка полученных данных
    1. Запрос обновлений
      • Для каждого URL запрашивается обновление через открытый API GitHub и StackOverflow
    2. Фильтрация обновлений
      • Определяются подписанные пользователи (чаты), которые отслеживают данный URL.
      • Для каждого пользователя применяется его список фильтров:
    3. Парсинг ответа
      • Полученный JSON-ответ анализируется, извлекаются нужные значения.
    4. Проверка актуальности
      • Обновление считается релевантным, если оно произошло после последнего запуска шедулера.
    5. Формирование уведомлений
      • Отобранные обновления, соответствующие фильтрам, отправляются пользователям либо через HTTP, либо через Kafka.
  • ⚙️ Обработка батчей и многопоточность
    • Ссылки на обновления запрашиваются партиями (batch) заданного размера. Каждый батч делится между потоками. Количество потоков настраивается через конфигурацию.

📦 Хранение данных

  • tg_chats — таблица чатов.
  • links — таблица ссылок.
  • tags — таблица тегов.
  • filters — таблица фильтров.
  • filter_list — таблица фильтров каждого пользователя

📌 Схема базы данных

{E4ED68AF-CD94-4964-B402-74AE70A10960}

💡 Один чат может отслеживать несколько ссылок, а одна ссылка может быть отслеживаемой несколькими чатами.
📌 Каждая ссылка может иметь несколько тегов и фильтров в рамках одного чата.

🗂️ Метрики

RED

изображение

Custom

  • Количество пользовательских сообщений в секунду
  • График количества активных ссылок в БД по типу (github, stackoverflow)
  • p50, p95, p99 времени работы одного scrape по типу (github, stackoverflow)

image

jvm

image


🚀 Запуск проекта

  1. Клонирование репозитория специальной ветки

      git clone https://github.com/Delphington/LinterBot.git
  2. Перейдите в директорию с docker-конфигурацией:

       cd LinterBot
  3. Нужно прокинуть специальную переменную среды (Обязательно❗️)

      $env:TELEGRAM_TOKEN="YOUR_TOKEN"

    3.1. Опционально можно прокинуть другие переменные среды для увеличения лимита запросов

       $env:GITHUB_TOKEN="YOUR_GITBUB_TOKEN"
       $env:SO_TOKEN_KEY="YOUR_STACKOVERFLOW_TOKEN"
       $env:SO_ACCESS_TOKEN="YOUR_STACKOVERFLOW_TOKEN"
  4. Запустите сборку и запуск контейнеров:

      docker-compose up --build

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages