Mikhail Kilin 5f1d715e8f fix: eliminate infinite recursion in TdClientTrait implementation
CRITICAL BUG FIX: Three methods in TdClientTrait impl were calling themselves recursively instead of delegating to actual implementations, causing stack overflow and application panic on startup.

Fixed methods:
1. user_cache_mut() - now returns &mut self.user_cache directly
2. sync_notification_muted_chats() - now delegates to notification_manager.sync_muted_chats()
3. handle_update() - now properly delegates to TdClient::handle_update() using qualified path

This bug caused the app to hang on "Инициализация TDLib..." screen and exit raw mode, displaying escape sequences ("CB52") on key presses when user tried to interact.

Root cause: Introduced in refactoring commit bd5e5be where trait implementations were created but incorrectly delegated to self.method() instead of accessing struct fields directly or using qualified path syntax.

Also added panic hook in main.rs to ensure terminal restoration on panic for better debugging experience.

Impact: Application completely broken - couldn't start. Stack overflow on first update.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 12:57:55 +03:00
2026-01-28 01:29:03 +03:00
2026-01-31 03:48:50 +03:00
2026-01-20 01:00:12 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 11:39:21 +03:00
2026-01-20 01:00:12 +03:00
2026-01-28 01:29:03 +03:00
2026-01-20 01:00:12 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-02-02 02:32:02 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-01-29 01:22:57 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-01-28 01:29:03 +03:00
2026-01-30 16:18:16 +03:00
2026-01-31 23:02:53 +03:00

tele-tui

License: MIT Rust

Консольный Telegram клиент с Vim-style навигацией.

tele-tui screenshot

Возможности

  • Полная интеграция с 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 интеграция

Зависимости

  • ratatui 0.29 — TUI framework
  • crossterm 0.28 — terminal handling
  • tdlib-rs 1.1 — Telegram API
  • tokio 1.x — async runtime
  • serde + serde_json — serialization
  • toml 0.8 — config parsing
  • dirs 5.0 — XDG directories
  • clipboard 0.5 — clipboard access
  • chrono 0.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

Документация

Лицензия

MIT

Description
No description provided
Readme MIT 14 MiB
Languages
Rust 100%