Это Телеграм бот, который уведомляет вас о новых изменениях на сайте. На текущий момент бот способен отслеживать репозитории в GitHub и вопросы на StackOverFlow, но вы не ограничены и можете самостоятельно добавить новые сайты. (это не трудно, ниже будет инструкция как это сделать)
- Spring Boot 3
- SDK Telegram Bot API
- Hibernate, JdbcTemplate, JOOQ (для каждого написаны свои repositories и servises)
- PostgreSQL 15
- Liquibase
- RabbitMQ 3
- JUnit, Mockito
- Prometheus, Grafana
Вот небольшое видео, как работает бот:
clideo_editor_d098f80e7a9240b68ea48078e194caed.mp4
На текущий момент в репозиториях GitHub отслеживаются следующие изменения:
- Время последнего изменения
- Commits
- Branches
- Issue
- Комментарии в issue
- Pull requests
В StackOverFlow пока отслеживается только время последнего изменения.
Я постарался сделать так, чтобы добавление новых доменов для отслеживания и новый сценариев у уже существующих ссылок, было безболезненно.
Для того, чтобы добавить новый домен для отслеживания выполняем следующее:
- Создаем новый парсер для ссылки в модуле
link-parser
. (Парсер нужен чтобы забрать из ссылки нужные данные, например имя репозитория, которые в дальнейшем будут передаваться в API сайта) - Этот парсер нужно добавить в цепочку парсеров. Для этого нужно зайти в класс
ParseChain
и просто в конструктор добавить ваш парсер. (там используется паттер Chain of Responsibility) - Далее необходимо написать
NewDomainClient
в модуле scrapper в директорииclients/site
. Новый класс отвечает за сбор данных с нового сайта. Именно здесь вы пишите взаимодействие с API сайта. Ваш класс должен быть расширятьBaseSiteClient
, у которого всего 2 метода:Map<String, String> getUpdates
иString getUpdatedDate
. - После написания
NewDomainClient
идем в классSitesMap
и добавляем в методinitMap
наш новый класс. (тут используется паттерн Command) - Добавляем новый домен в базу данных. Делается это так:
INSERT INTO domains(name) VALUES ('newDomainName');
Ну и все, таким образом, чтобы добавить новый домен для отслеживания, нужно написать саму логику получения обновлений и парсинг ссылки. И все. Нигде не нужно изменять основной код.
Если же вы хотите добавить новый отслеживающий сценарий для уже существующего домена, то все еще проще:
- Пишем логику получения новых данных с сайта
- Вызываем этот новый метод в методе
getUpdates
и добавляем результат в Map. Например вот так:dataUpdates.put("newTrackerField", getDataNewField());
Теперь бот будет отслеживать новый сценарий.
- Простое добавление новых доменов и новый сценариев
- В RabbitMQ настроил Dead Letter Queue, в которую попадают "бракованные" запросы. Но попадают они туда только после трёх неудачных попыток. Количество попыток можно изменить в
scrapper.properties
в полеmax-attempts
. - Сбор и отслеживание статистики. (благодаря этому мне удалось выявить баг в коде)
- Тестирование. Покрытие пока не большое, но в свободное время буду дописывать (todo)
- Везде соблюдал принципы SOLID
- В ходе разработки применил паттерны.
- Написан CI, который собирает проект, проверяет его на Code Style и публикует образ на мой DockerHub