Files
obsidian/Projects/Pulse/Notifications.md

3.6 KiB
Raw Blame History

Pulse — Система уведомлений

Telegram бот

Функционал

  • При /start бот отправляет пользователю его chat_id
  • Пользователь копирует ID и вставляет в профиль на сайте
  • Бот отправляет уведомления о задачах и привычках

Реализация

  • Часть homelab-api (отдельный goroutine)
  • go-telegram-bot-api
  • Long polling

Профиль пользователя

Новые поля в БД (таблица users)

ALTER TABLE users ADD COLUMN telegram_chat_id BIGINT;
ALTER TABLE users ADD COLUMN notifications_enabled BOOLEAN DEFAULT true;
ALTER TABLE users ADD COLUMN timezone VARCHAR(50) DEFAULT 'Europe/Moscow';

API endpoints

  • GET /profile — получить профиль
  • PUT /profile — обновить профиль (telegram_chat_id, notifications_enabled, timezone)

UI

  • Страница /settings или /profile
  • Поля: telegram chat ID, вкл/выкл уведомления, часовой пояс

Логика уведомлений

Утреннее уведомление (9:00)

  • Список задач на сегодня (due_date <= today, не выполнены)
  • Отправляется один раз утром

Индивидуальные напоминания

Для каждой задачи и каждой привычки можно установить время напоминания.

Логика:

  • Если задача/привычка НЕ выполнена к указанному времени → отправить уведомление
  • Пример: привычка "гитара" выполнять в 18:00, напоминание в 17:00
    • Каждый день в 17:00 проверяем: выполнена ли сегодня?
    • Если нет → отправляем "Не забудь: гитара 🎸"

Глобальный выключатель

  • Если notifications_enabled = false в профиле → никакие уведомления не отправляются
  • Если telegram_chat_id не заполнен → уведомления не отправляются

Новые поля в БД

tasks

ALTER TABLE tasks ADD COLUMN reminder_time TIME;

habits

ALTER TABLE habits ADD COLUMN reminder_time TIME;

Архитектура

Scheduler (robfig/cron)

  • Запускается каждую минуту
  • Для каждого пользователя с notifications_enabled=true и telegram_chat_id:
    1. Проверить, нужно ли отправить утреннее уведомление (9:00 по timezone)
    2. Найти задачи с reminder_time = текущее время, не выполнены → отправить
    3. Найти привычки с reminder_time = текущее время, не выполнены сегодня → отправить

Telegram Bot

  • Long polling в отдельной goroutine
  • Команды: /start → отправить chat_id

TODO

  • Создать Telegram бота (@BotFather) → получить токен
  • Миграция БД: поля в users, tasks, habits
  • API: GET/PUT /profile
  • API: Telegram bot handler (long polling)
  • Backend: scheduler с robfig/cron
  • UI: страница настроек профиля
  • UI: поле reminder_time в формах задач и привычек

Создано: 2026-02-06 Обновлено: 2026-02-06