# Текущий контекст проекта ## Статус: Фаза 3 — улучшение UX ### Что сделано #### TDLib интеграция - Подключена библиотека `tdlib-rs` v1.1 с автоматической загрузкой TDLib - Реализована авторизация через телефон + код + 2FA пароль - Сессия сохраняется автоматически в папке `tdlib_data/` - Отключены логи TDLib через FFI вызов `td_execute` до создания клиента - Updates обрабатываются в отдельном потоке через `mpsc` канал (неблокирующе) #### Функциональность - Загрузка списка чатов (до 50 штук) - **Фильтрация чатов**: показываются только чаты из ChatList::Main (без архива) - Отображение названия чата и счётчика непрочитанных - Загрузка истории сообщений при открытии чата - Отображение сообщений с именем отправителя и временем - **Отправка текстовых сообщений** #### Управление - `j/k` или стрелки — навигация по списку чатов - `д/л` — русская раскладка для j/k - `Enter` — открыть чат / отправить сообщение - `Esc` — закрыть открытый чат - `Ctrl+k` — перейти к первому чату - `Ctrl+R` — обновить список чатов - `Ctrl+C` — выход - Ввод текста в поле сообщения ### Структура проекта ``` src/ ├── main.rs # Точка входа, event loop, TDLib инициализация ├── app/ │ ├── mod.rs # App структура и состояние │ └── state.rs # AppScreen enum ├── ui/ │ ├── mod.rs # Роутинг UI по экранам │ ├── loading.rs # Экран загрузки │ ├── auth.rs # Экран авторизации │ ├── main_screen.rs # Главный экран │ ├── chat_list.rs # Список чатов │ ├── messages.rs # Область сообщений │ └── footer.rs # Подвал с командами ├── input/ │ ├── mod.rs # Роутинг ввода │ ├── auth.rs # Обработка ввода на экране авторизации │ └── main_input.rs # Обработка ввода на главном экране ├── utils.rs # Утилиты (disable_tdlib_logs, format_timestamp) └── 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`. 4. **Фильтрация чатов по ChatList::Main**: Показываем только чаты с позицией в Main списке и ненулевым order. Архивные чаты и связанные группы не отображаются. 5. **Сортировка по TDLib order**: Используем `position.order` для сортировки чатов (учитывает pinned и время). ### Зависимости (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 форматирование в сообщениях - [ ] Скролл истории сообщений (больше 50 сообщений) - [ ] Отметка сообщений как прочитанные - [ ] Обновление чатов в реальном времени (новые сообщения) - [ ] Загрузка имён пользователей (сейчас показывается User_ID) ## Известные проблемы 1. При первом запуске нужно пройти авторизацию 2. Имя отправителя показывается как "User_ID" (нужно загружать имена пользователей)