diff --git a/src/chat/chat_sync.c b/src/chat/chat_sync.c index 33befb68..9e38a502 100644 --- a/src/chat/chat_sync.c +++ b/src/chat/chat_sync.c @@ -190,9 +190,17 @@ static void chat_sync_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) { size_t dlen = entry->len; uint64_t group_id = be64toh(*(const uint64_t*)(d + 1)); - char ch_id[64]; - if (cs_group_id_to_ch_id(g_cs->inst, group_id, ch_id, sizeof(ch_id)) != 0) { u_free(entry->dgram); queue_entry_free(entry); return; } uint8_t type = d[9]; + char ch_id[64]; + if (cs_group_id_to_ch_id(g_cs->inst, group_id, ch_id, sizeof(ch_id)) != 0) { + /* CHANNEL_INVITE/INFO_REQ приходят для ещё не созданного у нас канала: + group_id == channel_id (numeric), поэтому выводим ch_id напрямую. */ + if (type == CS_MSG_CHANNEL_INVITE || type == CS_MSG_CHANNEL_INFO_REQ) { + snprintf(ch_id, sizeof(ch_id), "%llu", (unsigned long long)group_id); + } else { + u_free(entry->dgram); queue_entry_free(entry); return; + } + } DEBUG_TRACE(DEBUG_CATEGORY_MEMBER_SYNC, "%s: recv %s(%02x) from=%016llx ch=%s len=%zu", CS_ID, cs_msg_name(type), type, (unsigned long long)peer, ch_id, dlen); const uint8_t* pl = d + 10; diff --git a/tools/chatgui/src/inviteby.cpp b/tools/chatgui/src/inviteby.cpp index cb796d8a..4c2775df 100644 --- a/tools/chatgui/src/inviteby.cpp +++ b/tools/chatgui/src/inviteby.cpp @@ -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(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); + } } diff --git a/tools/chatgui/src/inviteby.h b/tools/chatgui/src/inviteby.h index 1fee8597..c8b68e2d 100644 --- a/tools/chatgui/src/inviteby.h +++ b/tools/chatgui/src/inviteby.h @@ -12,10 +12,12 @@ class InviteByLinkDialog : public QDialog { Q_OBJECT public: explicit InviteByLinkDialog(const QString& channelId, UtunNode* node, QWidget* parent = nullptr); + ~InviteByLinkDialog() override; private slots: void onInviteLinkTextChanged(); void onSendInvite(); + void onConnectResult(uint64_t nodeId, uint64_t channelId, int result); private: void setInviteStatus(const QString& text, bool isError = false); diff --git a/tools/chatgui/src/joindialog.cpp b/tools/chatgui/src/joindialog.cpp index 39c18713..3ef10296 100644 --- a/tools/chatgui/src/joindialog.cpp +++ b/tools/chatgui/src/joindialog.cpp @@ -223,9 +223,8 @@ void JoinDialog::onConnectResult(uint64_t nodeId, uint64_t channelId, int result const char* errMsg = "Unknown error."; switch (result) { case -1: errMsg = "Channel not found."; break; - case -3: errMsg = "Connection timed out."; break; - case -4: errMsg = "Peer is unreachable."; break; - case -6: errMsg = "Already connected to this peer."; break; + case 2: errMsg = "Connection timed out."; break; + case -7: errMsg = "Node not initialized."; break; default: break; } setStatus(QString("Connection failed: %1").arg(errMsg), true);