Browse Source

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)
v2
evgeny 3 weeks ago
parent
commit
6c857ceab8
  1. 12
      src/chat/chat_sync.c
  2. 34
      tools/chatgui/src/inviteby.cpp
  3. 2
      tools/chatgui/src/inviteby.h
  4. 5
      tools/chatgui/src/joindialog.cpp

12
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; size_t dlen = entry->len;
uint64_t group_id = be64toh(*(const uint64_t*)(d + 1)); 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]; 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", 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); CS_ID, cs_msg_name(type), type, (unsigned long long)peer, ch_id, dlen);
const uint8_t* pl = d + 10; const uint8_t* pl = d + 10;

34
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::returnPressed, this, &InviteByLinkDialog::onSendInvite);
connect(m_inviteLinkEdit, &QLineEdit::textChanged, this, &InviteByLinkDialog::onInviteLinkTextChanged); 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() { void InviteByLinkDialog::onInviteLinkTextChanged() {
@ -164,6 +173,7 @@ void InviteByLinkDialog::onSendInvite() {
m_inviteSending = true; m_inviteSending = true;
m_inviteSendBtn->setEnabled(false); m_inviteSendBtn->setEnabled(false);
m_inviteTargetNodeId = targetNodeId;
GUI_INFO("invite_by_link: channel=%s target=0x%016llx addrs=%d", GUI_INFO("invite_by_link: channel=%s target=0x%016llx addrs=%d",
m_channelId.toUtf8().constData(), targetNodeId, d.addrs.size()); m_channelId.toUtf8().constData(), targetNodeId, d.addrs.size());
@ -184,9 +194,27 @@ void InviteByLinkDialog::onSendInvite() {
(const uint8_t*)d.pubkey.constData(), (const uint8_t*)d.pubkey.constData(),
(const uint8_t*)addrsBuf.constData(), d.addrs.size(), addrsBuf.size()); (const uint8_t*)addrsBuf.constData(), d.addrs.size(), addrsBuf.size());
setInviteStatus(QString::fromUtf8("Приглашение отправлено. OK")); setInviteStatus(QString::fromUtf8("Приглашение отправлено, ожидание ответа..."));
QTimer::singleShot(2000, this, [this]() { }
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_inviteSending = false;
m_inviteSendBtn->setEnabled(true); 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);
}
} }

2
tools/chatgui/src/inviteby.h

@ -12,10 +12,12 @@ class InviteByLinkDialog : public QDialog {
Q_OBJECT Q_OBJECT
public: public:
explicit InviteByLinkDialog(const QString& channelId, UtunNode* node, QWidget* parent = nullptr); explicit InviteByLinkDialog(const QString& channelId, UtunNode* node, QWidget* parent = nullptr);
~InviteByLinkDialog() override;
private slots: private slots:
void onInviteLinkTextChanged(); void onInviteLinkTextChanged();
void onSendInvite(); void onSendInvite();
void onConnectResult(uint64_t nodeId, uint64_t channelId, int result);
private: private:
void setInviteStatus(const QString& text, bool isError = false); void setInviteStatus(const QString& text, bool isError = false);

5
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."; const char* errMsg = "Unknown error.";
switch (result) { switch (result) {
case -1: errMsg = "Channel not found."; break; case -1: errMsg = "Channel not found."; break;
case -3: errMsg = "Connection timed out."; break; case 2: errMsg = "Connection timed out."; break;
case -4: errMsg = "Peer is unreachable."; break; case -7: errMsg = "Node not initialized."; break;
case -6: errMsg = "Already connected to this peer."; break;
default: break; default: break;
} }
setStatus(QString("Connection failed: %1").arg(errMsg), true); setStatus(QString("Connection failed: %1").arg(errMsg), true);

Loading…
Cancel
Save