Node.js бот для Telegram, який:
- приймає webhook події статусу світла (
online/offline); - надсилає повідомлення про зміну статусу;
- автоматично перевіряє графік відключень для
GPV5.1та надсилає PNG у окремий тред.
- Node.js
- Fastify
- Sequelize
- PostgreSQL
- Vitest
- Встановити залежності:
npm install
- Заповнити
.env. - Запустити:
npm start
npm start— запуск сервераnpm test— запуск тестів
src/app.js— старт застосункуsrc/routes/— HTTP маршрутиsrc/controllers/— контролериsrc/services/— бізнес-логіка (Telegram, scheduler, status)src/models/— Sequelize моделіsrc/utils/— утиліти
GET /- відповідь:
{ "message": "Request received" }
POST /- body:
monitor_status:onlineабоofflinetimestamp: Unix timestamp (секунди)
При валідному запиті:
- обчислюється тривалість попереднього стану;
- надсилається повідомлення в Telegram;
- зберігається новий стан у БД.
CHAT_ID— чатTHREAD_ID— тред для статусних повідомленьDAILY_THREAD_ID— окремий тред для графіків
📋 Детальний опис усіх сценаріїв та таблиця покриття: SCENARIOS.md
Scheduler працює у часовій зоні TIMEZONE (рекомендовано Europe/Kyiv):
- старт вікна перевірок:
20:00; - крок: кожні
30хв; - остання перевірка:
00:00.
На кожній ітерації:
- Завантажує
DAILY_JSON_URL(kyiv-region.json). - Шукає дані на завтра для групи
DAILY_GROUP_KEY(за замовчуваннямGPV5.1) уfact.data. - Якщо дані вперше з'явились — надсилає PNG (
DAILY_PNG_URL) вDAILY_THREAD_ID. - Якщо дані вже були і JSON змінився — надсилає оновлений графік з поміткою про оновлення.
- Якщо до
00:00даних немає — надсилає повідомлення:Графік відключень на {{date}} відсутній
Бот також перевіряє зміни у графіку на сьогодні:
- Відстежує зміни у даних для поточної дати (today).
- Якщо вчора обіцяли "без відключень", а сьогодні з'явилися відключення — надсилає попередження з поміткою
⚠️ ЗМІНЕНО - з'явилися відключення! - Якщо відключення скасували (всі години стали
yes) — надсилає повідомлення про скасування. - Для увімкнення відправки початкового графіка на сьогодні встановіть
DAILY_SEND_TODAY_INITIAL=true.
API_TOKEN=your_telegram_bot_token
DATABASE_URL=postgresql://user:password@host:5432/db
CHAT_ID=-100xxxxxxxxxx
THREAD_ID=2
DAILY_THREAD_ID=114
TIMEZONE=Europe/Kyiv
DAILY_JSON_URL=https://raw.githubusercontent.com/Baskerville42/outage-data-ua/main/data/kyiv-region.json
DAILY_GROUP_KEY=GPV5.1
DAILY_PNG_URL=https://raw.githubusercontent.com/Baskerville42/outage-data-ua/main/images/kyiv-region/gpv-5-1-emergency.png
DAILY_CHECK_START_HOUR=20
DAILY_CHECK_START_MINUTE=0
DAILY_CHECK_END_HOUR=0
DAILY_CHECK_END_MINUTE=0
DAILY_CHECK_INTERVAL_MINUTES=30
DAILY_SEND_TODAY_INITIAL=false- Scheduler запускається разом із застосунком.
- Для застосування змін у
.envпотрібен перезапуск процесу.