Mikhail Kilin dfd4184039
Some checks failed
ci/woodpecker/pr/check Pipeline failed
fix: keep selection on last/first message instead of deselecting
When pressing down on the last message or up on the first message in
chat navigation, stay on the current message instead of exiting
message selection mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:35:06 +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-02-14 17:57:37 +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%