You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

5.2 KiB

Приглашение в группу через PM

В desktop chatgui и Android кнопка «+» доступна в строке другого участника и в шапке личной беседы. Она открывает один диалог с фиксированным получателем и выбором группы, в которой отправитель состоит. Группа не выбирается автоматически.

После нажатия «Пригласить» клиент создаёт свежую ссылку через invite_build, ожидает подтверждения регистрации ключа и отправляет ссылку обычным текстовым PM. Успех означает сохранение сообщения и исходящей задачи в одной транзакции. Доставку, повтор и шифрование обеспечивает существующий механизм DM. После успешной отправки открывается личная беседа с получателем.

Срок действия ключа — 10 минут с момента создания, а не получения PM. Он указан в диалогах отправки и подключения. Поздняя offline-доставка может принести уже просроченную ссылку; в этом случае нужно новое приглашение. Ссылка не содержит время истечения, поэтому клиент показывает длительность, без обратного отсчёта и вычисления оставшегося времени.

Нажатие на utun:// в сообщении запускает существующий JOIN и показывает его результат. Если клиент уже состоит в группе, открывается эта группа. Перенос длинной ссылки не меняет её содержимое; на desktop перетаскивание выделяет текст без запуска JOIN.

Контракт операции

dm_invite_trampoline выполняется в uasync-потоке. Запрос содержит request_id, ID получателя, выбранную группу и исходную общую группу для создания PM. Из шапки существующей PM исходная группа может быть пустой.

На instance допускается одно ожидание регистрации приглашения в PM. Повтор во время ожидания возвращает BUSY. Закрытие диалога отменяет только соответствующий request_id; уже отправленное сообщение не отзывается. Отмена и остановка DM завершают принятый запрос ровно один раз.

CHAT_EVT_DM_INVITE_RESULT содержит 28 байт: [request_id:u64][result:i32][peer:u64][conv_id:u64] в порядке байтов ядра. Desktop и Android сопоставляют результат с запросом и получателем. Ошибки регистрации или сохранения сообщения оставляют диалог открытым для повторной попытки.

JOIN во вторую группу может использовать уже открытый транспорт общей группы. Поэтому обработчики JOIN_REQUEST и JOIN_READY явно планируют member_sync, а JOIN_READY обновляет кеш каналов до запуска синхронизации.

Проверка и диагностика

  • tests/test_dm_invite: настоящая UDP-доставка ссылки в другую группу, JOIN, репликация участника и отправка группового сообщения после вступления; отмена, BUSY, неверная группа, rollback при ошибке commit и остановка DM.
  • tests/test_chat_join, tests/test_chat_join_e2e, tests/test_dm_e2e: существующие сценарии регистрации ключей, JOIN и PM-доставки.
  • Qt test_invite_links: переносы двух ссылок, их полное содержимое при нажатии, выделение текста и выбор получателя кнопкой в строке участника.
  • Qt test_emoji_playback: перетаскивание ссылки не активирует подключение.

Для сетевого теста подробности включаются через UTUN_TEST_DEBUG=1. В приложении полезны категории dm=debug, chat_sync=debug, member_sync=debug. Операция пишет request, peer, group, результат и TTL; сообщения диагностики новой операции не выводят саму invite-ссылку.