chat: обрабатывать CHANNEL_INVITE/INFO_REQ для ещё не созданного канала + GUI-результат invite-by-link

- chat_sync: не дропать CHANNEL_INVITE/CHANNEL_INFO_REQ при отсутствии CHAT-группы (group_id == channel_id, выводим ch_id напрямую) — приглашение по ссылке на сервер теперь доходит до autojoin
- inviteby: регистрация connect_result_cb, показ результата, автозакрытие при успехе
- joindialog: исправлен маппинг кодов результата (2=timeout, -1=not found, -7=not init)
This commit is contained in:
evgeny committed 2026-09-09 22:13:52 +03:00
1 parent 22da6bd832
commit 6c857ceab8
4 files changed
+45 -8

No files matched your search

+31 -3
View File
@@ -63,6 +63,15 @@ InviteByLinkDialog::InviteByLinkDialog(const QString& channelId, UtunNode* node,
connect(m_inviteLinkEdit, &QLineEdit::returnPressed, this, &InviteByLinkDialog::onSendInvite);
connect(m_inviteLinkEdit, &QLineEdit::textChanged, this, &InviteByLinkDialog::onInviteLinkTextChanged);
gui_bridge_set_connect_result_cb([](uint64_t nodeId, uint64_t channelId, int result) {
InviteByLinkDialog* dlg = qobject_cast<InviteByLinkDialog*>(QApplication::activeModalWidget());
if (dlg) dlg->onConnectResult(nodeId, channelId, result);
});
}
InviteByLinkDialog::~InviteByLinkDialog() {
gui_bridge_set_connect_result_cb(nullptr);
}
void InviteByLinkDialog::onInviteLinkTextChanged() {
@@ -164,6 +173,7 @@ void InviteByLinkDialog::onSendInvite() {
m_inviteSending = true;
m_inviteSendBtn->setEnabled(false);
m_inviteTargetNodeId = targetNodeId;
GUI_INFO("invite_by_link: channel=%s target=0x%016llx addrs=%d",
m_channelId.toUtf8().constData(), targetNodeId, d.addrs.size());
@@ -184,9 +194,27 @@ void InviteByLinkDialog::onSendInvite() {
(const uint8_t*)d.pubkey.constData(),
(const uint8_t*)addrsBuf.constData(), d.addrs.size(), addrsBuf.size());
setInviteStatus(QString::fromUtf8("Приглашение отправлено. OK"));
QTimer::singleShot(2000, this, [this]() {
setInviteStatus(QString::fromUtf8("Приглашение отправлено, ожидание ответа..."));
}
void InviteByLinkDialog::onConnectResult(uint64_t nodeId, uint64_t channelId, int result) {
if (!m_inviteSending || nodeId != m_inviteTargetNodeId) return;
if (result == 0) {
setInviteStatus(QString::fromUtf8("Узел присоединился к каналу."), false);
QTimer::singleShot(400, this, &QDialog::accept);
} else {
m_inviteSending = false;
m_inviteSendBtn->setEnabled(true);
});
m_inviteSendBtn->setFocus();
const char* errMsg = "Неизвестная ошибка.";
switch (result) {
case -1: errMsg = "Канал не найден."; break;
case 2: errMsg = "Таймаут — узел не ответил."; break;
case -7: errMsg = "Узел не инициализирован."; break;
default: break;
}
setInviteStatus(QString::fromUtf8("Ошибка: %1").arg(QString::fromUtf8(errMsg)), true);
}
}