5.6 KiB
5.6 KiB
Текущий контекст проекта
Статус: Фаза 3 — улучшение UX
Что сделано
TDLib интеграция
- Подключена библиотека
tdlib-rsv1.1 с автоматической загрузкой TDLib - Реализована авторизация через телефон + код + 2FA пароль
- Сессия сохраняется автоматически в папке
tdlib_data/ - Отключены логи TDLib через FFI вызов
td_executeдо создания клиента - Updates обрабатываются в отдельном потоке через
mpscканал (неблокирующе)
Функциональность
- Загрузка списка чатов (до 50 штук)
- Фильтрация чатов: показываются только чаты из ChatList::Main (без архива)
- Отображение названия чата и счётчика непрочитанных
- Загрузка истории сообщений при открытии чата
- Отображение сообщений с именем отправителя и временем
- Отправка текстовых сообщений
- Поиск по чатам (Ctrl+S): фильтрация списка по названию
Управление
↑/↓стрелки — навигация по списку чатовEnter— открыть чат / отправить сообщениеEsc— закрыть открытый чат / отменить поискCtrl+S— поиск по чатам (фильтрация по названию)Ctrl+R— обновить список чатовCtrl+C— выходCmd+↑/Cmd+↓— скролл сообщений в открытом чате- Ввод текста в поле сообщения
Структура проекта
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 # Список чатов
│ ├── messages.rs # Область сообщений
│ └── footer.rs # Подвал с командами
├── input/
│ ├── mod.rs # Роутинг ввода
│ ├── auth.rs # Обработка ввода на экране авторизации
│ └── main_input.rs # Обработка ввода на главном экране
├── utils.rs # Утилиты (disable_tdlib_logs, format_timestamp)
└── 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. -
Фильтрация чатов: Все чаты добавляются в список при получении
NewChatupdate. Позиции обновляются черезChatPositionupdate. -
Сортировка по TDLib order: Используем
position.orderдля сортировки чатов (учитывает pinned и время).
Зависимости (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 форматирование в сообщениях
- Скролл истории сообщений (больше 50 сообщений)
- Отметка сообщений как прочитанные
- Обновление чатов в реальном времени (новые сообщения)
- Загрузка имён пользователей (сейчас показывается User_ID)
Известные проблемы
- При первом запуске нужно пройти авторизацию
- Имя отправителя показывается как "User_ID" (нужно загружать имена пользователей)