diff --git a/tools/chatgui/src/invitedialog.cpp b/tools/chatgui/src/invitedialog.cpp index a4ba6774..4d3800fd 100644 --- a/tools/chatgui/src/invitedialog.cpp +++ b/tools/chatgui/src/invitedialog.cpp @@ -97,6 +97,7 @@ InviteDialog::InviteDialog(const QString& link, const QString& channelId, layout->addLayout(invBtnLayout); connect(m_inviteLinkEdit, &QLineEdit::returnPressed, this, &InviteDialog::onSendInvite); + connect(m_inviteLinkEdit, &QLineEdit::textChanged, this, &InviteDialog::onInviteLinkTextChanged); auto *closeBtn = new QPushButton("OK", this); connect(closeBtn, &QPushButton::clicked, this, &QDialog::accept); @@ -118,6 +119,56 @@ void InviteDialog::onInviteByLink() { } void InviteDialog::onInviteLinkTextChanged() { + QString link = m_inviteLinkEdit->text().trimmed(); + if (link.isEmpty()) { + m_inviteStatusLabel->setStyleSheet("color: gray; font-size: 11px; padding: 2px 0;"); + m_inviteStatusLabel->clear(); + return; + } + if (!link.startsWith(QLatin1String("utun://"))) { + m_inviteStatusLabel->setStyleSheet("color: gray; font-size: 11px; padding: 2px 0;"); + m_inviteStatusLabel->setText("Ожидается utun:// ссылка..."); + return; + } + + InviteData d = decodeInviteLink(link); + if (!d.error.isEmpty()) { + m_inviteStatusLabel->setStyleSheet("color: gray; font-size: 11px; padding: 2px 0;"); + m_inviteStatusLabel->setText("Неверная ссылка: " + d.error); + return; + } + + uint64_t targetNodeId = sc_derive_node_id_from_pubkey((const uint8_t*)d.pubkey.constData()); + uint64_t myNodeId = m_node ? m_node->nodeIdHex().toULongLong(nullptr, 16) : 0; + QString pkHex = QString::fromLatin1(d.pubkey.toHex()); + QString pkShort = pkHex.left(8) + ".." + pkHex.right(4); + QString addrInfo; + for (int i = 0; i < d.addrs.size() && i < 3; i++) { + if (i > 0) addrInfo += ", "; + if (d.addrs[i].family == 4 && d.addrs[i].address.size() >= 4) { + uint32_t ip4 = 0; memcpy(&ip4, d.addrs[i].address.constData(), 4); + addrInfo += QString("%1.%2.%3.%4:%5") + .arg((ip4>>24)&0xFF).arg((ip4>>16)&0xFF).arg((ip4>>8)&0xFF).arg(ip4&0xFF) + .arg(d.addrs[i].port); + } else { + addrInfo += QString("v%1:%2").arg(d.addrs[i].family).arg(d.addrs[i].port); + } + } + if (d.addrs.size() > 3) addrInfo += QString(" +%1 more").arg(d.addrs.size() - 3); + + QString diag = QString("Ссылка: узел 0x%1 ключ %2, %3 адр. (%4)") + .arg(targetNodeId, 16, 16, QChar('0')) + .arg(pkShort) + .arg(d.addrs.size()) + .arg(addrInfo); + + if (myNodeId != 0 && myNodeId == targetNodeId) { + m_inviteStatusLabel->setStyleSheet("color: #E67E22; font-size: 11px; padding: 2px 0;"); + m_inviteStatusLabel->setText(diag + " ⚠ Это ваша собственная ссылка"); + } else { + m_inviteStatusLabel->setStyleSheet("color: gray; font-size: 11px; padding: 2px 0;"); + m_inviteStatusLabel->setText(diag); + } } void InviteDialog::setInviteStatus(const QString& text, bool isError) {