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>
198 lines
11 KiB
Markdown
198 lines
11 KiB
Markdown
# Roadmap
|
||
|
||
## Фаза 1: Базовая инфраструктура [DONE]
|
||
|
||
- [x] Настройка проекта (Cargo.toml)
|
||
- [x] TUI фреймворк (ratatui + crossterm)
|
||
- [x] Базовый layout (папки, список чатов, область сообщений)
|
||
- [x] Vim-style навигация (hjkl, стрелки)
|
||
- [x] Русская раскладка (ролд)
|
||
|
||
## Фаза 2: TDLib интеграция [DONE]
|
||
|
||
- [x] Подключение tdlib-rs
|
||
- [x] Авторизация (телефон + код + 2FA)
|
||
- [x] Сохранение сессии
|
||
- [x] Загрузка списка чатов
|
||
- [x] Загрузка истории сообщений
|
||
- [x] Отключение логов TDLib
|
||
|
||
## Фаза 3: Улучшение UX [DONE]
|
||
|
||
- [x] Отправка сообщений
|
||
- [x] Фильтрация чатов (только Main, без архива)
|
||
- [x] Поиск по чатам (Ctrl+S)
|
||
- [x] Скролл истории сообщений
|
||
- [x] Загрузка имён пользователей (вместо User_ID)
|
||
- [x] Отметка сообщений как прочитанные
|
||
- [x] Реальное время: новые сообщения
|
||
|
||
## Фаза 4: Папки и фильтрация [DONE]
|
||
|
||
- [x] Загрузка папок из Telegram
|
||
- [x] Переключение между папками (1-9)
|
||
- [x] Фильтрация чатов по папке
|
||
|
||
## Фаза 5: Расширенный функционал [DONE]
|
||
|
||
- [x] Отображение онлайн-статуса (зелёная точка ●)
|
||
- [x] Статус доставки/прочтения (✓, ✓✓)
|
||
- [x] Поддержка медиа-заглушек (фото, видео, голосовые, стикеры и др.)
|
||
- [x] Mentions (@) — индикатор непрочитанных упоминаний
|
||
- [x] Muted чаты (иконка 🔇)
|
||
|
||
## Фаза 6: Полировка [DONE]
|
||
|
||
- [x] Оптимизация использования памяти (базовая)
|
||
- Очистка сообщений при закрытии чата
|
||
- Лимит кэша пользователей (500)
|
||
- Периодическая очистка неактивных записей
|
||
- [x] Оптимизация 60 FPS
|
||
- Poll таймаут 16ms
|
||
- Флаг `needs_redraw` — рендеринг только при изменениях
|
||
- Обработка Event::Resize для перерисовки при изменении размера
|
||
- [x] Минимальное разрешение (80x20)
|
||
- Предупреждение если терминал слишком мал
|
||
- [x] Обработка ошибок сети
|
||
- NetworkState enum (WaitingForNetwork, Connecting, etc.)
|
||
- Индикатор в футере с цветовой индикацией
|
||
- [x] Graceful shutdown
|
||
- AtomicBool флаг для остановки polling
|
||
- Корректное закрытие TDLib клиента
|
||
- Таймаут ожидания завершения задач
|
||
- [x] Динамический инпут
|
||
- Автоматическое расширение до 10 строк
|
||
- Wrap для длинного текста
|
||
- [x] Перенос длинных сообщений
|
||
- Автоматический wrap на несколько строк
|
||
- Правильное выравнивание для исходящих/входящих
|
||
|
||
## Фаза 7: Глубокий рефакторинг памяти [DONE]
|
||
|
||
- [x] Удалить дублирование current_messages между App и TdClient
|
||
- [x] Использовать единый источник данных для сообщений
|
||
- [x] Реализовать LRU-кэш для user_names/user_statuses вместо простого лимита
|
||
- [x] Lazy loading для имён пользователей (батчевая загрузка последних 5 за цикл)
|
||
- [x] Лимиты памяти:
|
||
- MAX_MESSAGES_IN_CHAT = 500
|
||
- MAX_CHATS = 200
|
||
- MAX_CHAT_USER_IDS = 500
|
||
- MAX_USER_CACHE_SIZE = 500 (LRU)
|
||
|
||
## Фаза 8: Дополнительные фичи [DONE]
|
||
|
||
- [x] Markdown форматирование в сообщениях
|
||
- Bold, Italic, Underline, Strikethrough
|
||
- Code (inline, Pre, PreCode)
|
||
- Spoiler (скрытый текст)
|
||
- URLs, упоминания (@)
|
||
- [x] Редактирование сообщений
|
||
- ↑ при пустом инпуте → выбор сообщения
|
||
- Enter для начала редактирования
|
||
- Подсветка выбранного сообщения (▶)
|
||
- Esc для отмены
|
||
- [x] Удаление сообщений
|
||
- d / в / Delete в режиме выбора
|
||
- Модалка подтверждения (y/n)
|
||
- Удаление для всех если возможно
|
||
- [x] Индикатор редактирования (✎)
|
||
- Отображается рядом с временем для отредактированных сообщений
|
||
- [x] Блочный курсор в поле ввода
|
||
- Vim-style курсор █
|
||
- Перемещение ←/→, Home/End
|
||
- Редактирование в любой позиции
|
||
- [x] Reply на сообщения
|
||
- `r` / `к` в режиме выбора → режим ответа
|
||
- Превью сообщения в поле ввода
|
||
- Esc для отмены
|
||
- [x] Forward сообщений
|
||
- `f` / `а` в режиме выбора → режим пересылки
|
||
- Превью сообщения в поле ввода
|
||
- Выбор чата стрелками, Enter для пересылки
|
||
- Esc для отмены
|
||
- Отображение "↪ Переслано от" для пересланных сообщений
|
||
|
||
## Фаза 9: Расширенные возможности [DONE]
|
||
|
||
- [x] Typing indicator ("печатает...")
|
||
- Показывать когда собеседник печатает
|
||
- Отправлять свой статус печати при наборе текста
|
||
- [x] Закреплённые сообщения (Pinned)
|
||
- Отображать pinned message вверху открытого чата
|
||
- Клик/хоткей для перехода к закреплённому сообщению
|
||
- [x] Поиск по сообщениям в чате
|
||
- `Ctrl+F` — поиск текста внутри открытого чата
|
||
- Навигация по результатам (n/N или стрелки)
|
||
- Подсветка найденных совпадений
|
||
- [x] Черновики
|
||
- Сохранять набранный текст при переключении между чатами
|
||
- Индикатор черновика в списке чатов
|
||
- Восстановление текста при возврате в чат
|
||
- [x] Профиль пользователя/чата
|
||
- `Ctrl+i` — открыть информацию о чате/собеседнике
|
||
- Для личных чатов: имя, username, телефон, био
|
||
- Для групп: название, описание, количество участников
|
||
- [x] Копирование сообщений
|
||
- `y` / `н` в режиме выбора — скопировать текст в системный буфер обмена
|
||
- Использовать clipboard crate для кроссплатформенности
|
||
- [x] Реакции
|
||
- Отображение реакций под сообщениями
|
||
- `e` в режиме выбора — добавить реакцию (emoji picker)
|
||
- Список доступных реакций чата
|
||
- [x] Конфигурационный файл
|
||
- `~/.config/tele-tui/config.toml`
|
||
- Настройки: цветовая схема, часовой пояс, хоткеи
|
||
- Загрузка конфига при старте
|
||
|
||
## Фаза 10: Desktop уведомления [DONE - 83%]
|
||
|
||
### Стадия 1: Базовая реализация [DONE]
|
||
- [x] NotificationManager модуль
|
||
- notify-rust интеграция (версия 4.11)
|
||
- Feature flag "notifications" в Cargo.toml
|
||
- Базовая структура с настройками
|
||
- [x] Конфигурация уведомлений
|
||
- NotificationsConfig в config.toml
|
||
- enabled: bool - вкл/выкл уведомлений
|
||
- only_mentions: bool - только упоминания
|
||
- show_preview: bool - показывать превью текста
|
||
- [x] Интеграция с TdClient
|
||
- Поле notification_manager в TdClient
|
||
- Метод configure_notifications()
|
||
- Обработка в handle_new_message_update()
|
||
- [x] Базовая отправка уведомлений
|
||
- Уведомления для сообщений не из текущего чата
|
||
- Форматирование title (имя чата) и body (текст/медиа-заглушка)
|
||
- Sender name из MessageInfo
|
||
|
||
### Стадия 2: Улучшения [IN PROGRESS]
|
||
- [x] Синхронизация muted чатов
|
||
- Загрузка списка muted чатов из Telegram
|
||
- Вызов sync_muted_chats() при инициализации и обновлении (Ctrl+R)
|
||
- Muted чаты автоматически фильтруются из уведомлений
|
||
- [x] Фильтрация по упоминаниям
|
||
- Метод MessageInfo::has_mention() проверяет TextEntityType::Mention и MentionName
|
||
- NotificationManager применяет фильтр only_mentions из конфига
|
||
- Работает для @username и inline mentions
|
||
- [x] Поддержка типов медиа
|
||
- Метод beautify_media_labels() заменяет текстовые заглушки на emoji
|
||
- Поддержка: 📷 Фото, 🎥 Видео, 🎞️ GIF, 🎤 Голосовое, 🎨 Стикер
|
||
- Также: 📎 Файл, 🎵 Аудио, 📹 Видеосообщение, 📍 Локация, 👤 Контакт, 📊 Опрос
|
||
- [ ] Кастомизация звуков
|
||
- Настройка звуков уведомлений в config.toml
|
||
- Разные звуки для разных типов сообщений
|
||
|
||
### Стадия 3: Полировка [DONE]
|
||
- [x] Обработка ошибок
|
||
- Graceful fallback если уведомления недоступны (возвращает Ok без паники)
|
||
- Логирование ошибок через tracing::warn!
|
||
- Детальное логирование причин пропуска уведомлений (debug level)
|
||
- [x] Дополнительные настройки
|
||
- timeout_ms - продолжительность показа (0 = системное значение)
|
||
- urgency - уровень важности: "low", "normal", "critical" (только Linux)
|
||
- Красивые эмодзи для типов медиа
|
||
- [ ] Опциональные улучшения (не критично)
|
||
- Кросс-платформенное тестирование (требует ручного тестирования)
|
||
- icon - кастомная иконка приложения
|
||
- Actions в уведомлениях (кнопки "Ответить", "Прочитано")
|