Files
telegram-tui/ROADMAP.md
Mikhail Kilin bea0bcbed0 feat: implement desktop notifications with comprehensive filtering
Implemented Phase 10 (Desktop Notifications) with three stages:
notify-rust integration, smart filtering, and production polish.

Stage 1 - Base Implementation:
- Add NotificationManager module (src/notifications.rs, 350+ lines)
- Integrate notify-rust 4.11 with feature flag "notifications"
- Implement NotificationsConfig in config.toml (enabled, only_mentions, show_preview)
- Add notification_manager field to TdClient
- Create configure_notifications() method for config integration
- Hook into handle_new_message_update() to send notifications
- Send notifications for messages outside current chat
- Format notification body with sender name and message preview

Stage 2 - Smart Filtering:
- Sync muted chats from Telegram (sync_muted_chats method)
- Filter muted chats from notifications automatically
- Add MessageInfo::has_mention() to detect @username mentions
- Implement only_mentions filter (notify only when mentioned)
- Beautify media labels with emojis (📷 📹 🎤 🎨 📎 etc.)
- Support 10+ media types in notification preview

Stage 3 - Production Polish:
- Add graceful error handling (no panics on notification failure)
- Implement comprehensive logging (tracing::debug!/warn!)
- Add timeout_ms configuration (0 = system default)
- Add urgency configuration (low/normal/critical, Linux only)
- Platform-specific #[cfg] for urgency support
- Log all notification skip reasons at debug level

Hotkey Change:
- Move profile view from 'i' to Ctrl+i to avoid conflicts

Technical Details:
- Cross-platform support (macOS, Linux, Windows)
- Feature flag for optional notifications support
- Graceful fallback when notifications unavailable
- LRU-friendly muted chats sync
- Test coverage for all core notification logic
- All 75 tests passing

