Files
telegram-tui/REQUIREMENTS.md
Mikhail Kilin 051c4a0265
Some checks are pending
CI / Check (pull_request) Waiting to run
CI / Format (pull_request) Waiting to run
CI / Clippy (pull_request) Waiting to run
CI / Build (macos-latest) (pull_request) Waiting to run
CI / Build (ubuntu-latest) (pull_request) Waiting to run
CI / Build (windows-latest) (pull_request) Waiting to run
fixes
2026-01-28 01:29:03 +03:00

11 KiB
Raw Blame History

TTUI - Требование к приложению

Описание приложения

Терминальный интерфейс для telegram

Функциональные требования

Интерфейс

┌─ TTUI ───────────────────────────────────────────────────────────────────────┐ │ 1:All │ 2:Personal │ 3:Work │ 4:Bots │ ├──────────────────────┬───────────────────────────────────────────────────────┤ │ 🔍 Search... │ 👤 Mom (online) │ ├──────────────────────┼───────────────────────────────────────────────────────┤ │ 📌 Saved Messages │ Today, Dec 21│ │ ▌ Mom (2)│ │ │ Boss │ Mom ────────────────────────────────────────── 14:20 │ │ Rust Community │ Привет! Ты покормил кота? │ │ Durov │ │ │ News Channel │ You ─────────────────────────────────────── 14:22 ✓✓ │ │ Spam Bot │ Да, конечно. Купил ему корм. │ │ Wife │ Скоро буду дома. │ │ Team Lead │ │ │ DevOps Chat (9)│ Mom ────────────────────────────────────────── 14:23 │ │ Server Alerts │ Отлично, захвати хлеба. │ │ Gym Bro │ │ │ Design Team │ You ─────────────────────────────────────── 14:25 ✓ │ │ Project X │ Ок. │ │ HR │ │ │ Mom's Friend │ │ │ Taxi Bot │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├──────────────────────┼───────────────────────────────────────────────────────┤ │ [User: Online] │ > message │ └──────────────────────┴───────────────────────────────────────────────────────┘ commands

Список желаемого

  1. футер - список папок в телеграме
  2. список с чатами - лички и группы, сверху инпут для поиска чата
  3. основной контент - открытый чат с сообщениями из чата, если никакой чат не открыт, то контент пустой, ничего не показываем. Снизу - инпут для ввода сообщения в чат, который открыт
  4. снизу списка чата статус онлайн или нет сам пользователь приложения
  5. при открытии чата должна загружаться история чата, а так же подгружаться новые сообщения от собеседника.
  6. выделяем сообщения собеседника его никнеймом, группируем его сообщения и разделяем наши сообщения и сообщения собеседника, как на интерфейсе сверху
  7. отображаем наше сообщение символом , если телеграм подтвердил, что сообщение отправлено, и выделяем ✓✓ если собеседник прочитал его
  8. при навигации в чате выделяем строку курсивом, при выборе чата (то есть его открытии) ставим в начало символ ▌
  9. (2) — счетчик непрочитанных (можно красить в красный/зеленый).
  10. muted — статус чата (серый цвет).
  11. @ — пинг/меншн.
  12. с видео/картинками/голосовые пока ничего не делаем, ренденим заглушку (с упоминанием что это картинка или видео и тд)

Дополнительно реализованные возможности

  1. Markdown форматирование: жирный, курсив, подчёркивание, зачёркивание, код, спойлеры, ссылки, упоминания
  2. Редактирование сообщений: ↑ при пустом инпуте → выбор → Enter → редактирование
  3. Удаление сообщений: d/в/Delete в режиме выбора → подтверждение → удаление
  4. Reply на сообщения: r/к в режиме выбора → превью → отправка ответа
  5. Forward сообщений: f/а в режиме выбора → выбор чата → пересылка
  6. Typing indicator: отображение "печатает..." когда собеседник набирает текст
  7. Закреплённые сообщения: отображение pinned message вверху чата с переходом
  8. Поиск по сообщениям: Ctrl+F для поиска внутри чата, n/N для навигации
  9. Черновики: автосохранение текста при переключении между чатами
  10. Профиль: i для просмотра информации о пользователе/группе
  11. Копирование: y/н для копирования сообщения в системный буфер
  12. Реакции: e/у для добавления реакций, emoji picker с навигацией стрелками
  13. Конфигурация: ~/.config/tele-tui/config.toml для настройки цветов и timezone
  14. Credentials: приоритетная загрузка из ~/.config/tele-tui/credentials или .env
  15. Блочный курсор: Vim-style курсор █ с навигацией ←/→/Home/End
  16. Динамический инпут: автоматическое расширение до 10 строк
  17. Онлайн-статус: зелёная точка ● для онлайн пользователей
  18. Индикаторы: 📌 закреплённые чаты, 🔇 замьюченные, @ упоминания
  19. Состояние сети: индикатор в футере (⚠ Нет сети, Подключение...)
  20. Graceful shutdown: корректное закрытие при Ctrl+C

Управление

  1. ctrl+c или command+c - выход из программы
  2. "h j k l" - влево, вниз, вверх, вправо (навигация в левом столбце) vim-style управление
  3. стрелки - управление, так же как и "h j k l"
  4. "command + 1", "command + 2" и так далее - переключение между папками, которые созданы в телеграме
  5. из интерфейса "message" - это инпут для ввода сообщения в открытый чат
  6. ctrl + s - фокус в инпут поиска чата
  7. Esc - закрытие открытого чата
  8. command + стрелка вверх (или ctrl + k) - выделяем самый верхний чат (без открытия)
  9. поддержка русской раскладки: "р о л д" соответствует "h j k l"
  10. Ctrl+R - обновить список чатов

Реализованные команды

Навигация

↑/↓ или k/j (р/о): Navigate | Enter: Open/Send | Esc: Close/Cancel | 1-9: Folders
Ctrl+S: Search Chats | Ctrl+R: Refresh | Ctrl+F: Search in Chat | Ctrl+C: Quit

Работа с сообщениями

↑ (пустой инпут): Select message | Enter: Edit | r/к: Reply | f/а: Forward
d/в/Delete: Delete | y/н: Copy | e/у: React | i: Profile

Emoji Picker (реакции)

←/→/↑/↓: Navigate | Enter: Toggle reaction | Esc: Close

Технологии

Пишем на rust-е

  1. ratatui 0.29 - для tui интерфейса
  2. tdlib-rs 1.1 - для подключения апи телеграма (обёртка над TDLib)
  3. tokio 1.x - async runtime
  4. crossterm 0.28 - кроссплатформенный терминал
  5. serde + serde_json 1.0 - сериализация/десериализация
  6. toml 0.8 - парсинг конфигурации
  7. dirs 5.0 - XDG директории (config, data)
  8. clipboard 0.5 - работа с системным буфером обмена
  9. chrono 0.4 - форматирование даты/времени
  10. dotenvy 0.15 - загрузка .env файлов

Нефункциональные требования

Производительность

  1. программа должна выдавать 60 фпс
  2. интерфейс не должен мерцать
  3. минимальное разрешение - 600 символов, максимального нет, не ограничиваем