53 lines
4.0 KiB
Markdown
53 lines
4.0 KiB
Markdown
# Контекст проекта
|
||
|
||
## Текущий статус
|
||
|
||
Фаза 14: мультиаккаунт, в работе.
|
||
|
||
Цель фазы: безопасные профили Telegram-аккаунтов, переключение аккаунтов и подготовка к более быстрому multi-client UX.
|
||
|
||
## Уже сделано
|
||
|
||
- Профили аккаунтов: `AccountProfile`, `accounts.toml`, XDG data paths.
|
||
- Миграция старого `tdlib_data/` в per-account directory.
|
||
- CLI `--account <name>`.
|
||
- Account switcher modal по `Ctrl+A`: выбор и добавление аккаунта.
|
||
- Single-client переключение через `recreate_client()`.
|
||
- Footer показывает имя аккаунта, если он не `default`.
|
||
- Per-account lock file защищает TDLib database от двух процессов.
|
||
- TDLib receive loop передаёт `client_id`; UI применяет updates только активного клиента.
|
||
- `pending_chat_init` не должен блокировать первый redraw; reply-info и photo downloads уходят в фоновые tasks.
|
||
- Keybindings стали детерминированными; русская vim-раскладка: `h/j/k/l` -> `р/о/л/д`.
|
||
- `AudioPlayer` проверяет наличие `ffplay`.
|
||
- `message_grouping` группирует альбомы без клонирования сообщений.
|
||
- TDLib facade split на scoped traits; generic код больше не получает raw `*_mut` доступ к сообщениям.
|
||
- Локальный `build.rs` удалён: линковкой TDLib управляет зависимость `tdlib-rs`, `cargo check --all-targets --all-features` снова воспроизводим.
|
||
|
||
## Осталось
|
||
|
||
- Быстрые hotkeys `Ctrl+1`..`Ctrl+9` для аккаунтов без модалки.
|
||
- Удаление/переименование аккаунта в account switcher.
|
||
- Бейджи непрочитанных с других аккаунтов.
|
||
- Решить, нужен ли переход от single-client reinit к одновременным клиентам.
|
||
- Добавить/уточнить tests для accounts + TDLib update routing.
|
||
|
||
## Риски
|
||
|
||
- Multi-account код должен фильтровать TDLib updates по `client_id`.
|
||
- Инициализация чата и фоновые downloads не должны блокировать первый redraw.
|
||
- Read/unread статус исходящих сообщений зависит от корректной TDLib metadata.
|
||
- Конфликтующие keybindings должны оставаться детерминированными.
|
||
- Переключение аккаунтов требует проверки lock release/acquire и auth flow.
|
||
|
||
## Ключевые решения
|
||
|
||
- Главный state хранится в `App<T: TdClientTrait>`, чтобы тесты могли использовать `FakeTdClient`.
|
||
- `TdClientTrait` теперь facade поверх scoped traits; чтение текущих сообщений идёт через `Cow`, mutation - через явные update-операции.
|
||
- Пользовательская timezone не хранится в config: runtime использует системную timezone, тесты форматирования используют deterministic time source.
|
||
- Методы `App` разбиты на traits: navigation, messages, compose, search, modal.
|
||
- UI рендерится только при `needs_redraw`; текстовый интерфейс целится в 60 FPS.
|
||
- Фото под feature `images`: inline Halfblocks + modal iTerm2/Sixel.
|
||
- Голосовые сообщения проигрываются через `ffplay`, cache живёт в `~/.cache/tele-tui/voice/`.
|
||
- Credentials читаются из `~/.config/tele-tui/credentials`, fallback `.env`.
|
||
- TDLib data аккаунтов хранится в `~/.local/share/tele-tui/accounts/{name}/tdlib_data/`.
|