Files Changed:
- NEW: src/notifications.rs - Complete NotificationManager
- NEW: config.example.toml - Example configuration with notifications
- Modified: Cargo.toml - Add notify-rust 4.11 dependency
- Modified: src/config/mod.rs - Add NotificationsConfig struct
- Modified: src/tdlib/types.rs - Add has_mention() method
- Modified: src/tdlib/client.rs - Add notification integration
- Modified: src/tdlib/update_handlers.rs - Hook notifications
- Modified: src/config/keybindings.rs - Change profile to Ctrl+i
- Modified: tests/* - Add notification config to tests

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 01:27:44 +03:00

11 KiB
Raw Blame History

Roadmap

Фаза 1: Базовая инфраструктура [DONE]

  • Настройка проекта (Cargo.toml)
  • TUI фреймворк (ratatui + crossterm)
  • Базовый layout (папки, список чатов, область сообщений)
  • Vim-style навигация (hjkl, стрелки)
  • Русская раскладка (ролд)

Фаза 2: TDLib интеграция [DONE]

  • Подключение tdlib-rs
  • Авторизация (телефон + код + 2FA)
  • Сохранение сессии
  • Загрузка списка чатов
  • Загрузка истории сообщений
  • Отключение логов TDLib

Фаза 3: Улучшение UX [DONE]

  • Отправка сообщений
  • Фильтрация чатов (только Main, без архива)
  • Поиск по чатам (Ctrl+S)
  • Скролл истории сообщений
  • Загрузка имён пользователей (вместо User_ID)
  • Отметка сообщений как прочитанные
  • Реальное время: новые сообщения

Фаза 4: Папки и фильтрация [DONE]

  • Загрузка папок из Telegram
  • Переключение между папками (1-9)
  • Фильтрация чатов по папке

Фаза 5: Расширенный функционал [DONE]

  • Отображение онлайн-статуса (зелёная точка ●)
  • Статус доставки/прочтения (✓, ✓✓)
  • Поддержка медиа-заглушек (фото, видео, голосовые, стикеры и др.)
  • Mentions (@) — индикатор непрочитанных упоминаний
  • Muted чаты (иконка 🔇)

Фаза 6: Полировка [DONE]

  • Оптимизация использования памяти (базовая)
    • Очистка сообщений при закрытии чата
    • Лимит кэша пользователей (500)
    • Периодическая очистка неактивных записей
  • Оптимизация 60 FPS
    • Poll таймаут 16ms
    • Флаг needs_redraw — рендеринг только при изменениях
    • Обработка Event::Resize для перерисовки при изменении размера
  • Минимальное разрешение (80x20)
    • Предупреждение если терминал слишком мал
  • Обработка ошибок сети
    • NetworkState enum (WaitingForNetwork, Connecting, etc.)
    • Индикатор в футере с цветовой индикацией
  • Graceful shutdown
    • AtomicBool флаг для остановки polling
    • Корректное закрытие TDLib клиента
    • Таймаут ожидания завершения задач
  • Динамический инпут
    • Автоматическое расширение до 10 строк
    • Wrap для длинного текста
  • Перенос длинных сообщений
    • Автоматический wrap на несколько строк
    • Правильное выравнивание для исходящих/входящих

Фаза 7: Глубокий рефакторинг памяти [DONE]

  • Удалить дублирование current_messages между App и TdClient
  • Использовать единый источник данных для сообщений
  • Реализовать LRU-кэш для user_names/user_statuses вместо простого лимита
  • Lazy loading для имён пользователей (батчевая загрузка последних 5 за цикл)
  • Лимиты памяти:
    • MAX_MESSAGES_IN_CHAT = 500
    • MAX_CHATS = 200
    • MAX_CHAT_USER_IDS = 500
    • MAX_USER_CACHE_SIZE = 500 (LRU)

Фаза 8: Дополнительные фичи [DONE]

  • Markdown форматирование в сообщениях
    • Bold, Italic, Underline, Strikethrough
    • Code (inline, Pre, PreCode)
    • Spoiler (скрытый текст)
    • URLs, упоминания (@)
  • Редактирование сообщений
    • ↑ при пустом инпуте → выбор сообщения
    • Enter для начала редактирования
    • Подсветка выбранного сообщения (▶)
    • Esc для отмены
  • Удаление сообщений
    • d / в / Delete в режиме выбора
    • Модалка подтверждения (y/n)
    • Удаление для всех если возможно
  • Индикатор редактирования (✎)
    • Отображается рядом с временем для отредактированных сообщений
  • Блочный курсор в поле ввода
    • Vim-style курсор █
    • Перемещение ←/→, Home/End
    • Редактирование в любой позиции
  • Reply на сообщения
    • r / к в режиме выбора → режим ответа
    • Превью сообщения в поле ввода
    • Esc для отмены
  • Forward сообщений
    • f / а в режиме выбора → режим пересылки
    • Превью сообщения в поле ввода
    • Выбор чата стрелками, Enter для пересылки
    • Esc для отмены
    • Отображение "↪ Переслано от" для пересланных сообщений

Фаза 9: Расширенные возможности [DONE]

  • Typing indicator ("печатает...")
    • Показывать когда собеседник печатает
    • Отправлять свой статус печати при наборе текста
  • Закреплённые сообщения (Pinned)
    • Отображать pinned message вверху открытого чата
    • Клик/хоткей для перехода к закреплённому сообщению
  • Поиск по сообщениям в чате
    • Ctrl+F — поиск текста внутри открытого чата
    • Навигация по результатам (n/N или стрелки)
    • Подсветка найденных совпадений
  • Черновики
    • Сохранять набранный текст при переключении между чатами
    • Индикатор черновика в списке чатов
    • Восстановление текста при возврате в чат
  • Профиль пользователя/чата
    • Ctrl+i — открыть информацию о чате/собеседнике
    • Для личных чатов: имя, username, телефон, био
    • Для групп: название, описание, количество участников
  • Копирование сообщений
    • y / н в режиме выбора — скопировать текст в системный буфер обмена
    • Использовать clipboard crate для кроссплатформенности
  • Реакции
    • Отображение реакций под сообщениями
    • e в режиме выбора — добавить реакцию (emoji picker)
    • Список доступных реакций чата
  • Конфигурационный файл
    • ~/.config/tele-tui/config.toml
    • Настройки: цветовая схема, часовой пояс, хоткеи
    • Загрузка конфига при старте

Фаза 10: Desktop уведомления [DONE - 83%]

Стадия 1: Базовая реализация [DONE]

  • NotificationManager модуль
    • notify-rust интеграция (версия 4.11)
    • Feature flag "notifications" в Cargo.toml
    • Базовая структура с настройками
  • Конфигурация уведомлений
    • NotificationsConfig в config.toml
    • enabled: bool - вкл/выкл уведомлений
    • only_mentions: bool - только упоминания
    • show_preview: bool - показывать превью текста
  • Интеграция с TdClient
    • Поле notification_manager в TdClient
    • Метод configure_notifications()
    • Обработка в handle_new_message_update()
  • Базовая отправка уведомлений
    • Уведомления для сообщений не из текущего чата
    • Форматирование title (имя чата) и body (текст/медиа-заглушка)
    • Sender name из MessageInfo

Стадия 2: Улучшения [IN PROGRESS]

  • Синхронизация muted чатов
    • Загрузка списка muted чатов из Telegram
    • Вызов sync_muted_chats() при инициализации и обновлении (Ctrl+R)
    • Muted чаты автоматически фильтруются из уведомлений
  • Фильтрация по упоминаниям
    • Метод MessageInfo::has_mention() проверяет TextEntityType::Mention и MentionName
    • NotificationManager применяет фильтр only_mentions из конфига
    • Работает для @username и inline mentions
  • Поддержка типов медиа
    • Метод beautify_media_labels() заменяет текстовые заглушки на emoji
    • Поддержка: 📷 Фото, 🎥 Видео, 🎞️ GIF, 🎤 Голосовое, 🎨 Стикер
    • Также: 📎 Файл, 🎵 Аудио, 📹 Видеосообщение, 📍 Локация, 👤 Контакт, 📊 Опрос
  • Кастомизация звуков
    • Настройка звуков уведомлений в config.toml
    • Разные звуки для разных типов сообщений

Стадия 3: Полировка [DONE]

  • Обработка ошибок
    • Graceful fallback если уведомления недоступны (возвращает Ok без паники)
    • Логирование ошибок через tracing::warn!
    • Детальное логирование причин пропуска уведомлений (debug level)
  • Дополнительные настройки
    • timeout_ms - продолжительность показа (0 = системное значение)
    • urgency - уровень важности: "low", "normal", "critical" (только Linux)
    • Красивые эмодзи для типов медиа
  • Опциональные улучшения (не критично)
    • Кросс-платформенное тестирование (требует ручного тестирования)
    • icon - кастомная иконка приложения
    • Actions в уведомлениях (кнопки "Ответить", "Прочитано")