- Общий модуль invite_build: сборка utun://-ссылок, авто-выбор лучшего достижимого узла, список кандидатов (вынесено из android jni_bridge) - chatgui: диалог invite с выбором узла (комбобокс), события INVITE_CANDIDATES / INVITE_LINK_READY через gui_bridge - headless/chatcli: invite <ch_id> [node_id], команда invite_nodes - tcp_io: error_cb отличает грациозный EPOLLHUP (SO_ERROR==0) от реальной ошибки — при приостановленном чтении FIN не роняет недослейные данные (фикс flaky half-close) - run_test.sh: half-close echo на выделенном порту 19190 + отдельный DNAT (был недостижим)
87 lines
3.6 KiB
Plaintext
87 lines
3.6 KiB
Plaintext
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"
|
|
|
|
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
|