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":"...",...} Успешные poll/vote/react обычно возвращают снимок. Если изменение уже сохранено, но чтение снимка отказало,data содержит ch,message_id,committed:true,snapshot_pending:true. В этом случае повторяют только feedback :повтор poll/react меняет состояние ещё раз. Переменные окружения -------------------- CHATCLI_HOST — хост по умолчанию (127.0.0.1) CHATCLI_PORT — порт по умолчанию (9999) Команды ------- ping Проверка соединения и uptime сервера. Пример: chatcli ping status Статус узла: NTP синхронизация, активные соединения, NAT. Пример: chatcli status channels Список всех каналов с метаданными: id, имя, owner, число мемберов, число сообщений, сколько онлайн. Уже сохранённый канал с отложенной подготовкой истории виден с msgs=0. Пример: chatcli channels members Список участников канала с полным состоянием: node_id, имя, online, connected, публичные ключи (x25519/ed25519 hex), адреса (ip, port, proto, rtt). proto: UDP, TCP или TCP+REALITY; deleted-участник показывается offline. Строки возвращаются целиком с JSON escaping;ошибка SQL/размера не даёт частичный успешный список. Пример: chatcli members 12345 messages [count] Последние N сообщений канала (по умолчанию 20): id, timestamp, author_id, author_name, content_type, data. Пример: chatcli messages 12345 10 send Отправить текстовое сообщение в канал. Пример: chatcli send 12345 "hello world" attach [--video] Ответ приходит после публикации сообщения в локальной БД;ошибка подготовки/сохранения возвращает ok=false. Это не подтверждение доставки пирам. При disconnect подготовка завершается без ответа закрытому клиенту. Прикрепить файл к сообщению. Файл копируется в медиа-каталог канала. С флагом --video — файл обрабатывается как видео: если ffmpeg доступен, перекодируется в H.264/MP4 (720p, ≤2 Мбит); если уже в нужном формате — отправляется как есть. Пример: chatcli attach 12345 /tmp/photo.jpg chatcli attach 12345 /tmp/clip.mov --video poll ... [--multiple] [--custom] Создать неизменяемый опрос. По умолчанию разрешён один пункт. --multiple разрешает несколько пунктов; --custom разрешает собственный текст. Пример: chatcli poll 12345 "Куда пойдём?" "В парк" "В кафе" --multiple --custom Ответ содержит message_id; он также виден в команде messages. vote [option_id ...] [--custom ] Сохранить полный новый ответ. Номера пунктов начинаются с 0, как id в feedback. Пустой выбор без собственного текста отменяет голос, сохраняя новый ver. При выборе одного пункта свой ответ заменяет готовый пункт; при нескольких дополняет выбор. Пример: chatcli vote 12345 0 1 --custom "Ещё один вариант" chatcli vote 12345 react [emoji_or_id] [--off] [--clear] Установить единственную реакцию, заменив предыдущую; --off снимает выбранную, --clear отменяет свою реакцию. Пример: chatcli react 12345 "👍" chatcli react 12345 0 --off chatcli react 12345 --clear reactions Общий каталог постоянных номеров и эмодзи. feedback Текущие реакции, свои состояния, результаты и подписанные ответы участников. Для нескольких пунктов проценты считаются от числа ответивших и могут суммарно превышать 100%. Отсутствующее исходное сообщение обозначается pending; ответы сохраняются до его получения. invite [node_id] Создать invite-ссылку для канала (формат utun://...). Без node_id — автоматический выбор лучшего достижимого узла. С node_id — ссылка ведёт на указанный узел (hex, например 0x1234). Ссылка включает pubkey, адреса выбранного узла и ID канала. Пример: chatcli invite 12345 chatcli invite 12345 0x1a2b3c invite_nodes Список достижимых узлов канала, пригодных для invite (включая свой узел). Ответ содержит auto_node_id — узел, выбранный авто-логикой, и список nodes (node_id, имя). Пример: chatcli invite_nodes 12345 server_link Получить серверную utun:// ссылку текущего узла с постоянным ключом добавления. Требуются включённый chatserver, сохранённый add_key и опубликованные адреса. Ссылка секретная; старые серверные ссылки версии 0x03 нужно получить заново. Пример на сервере: chatcli server_link server_add Добавить выбранный свой канал на сервер по его серверной ссылке. Клиент создаёт обычное приглашение через себя и передаёт его серверу вместе с кодом доступа. Сервер проверяет код и выполняет обычный JOIN по установленному соединению. Ответ adding=true означает запуск; итог приходит событием connect_result через listen. Повторное добавление не создаёт второй канал. Неверный/сменённый ключ даёт результат -10. Пример на клиенте: chatcli server_add 12345 'utun://...' connect Подключиться к каналу по invite-ссылке. Декодирует ссылку, сохраняет pubkey и адреса узла в БД, запускает процесс подключения. Принимает только ссылку CHANNEL версии 0x04; серверная ссылка требует server_add. Пример: chatcli connect 'utun://...' create Создать новый канал. Генерирует ключи 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