115 lines
7.4 KiB
Markdown
115 lines
7.4 KiB
Markdown
# Текущий контекст проекта
|
||
|
||
## Статус: Фаза 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)
|