7.4 KiB
Текущий контекст проекта
Статус: Фаза 3 — улучшение UX
Что сделано
TDLib интеграция
- Подключена библиотека
tdlib-rsv1.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: авторизация, чаты, сообщения, кеш имён
Ключевые решения
-
Неблокирующий receive: TDLib updates приходят в отдельном потоке и передаются в main loop через
mpsc::channel. Это позволяет UI оставаться отзывчивым. -
FFI для логов: Используем прямой вызов
td_executeдля отключения логов синхронно, до создания клиента, чтобы избежать вывода в терминал. -
Синхронизация чатов: Чаты загружаются асинхронно через updates. Main loop периодически синхронизирует
app.chatsсtd_client.chats. -
Кеширование имён: При получении
Update::Userсохраняем имя (first_name + last_name) и username в HashMap. Имена подгружаются асинхронно через очередьpending_user_ids. -
Группировка сообщений: Сообщения группируются по дате (разделители по центру) и по отправителю (заголовки). Исходящие выравниваются вправо, входящие влево.
-
Отметка прочтения: При открытии чата вызывается
view_messagesдля всех сообщений. Новые входящие сообщения автоматически отмечаются как прочитанные.Update::ChatReadOutboxобновляет статус галочек. -
Фильтрация удалённых аккаунтов: Чаты с названием "Deleted Account" или пустым именем пользователя автоматически удаляются из списка.
Зависимости (Cargo.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 форматирование в сообщениях
- Медиа-сообщения (фото, видео, голосовые)
Известные проблемы
- При первом запуске нужно пройти авторизацию
- Время отображается с фиксированным смещением +3 (MSK)