chatgui: invite link connect flow + GUI_ERROR always-on diagnostics

- debug_ui.h: remove NDEBUG guard so GUI_ERROR works in Release builds
- invite_link.h/cpp: add error field to InviteData with specific failure reason
- joindialog: show exact decode error in QLabel instead of generic message
- chat_sync: implement invite connect flow (CHANNEL_INFO_REQ/RESP, JOIN, WELCOME)
- topo_node_sqlite: node/address table init and lookup
- utun_node: getInviteAddresses fallback from ETCP sockets
- minor fixes in mainwindow, chat_core, gui_bridge
This commit is contained in:
Evgeny committed 2026-07-13 08:06:19 +03:00
1 parent 102816d0dc
commit 85a91a1320
17 files changed
+747 -127

No files matched your search

+18 -11
View File
@@ -77,9 +77,9 @@ JoinDialog::JoinDialog(UtunNode* node, DbManager* db, QWidget* parent)
connect(m_linkEdit, &QLineEdit::returnPressed, this, &JoinDialog::onConnectClicked);
gui_bridge_set_connect_result_cb([](uint64_t nodeId, int result) {
gui_bridge_set_connect_result_cb([](uint64_t nodeId, uint64_t channelId, int result) {
JoinDialog* dlg = qobject_cast<JoinDialog*>(QApplication::activeModalWidget());
if (dlg) dlg->onConnectResult(nodeId, result);
if (dlg) dlg->onConnectResult(nodeId, channelId, result);
});
}
@@ -105,8 +105,12 @@ void JoinDialog::onConnectClicked() {
setStatus("Parsing link...");
InviteData d = decodeInviteLink(link);
if (d.channelId.isEmpty() || d.pubkey.size() != 32) {
setStatus("Invalid invite link.", true);
if (!d.error.isEmpty()) {
setStatus("Invalid invite link: " + d.error, true);
return;
}
if (d.pubkey.size() != 32) {
setStatus(QString("Invalid invite link: pubkey is %1 bytes (need 32)").arg(d.pubkey.size()), true);
return;
}
if (d.addrs.isEmpty()) {
@@ -124,6 +128,7 @@ void JoinDialog::onConnectClicked() {
nodeId &= 0x7FFFFFFFFFFFFFFFULL;
m_pendingNodeId = nodeId;
m_pendingChannelId = d.channelId;
m_connecting = true;
m_connectBtn->setEnabled(false);
m_linkEdit->setReadOnly(true);
@@ -138,21 +143,23 @@ void JoinDialog::onConnectClicked() {
addrsBuf.append(static_cast<char>(a.port & 0xFF));
}
QByteArray chId = d.channelId.toUtf8();
int addrCount = d.addrs.size();
chat_sync_connect_from_invite(nodeId,
chat_sync_connect_from_invite(d.channelId, nodeId,
(const uint8_t*)d.pubkey.constData(),
(const uint8_t*)addrsBuf.constData(), addrCount,
(const uint8_t*)chId.constData(), chId.size());
(const uint8_t*)addrsBuf.constData(), addrCount);
}
void JoinDialog::onConnectResult(uint64_t nodeId, int result) {
void JoinDialog::onConnectResult(uint64_t nodeId, uint64_t channelId, int result) {
if (!m_connecting || nodeId != m_pendingNodeId) return;
if (result == 0) {
setStatus("Connected successfully!");
QTimer::singleShot(800, this, [this] { accept(); });
setStatus("Connected! Waiting for channel data...");
QTimer::singleShot(800, this, [this] {
QString cid = QString::number(m_pendingChannelId);
emit joined(cid);
accept();
});
} else {
m_connecting = false;
m_connectBtn->setEnabled(true);