Files
telegram-tui/CONTEXT.md
Mikhail Kilin 1ef341d907 commit
2026-01-21 21:20:18 +03:00

115 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Текущий контекст проекта
## Статус: Фаза 3 — улучшение UX
### Что сделано
#### TDLib интеграция
- Подключена библиотека `tdlib-rs` v1.1 с автоматической загрузкой TDLib
- Реализована авторизация через телефон + код + 2FA пароль
- Сессия сохраняется автоматически в папке `tdlib_data/`
- Отключены логи TDLib через FFI вызов `td_execute` до создания клиента
- Updates обрабатываются в отдельном потоке через `mpsc` канал (неблокирующе)
#### Функциональность
- Загрузка списка чатов (до 50 штук)
- **Фильтрация чатов**: показываются только чаты из ChatList::Main (без архива)
- **Фильтрация удалённых аккаунтов**: "Deleted Account" не отображаются в списке
- Отображение названия чата, счётчика непрочитанных и **@username**
- **Иконка 📌** для закреплённых чатов
- Загрузка истории сообщений при открытии чата (множественные попытки)
- **Группировка сообщений по дате** (разделители "Сегодня", "Вчера", дата) — по центру
- **Группировка сообщений по отправителю** (заголовок с именем)
- **Выравнивание сообщений**: исходящие справа (зелёные), входящие слева
- **Отображение времени и галочек**: `текст (HH:MM ✓✓)` для исходящих, `(HH:MM) текст` для входящих
- **Галочки прочтения** (✓ отправлено, ✓✓ прочитано) — обновляются в реальном времени
- **Отметка сообщений как прочитанных**: при открытии чата счётчик непрочитанных сбрасывается
- **Отправка текстовых сообщений**
- **Новые сообщения в реальном времени** при открытом чате
- **Поиск по чатам** (Ctrl+S): фильтрация по названию и @username
- **Кеширование имён пользователей**: имена загружаются асинхронно и обновляются в UI
#### Управление
- `↑/↓` стрелки — навигация по списку чатов
- `Enter` — открыть чат / отправить сообщение
- `Esc` — закрыть открытый чат / отменить поиск
- `Ctrl+S` — поиск по чатам (фильтрация по названию и username)
- `Ctrl+R` — обновить список чатов
- `Ctrl+C` — выход
- `↑/↓` в открытом чате — скролл сообщений (с подгрузкой старых)
- `1-9` — переключение папок (в списке чатов)
- Ввод текста в поле сообщения
### Структура проекта
```
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 # Список чатов (с pin и username)
│ ├── messages.rs # Область сообщений (выравнивание, группировка)
│ └── footer.rs # Подвал с командами
├── input/
│ ├── mod.rs # Роутинг ввода
│ ├── auth.rs # Обработка ввода на экране авторизации
│ └── main_input.rs # Обработка ввода на главном экране
├── utils.rs # Утилиты (disable_tdlib_logs, format_timestamp, format_date, get_day)
└── 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. **Кеширование имён**: При получении `Update::User` сохраняем имя (first_name + last_name) и username в HashMap. Имена подгружаются асинхронно через очередь `pending_user_ids`.
5. **Группировка сообщений**: Сообщения группируются по дате (разделители по центру) и по отправителю (заголовки). Исходящие выравниваются вправо, входящие влево.
6. **Отметка прочтения**: При открытии чата вызывается `view_messages` для всех сообщений. Новые входящие сообщения автоматически отмечаются как прочитанные. `Update::ChatReadOutbox` обновляет статус галочек.
7. **Фильтрация удалённых аккаунтов**: Чаты с названием "Deleted Account" или пустым именем пользователя автоматически удаляются из списка.
### Зависимости (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. Время отображается с фиксированным смещением +3 (MSK)