49 lines
2.6 KiB
Markdown
49 lines
2.6 KiB
Markdown
# TDLib integration notes
|
||
|
||
Проект использует `tdlib-rs` с feature `download-tdlib`. Актуальные версии смотри в `crates/tele-core/Cargo.toml` и `crates/tele-tui/Cargo.toml`.
|
||
|
||
## Runtime
|
||
|
||
- Credentials: `~/.config/tele-tui/credentials`, fallback `.env`.
|
||
- TDLib data: `~/.local/share/tele-tui/accounts/{name}/tdlib_data/`.
|
||
- Каждый аккаунт защищён lock file: `~/.local/share/tele-tui/accounts/{name}/tele-tui.lock`.
|
||
|
||
## Auth flow
|
||
|
||
TDLib авторизация идёт через `updateAuthorizationState`:
|
||
|
||
```text
|
||
WaitTdlibParameters -> WaitPhoneNumber -> WaitCode -> WaitPassword? -> Ready
|
||
```
|
||
|
||
UI должен показывать понятное состояние и не блокировать event loop дольше необходимого.
|
||
|
||
## Updates
|
||
|
||
- Receive loop передаёт в UI пару `(client_id, Update)`.
|
||
- UI применяет update только если `client_id == active_client_id`.
|
||
- При переключении аккаунта pending updates старого клиента должны игнорироваться.
|
||
- `tele-core` не вызывает desktop notifications напрямую. Входящие сообщения
|
||
складываются в очередь `IncomingMessageEvent`, которую `tele-tui` drain-ит в
|
||
main loop и передаёт в `NotificationManager`.
|
||
|
||
Это критично для multi-account: без фильтрации старый клиент может испортить state нового аккаунта.
|
||
|
||
## Messages
|
||
|
||
- История грузится порциями, открытие чата не должно блокировать первый redraw.
|
||
- Reply-info и downloads уходят в фоновые задачи.
|
||
- Read/unread для исходящих сообщений должен опираться на `last_read_outbox_message_id`.
|
||
- Send/edit/delete/forward/search проходят через `TdClientTrait`, чтобы тесты могли использовать `FakeTdClient`.
|
||
|
||
## Folders
|
||
|
||
Telegram-папки доступны через TDLib chat folders и переключаются клавишами `1`-`9`.
|
||
|
||
## Практические правила
|
||
|
||
- Не добавлять долгие `await` в UI loop без явной причины.
|
||
- Не смешивать updates разных `client_id`.
|
||
- Не обходить `TdClientTrait` в коде, который должен тестироваться.
|
||
- Не хранить TDLib database в корне проекта; использовать XDG account paths.
|