776271ff36d74f4b19c6cca6fed2836e656f3a73
Documented new feature for playing voice messages directly from TUI with full playback controls and visual feedback. Documentation Changes: - ROADMAP.md: Added Phase 12 with 7 stages - Stage 1: Audio infrastructure (audio module, AudioPlayer, VoiceCache) - Stage 2: TDLib integration (VoiceNoteInfo, download_voice_note) - Stage 3: UI for playback (progress bar, status indicators, footer) - Stage 4: Hotkeys (play/pause, stop, seek, volume control) - Stage 5: Configuration and UX (AudioConfig, ticker updates) - Stage 6: Error handling and fallback (system player) - Stage 7: Additional improvements (prefetching, animations) - CONTEXT.md: Added PLANNED section for Phase 12 - Technical stack: rodio 0.17, TDLib downloadFile - Platforms: Linux (ALSA/PulseAudio), macOS (CoreAudio), Windows (WASAPI) - Architecture: src/audio/ module with 3 submodules - LRU cache (100 MB limit) - Async loading, ticker for progress updates - Configuration options in config.toml - Fallback to system players (mpv, ffplay) - HOTKEYS.md: Added new hotkeys - `Space` - play/pause (in voice message selection mode) - `s` / `ы` - stop playback - `←` / `→` - seek -5s/+5s (during playback) - `↑` / `↓` - volume +/-10% (during playback) - Added new "Voice Playback" section - Added new "Voice Playback Mode" section - PROJECT_STRUCTURE.md: Added audio/ module documentation - player.rs - AudioPlayer with rodio - cache.rs - VoiceCache for downloaded OGG files - state.rs - PlaybackState (status, position, duration, volume) - Updated dependencies section (rodio 0.17) - Updated App state with audio fields Technical Details: - rodio 0.17 Pure Rust audio library (cross-platform) - OGG Opus support (Telegram voice message format) - Visual progress bar: ▶ ████████░░░░░░ 0:08 / 0:15 - Status indicators: ▶ (playing), ⏸ (paused), ⏹ (stopped), ⏳ (loading) - Smart caching with size limits - Async non-blocking file download - Ticker for smooth progress updates (100ms) - Graceful fallback to system players New Configuration (config.toml): - enabled: bool - enable/disable audio playback - default_volume: f32 - volume (0.0 - 1.0) - seek_step_seconds: i32 - seek step in seconds (default 5) - autoplay: bool - autoplay on selection - cache_size_mb: usize - cache size limit in MB - show_waveform: bool - show waveform visualization - system_player_fallback: bool - use system player fallback - system_player: String - system player command (mpv, ffplay) Status: PLANNED (documentation complete, implementation pending) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
tele-tui
Консольный Telegram клиент с Vim-style навигацией.
Возможности
- Полная интеграция с Telegram: отправка/получение сообщений, редактирование, удаление, пересылка
- Vim-style навигация: hjkl + поддержка русской раскладки (ролд)
- Markdown форматирование: жирный, курсив, подчёркивание, зачёркивание, код, спойлеры, ссылки
- Реакции на сообщения: emoji picker с навигацией стрелками
- Папки Telegram: переключение между папками (1-9)
- Поиск: по чатам (Ctrl+S) и внутри чата (Ctrl+F)
- Черновики: автосохранение набранного текста при переключении чатов
- Typing indicator: показывает когда собеседник печатает
- Закреплённые сообщения: отображение и переход к закреплённому сообщению
- Копирование в буфер: copy сообщений в системный буфер обмена
- Профиль: просмотр информации о пользователе/чате
- Конфигурация: настройка цветов и часового пояса через TOML
- Оптимизация: 60 FPS, умное кеширование, graceful shutdown
Установка
Требования
- Rust 1.70+
- TDLib (скачивается автоматически через tdlib-rs)
Сборка
git clone https://github.com/your-username/tele-tui.git
cd tele-tui
cargo build --release
API Credentials
Получите API credentials на https://my.telegram.org/apps
Создайте файл ~/.config/tele-tui/credentials:
API_ID=your_api_id
API_HASH=your_api_hash
Или используйте .env файл в директории проекта:
API_ID=your_api_id
API_HASH=your_api_hash
Использование
cargo run --release
При первом запуске нужно пройти авторизацию (телефон + код + опционально 2FA пароль).
Конфигурация
Конфигурационный файл создаётся автоматически в ~/.config/tele-tui/config.toml:
[general]
# Часовой пояс в формате "+03:00" или "-05:00"
timezone = "+03:00"
[colors]
# Поддерживаемые цвета: black, red, green, yellow, blue, magenta, cyan, gray, white,
# darkgray, lightred, lightgreen, lightyellow, lightblue, lightmagenta, lightcyan
incoming_message = "white"
outgoing_message = "green"
selected_message = "yellow"
reaction_chosen = "yellow"
reaction_other = "gray"
Горячие клавиши
Навигация
↑/↓илиk/j(р/о) — навигация по списку чатовEnter— открыть чат / отправить сообщениеEsc— закрыть чат / отменить действие1-9— переключение между папкамиCtrl+S— поиск по чатамCtrl+R— обновить список чатовCtrl+C— выход
В открытом чате
↑/↓— скролл сообщенийCtrl+F— поиск в чатеn/N— следующий/предыдущий результат поискаi— информация о чате/пользователе
Работа с сообщениями
↑при пустом инпуте — выбор сообщенияEnterв режиме выбора — редактироватьr/к— ответить (reply)f/а— переслать (forward)d/в/Delete— удалитьy/н— скопировать в буферe/у— добавить реакцию
Emoji Picker (реакции)
←/→/↑/↓— навигация по сеткеEnter— добавить/удалить реакциюEsc— закрыть picker
Редактирование текста
←/→— перемещение курсораHome— в начало строкиEnd— в конец строкиBackspace— удалить символ слеваDelete— удалить символ справа
Структура проекта
src/
├── main.rs # Точка входа, event loop
├── config.rs # Конфигурация (TOML), credentials
├── app/ # Состояние приложения
├── ui/ # Отрисовка интерфейса
├── input/ # Обработка ввода
├── utils.rs # Утилиты (форматирование времени, логи)
└── tdlib/ # TDLib интеграция
Зависимости
ratatui0.29 — TUI frameworkcrossterm0.28 — terminal handlingtdlib-rs1.1 — Telegram APItokio1.x — async runtimeserde+serde_json— serializationtoml0.8 — config parsingdirs5.0 — XDG directoriesclipboard0.5 — clipboard accesschrono0.4 — date/time formatting
Тестирование
tele-tui использует snapshot тестирование для UI и интеграционные тесты для логики.
Запуск всех тестов
cargo test
Snapshot тесты
Snapshot тесты проверяют отображение UI компонентов через виртуальный терминал:
# Прогнать snapshot тесты
cargo test --test chat_list
cargo test --test messages
# Посмотреть изменения в snapshots
cargo insta review
# Принять все новые snapshots
cargo insta accept
# Отклонить все изменения
cargo insta reject
Установка cargo-insta
Для работы со snapshot тестами нужен cargo-insta:
cargo install cargo-insta
Структура тестов
tests/
├── helpers/ # Тестовые утилиты
│ ├── app_builder.rs # TestAppBuilder для создания тестовых App
│ ├── test_data.rs # Builders для чатов и сообщений
│ ├── snapshot_utils.rs # Утилиты для snapshot тестов
│ └── fake_tdclient.rs # Mock TDLib клиент (для будущих integration тестов)
├── chat_list.rs # Snapshot тесты для списка чатов (9 тестов)
├── messages.rs # Snapshot тесты для сообщений (18 тестов)
├── modals.rs # Snapshot тесты для модалок (8 тестов)
└── input_field.rs # Snapshot тесты для поля ввода (7 тестов)
Создание snapshot теста
use helpers::test_data::TestChatBuilder;
use helpers::app_builder::TestAppBuilder;
use helpers::snapshot_utils::{render_to_buffer, buffer_to_string};
use insta::assert_snapshot;
#[test]
fn snapshot_my_feature() {
let chat = TestChatBuilder::new("Test Chat", 123)
.unread_count(5)
.build();
let mut app = TestAppBuilder::new()
.with_chat(chat)
.selected_chat(123)
.build();
let buffer = render_to_buffer(80, 24, |f| {
tele_tui::ui::chat_list::render(f, f.area(), &mut app);
});
let output = buffer_to_string(&buffer);
assert_snapshot!("my_feature", output);
}
Покрытие тестами
Текущий прогресс: 81/151 тестов (54%)
- ✅ Фаза 0: Инфраструктура (100%)
- ✅ Фаза 1: UI Snapshot Tests (100%)
- Chat List, Messages, Modals, Input Field, Footer, Screens
- 🔄 Фаза 2: Integration Tests (35%)
- ✅ Send Message Flow (6 тестов)
- ✅ Edit Message Flow (6 тестов)
- ✅ Delete Message Flow (6 тестов)
- ✅ Reply & Forward Flow (8 тестов)
- 📋 Reactions, Search, Drafts, Navigation, Profile, Network (0/48)
Подробный план: TESTING_ROADMAP.md
Документация
- INSTALL.md — подробная инструкция по установке
- HOTKEYS.md — все горячие клавиши
- FAQ.md — часто задаваемые вопросы
- CONTRIBUTING.md — как внести вклад
- PROJECT_STRUCTURE.md — структура проекта
- SECURITY.md — политика безопасности
- CHANGELOG.md — история изменений
- REQUIREMENTS.md — функциональные требования
- DEVELOPMENT.md — правила разработки
- ROADMAP.md — план развития проекта
- REFACTORING_ROADMAP.md — план рефакторинга кода
- TESTING_ROADMAP.md — план покрытия тестами
- TESTING_PROGRESS.md — прогресс тестирования
- CONTEXT.md — текущий статус разработки
Лицензия
MIT
Languages
Rust
100%
