6.4 KiB
Текущий контекст проекта
Статус: Фаза 3 — улучшение UX
Что сделано
TDLib интеграция
- Подключена библиотека
tdlib-rsv1.1 с автоматической загрузкой TDLib - Реализована авторизация через телефон + код + 2FA пароль
- Сессия сохраняется автоматически в папке
tdlib_data/ - Отключены логи TDLib через FFI вызов
td_executeдо создания клиента - Updates обрабатываются в отдельном потоке через
mpscканал (неблокирующе)
Функциональность
- Загрузка списка чатов (до 50 штук)
- Фильтрация чатов: показываются только чаты из ChatList::Main (без архива)
- Отображение названия чата, счётчика непрочитанных и @username
- Иконка 📌 для закреплённых чатов
- Загрузка истории сообщений при открытии чата (множественные попытки)
- Группировка сообщений по дате (разделители "Сегодня", "Вчера", дата)
- Группировка сообщений по отправителю (заголовок с именем)
- Отображение времени сообщений в формате [HH:MM]
- Галочки прочтения (✓ отправлено, ✓✓ прочитано)
- Отправка текстовых сообщений
- Новые сообщения в реальном времени при открытом чате
- Поиск по чатам (Ctrl+S): фильтрация по названию и @username
Управление
↑/↓стрелки — навигация по списку чатовEnter— открыть чат / отправить сообщениеEsc— закрыть открытый чат / отменить поискCtrl+S— поиск по чатам (фильтрация по названию и username)Ctrl+R— обновить список чатовCtrl+C— выходCmd+↑/Cmd+↓— скролл сообщений в открытом чате (с подгрузкой старых)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: авторизация, чаты, сообщения, кеш usernames
Ключевые решения
-
Неблокирующий receive: TDLib updates приходят в отдельном потоке и передаются в main loop через
mpsc::channel. Это позволяет UI оставаться отзывчивым. -
FFI для логов: Используем прямой вызов
td_executeдля отключения логов синхронно, до создания клиента, чтобы избежать вывода в терминал. -
Синхронизация чатов: Чаты загружаются асинхронно через updates. Main loop периодически синхронизирует
app.chatsсtd_client.chats. -
Кеширование usernames: При получении
Update::Userсохраняем username в HashMap. При получении приватного чата связываем chat_id с user_id. -
Группировка сообщений: Сообщения группируются по дате (разделители) и по отправителю (заголовки). Время отображается рядом с каждым сообщением.
-
Новые сообщения:
current_chat_idотслеживает открытый чат. При полученииNewMessageдля этого чата сообщение добавляется сразу.
Зависимости (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)