chatcli — headless chat CLI for uTun
=====================================

TCP JSON-RPC клиент для управления чатом uTun без GUI.

Настройка сервера
-----------------
В конфиге uTun в секции [chatserver] добавить:
    headless_control_bind=127.0.0.1:9999

Протокол
--------
JSON line: запрос {"id":N,"cmd":"...","params"} → ответ {"id":N,"ok":true,"data":...}
При подписке (subscribe) сервер шлёт асинхронные события: {"event":"...",...}

Переменные окружения
--------------------
CHATCLI_HOST — хост по умолчанию (127.0.0.1)
CHATCLI_PORT — порт по умолчанию (9999)

Команды
-------

ping
    Проверка соединения и uptime сервера.
    Пример: chatcli ping

status
    Статус узла: NTP синхронизация, активные соединения, NAT.
    Пример: chatcli status

channels
    Список всех каналов с метаданными: id, имя, owner, число мемберов,
    число сообщений, сколько онлайн.
    Пример: chatcli channels

members <ch_id>
    Список участников канала с полным состоянием:
    node_id, имя, online, connected, публичные ключи (x25519/ed25519 hex),
    адреса (ip, port, proto, rtt).
    Пример: chatcli members 12345

messages <ch_id> [count]
    Последние N сообщений канала (по умолчанию 20):
    id, timestamp, author_id, author_name, content_type, data.
    Пример: chatcli messages 12345 10

send <ch_id> <text>
    Отправить текстовое сообщение в канал.
    Пример: chatcli send 12345 "hello world"

attach <ch_id> <path> [--video]
    Прикрепить файл к сообщению. Файл копируется в медиа-каталог канала.
    С флагом --video — файл обрабатывается как видео: если ffmpeg доступен,
    перекодируется в H.264/MP4 (720p, ≤2 Мбит); если уже в нужном формате —
    отправляется как есть.
    Пример: chatcli attach 12345 /tmp/photo.jpg
            chatcli attach 12345 /tmp/clip.mov --video

invite <ch_id> [node_id]
    Создать invite-ссылку для канала (формат utun://...).
    Без node_id — автоматический выбор лучшего достижимого узла.
    С node_id — ссылка ведёт на указанный узел (hex, например 0x1234).
    Ссылка включает pubkey, адреса выбранного узла и ID канала.
    Пример: chatcli invite 12345
            chatcli invite 12345 0x1a2b3c

invite_nodes <ch_id>
    Список достижимых узлов канала, пригодных для invite (включая свой узел).
    Ответ содержит auto_node_id — узел, выбранный авто-логикой,
    и список nodes (node_id, имя).
    Пример: chatcli invite_nodes 12345

connect <utun://...>
    Подключиться к каналу по invite-ссылке.
    Декодирует ссылку, сохраняет pubkey и адреса узла в БД,
    запускает процесс подключения.
    Пример: chatcli connect utun://AgR0ZXN0...

create <name>
    Создать новый канал. Генерирует ключи X25519/Ed25519,
    подписывает join-сообщение.
    Пример: chatcli create "My Group"

listen
    Подписаться на события и слушать в реальном времени.
    Получает: новые сообщения, изменения мемберов, приглашения.
    Выход: Ctrl+C
    Пример: chatcli listen

Настройки хоста/порта
---------------------
    chatcli --host 192.168.1.1 --port 8888 channels
    CHATCLI_HOST=10.0.0.1 CHATCLI_PORT=7777 chatcli status
