diff --git a/.gitignore b/.gitignore index ea8c4bf..c1ace0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,7 @@ /target + +# TDLib session data (contains auth tokens - NEVER commit!) +/tdlib_data/ + +# Environment variables (contains API keys) +.env diff --git a/CONTEXT.md b/CONTEXT.md new file mode 100644 index 0000000..ea706f7 --- /dev/null +++ b/CONTEXT.md @@ -0,0 +1,80 @@ +# Текущий контекст проекта + +## Статус: Базовая интеграция с TDLib работает + +### Что сделано + +#### TDLib интеграция +- Подключена библиотека `tdlib-rs` v1.1 с автоматической загрузкой TDLib +- Реализована авторизация через телефон + код + 2FA пароль +- Сессия сохраняется автоматически в папке `tdlib_data/` +- Отключены логи TDLib через FFI вызов `td_execute` до создания клиента +- Updates обрабатываются в отдельном потоке через `mpsc` канал (неблокирующе) + +#### Функциональность +- Загрузка списка чатов (до 50 штук) +- Отображение названия чата и счётчика непрочитанных +- Загрузка истории сообщений при открытии чата +- Отображение сообщений с именем отправителя и временем + +#### Управление +- `j/k` или стрелки — навигация по списку чатов +- `д/л` — русская раскладка для j/k +- `Enter` — открыть выбранный чат +- `Esc` — закрыть открытый чат +- `Ctrl+k` — перейти к первому чату +- `Ctrl+R` — обновить список чатов +- `Ctrl+C` — выход + +### Структура проекта + +``` +src/ +├── main.rs # Точка входа, UI рендеринг, event loop +├── tdlib/ +│ ├── mod.rs # Модуль экспорта +│ └── client.rs # TdClient: авторизация, загрузка чатов, сообщений +``` + +### Ключевые решения + +1. **Неблокирующий receive**: TDLib updates приходят в отдельном потоке и передаются в main loop через `mpsc::channel`. Это позволяет UI оставаться отзывчивым. + +2. **FFI для логов**: Используем прямой вызов `td_execute` для отключения логов синхронно, до создания клиента, чтобы избежать вывода в терминал. + +3. **Синхронизация чатов**: Чаты загружаются асинхронно через updates. Main loop периодически синхронизирует `app.chats` с `td_client.chats`. + +### Зависимости (Cargo.toml) + +```toml +ratatui = "0.29" +crossterm = "0.28" +tdlib-rs = { version = "1.1", features = ["download-tdlib"] } +tokio = { version = "1", features = ["full"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +dotenvy = "0.15" +``` + +### Переменные окружения (.env) + +``` +API_ID=your_api_id +API_HASH=your_api_hash +``` + +## Что НЕ сделано / TODO + +- [ ] Отправка сообщений +- [ ] Поиск по чатам +- [ ] Папки телеграма (сейчас только "All") +- [ ] Отображение онлайн-статуса пользователя +- [ ] Markdown форматирование в сообщениях +- [ ] Скролл истории сообщений +- [ ] Отметка сообщений как прочитанные +- [ ] Обновление чатов в реальном времени (новые сообщения) + +## Известные проблемы + +1. При первом запуске нужно пройти авторизацию +2. Имя отправителя показывается как "User_ID" (нужно загружать имена пользователей) diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md index e1ee5e3..9e1278b 100644 --- a/REQUIREMENTS.md +++ b/REQUIREMENTS.md @@ -65,13 +65,21 @@ 7) Esc - закрытие открытого чата 8) command + стрелка вверх (или ctrl + k) - выделяем самый верхний чат (без открытия) 9) поддержка русской раскладки: "р о л д" соответствует "h j k l" -10) `**commands**` - сюда вставь описания команд, которые есть в приложении +10) Ctrl+R - обновить список чатов + +### Реализованные команды (footer) + +``` +j/k: Navigate | Ctrl+k: First | Enter: Open | Esc: Close | Ctrl+R: Refresh | Ctrl+C: Quit +``` ## Технологии Пишем на rust-е 1) ratatui - для tui интерфейса -2) rust-tdlib - для подключения апи телеграма +2) tdlib-rs - для подключения апи телеграма (обёртка над TDLib) +3) tokio - async runtime +4) crossterm - кроссплатформенный терминал ## Нефункциональные требования diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..6f3c57c --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,48 @@ +# 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 [IN PROGRESS] + +- [ ] Отправка сообщений +- [ ] Поиск по чатам (Ctrl+S) +- [ ] Скролл истории сообщений +- [ ] Загрузка имён пользователей (вместо User_ID) +- [ ] Отметка сообщений как прочитанные +- [ ] Реальное время: новые сообщения + +## Фаза 4: Папки и фильтрация + +- [ ] Загрузка папок из Telegram +- [ ] Переключение между папками (Cmd+1, Cmd+2, ...) +- [ ] Фильтрация чатов по папке + +## Фаза 5: Расширенный функционал + +- [ ] Отображение онлайн-статуса +- [ ] Статус доставки/прочтения (✓, ✓✓) +- [ ] Поддержка медиа-заглушек (фото, видео, голосовые) +- [ ] Mentions (@) +- [ ] Muted чаты (серый цвет) + +## Фаза 6: Полировка + +- [ ] Оптимизация 60 FPS +- [ ] Минимальное разрешение 600 символов +- [ ] Обработка ошибок сети +- [ ] Graceful shutdown diff --git a/tdlib_data/db.sqlite b/tdlib_data/db.sqlite index 27c0e02..906e579 100644 Binary files a/tdlib_data/db.sqlite and b/tdlib_data/db.sqlite differ diff --git a/tdlib_data/db.sqlite-shm b/tdlib_data/db.sqlite-shm index 138386c..f286dd0 100644 Binary files a/tdlib_data/db.sqlite-shm and b/tdlib_data/db.sqlite-shm differ diff --git a/tdlib_data/db.sqlite-wal b/tdlib_data/db.sqlite-wal index f18d8bc..9e46cdf 100644 Binary files a/tdlib_data/db.sqlite-wal and b/tdlib_data/db.sqlite-wal differ diff --git a/tdlib_data/td.binlog b/tdlib_data/td.binlog index 2c8db61..ac14819 100644 Binary files a/tdlib_data/td.binlog and b/tdlib_data/td.binlog differ