diff --git a/tools/chatgui/src/mainwindow.cpp b/tools/chatgui/src/mainwindow.cpp index 28847274..595dcb88 100644 --- a/tools/chatgui/src/mainwindow.cpp +++ b/tools/chatgui/src/mainwindow.cpp @@ -4,6 +4,7 @@ #include "messagedelegate.h" #include "accountlist.h" #include "invitedialog.h" +#include "dminvitedialog.h" #include "inviteby.h" #include "joindialog.h" #include "settingsdialog.h" @@ -546,6 +547,9 @@ void MainWindow::setupConnects() { connect(m_accountList, &AccountList::callRequested, this, &MainWindow::onCallRequested); connect(m_messageList, &MessageList::callRequested, this, &MainWindow::onCallRequested); connect(m_accountList, &AccountList::pmRequested, this, &MainWindow::onPmRequested); + connect(m_accountList, &AccountList::inviteRequested, this, &MainWindow::onInviteToPmRequested); + connect(m_messageList, &MessageList::inviteRequested, this, &MainWindow::onInviteToPmRequested); + connect(m_messageList, &MessageList::inviteLinkActivated, this, &MainWindow::onInviteLinkActivated); connect(m_messageList, &MessageList::readPositionChanged, this, [this](const QString& channelId, qint64 lastReadMsgId) { Q_UNUSED(lastReadMsgId); @@ -673,9 +677,47 @@ void MainWindow::onDmConvUpdated(const QString& convId) { if (!m_channelList) return; QString key = QStringLiteral("dm:") + convId; m_channelList->loadChannels(); + if (qobject_cast(QApplication::activeModalWidget())) return; m_channelList->selectChannel(key); } +void MainWindow::onInviteToPmRequested(const QString& source, quint64 peer, const QString& name) { + if (!m_db || !m_db->isOpen() || !m_node || !m_node->isRunning()) { + GUI_ERROR("invite PM: node unavailable"); + QMessageBox::warning(this, QStringLiteral("Приглашение"), QStringLiteral("Ядро не запущено.")); return; + } + if (!peer || peer == m_db->myNodeId()) { GUI_ERROR("invite PM: invalid recipient"); return; } + DmInviteDialog dialog(m_db, peer, name, source, this); + if (dialog.exec() == QDialog::Accepted) { + m_channelList->loadChannels(); + m_channelList->selectChannel(QStringLiteral("dm:") + dialog.conversationId()); + } +} + +void MainWindow::onInviteLinkActivated(const QString& link) { + const auto invite = decodeInviteLink(link); + if (!invite.error.isEmpty()) { + GUI_ERROR("invite link: invalid error=%s", qPrintable(invite.error)); + QMessageBox::warning(this, QStringLiteral("Приглашение"), QStringLiteral("Некорректная ссылка: ") + invite.error); return; + } + if (!m_db || !m_db->isOpen() || !m_node || !m_node->isRunning()) { + GUI_ERROR("invite link: node unavailable"); + QMessageBox::warning(this, QStringLiteral("Приглашение"), QStringLiteral("Ядро не запущено.")); return; + } + const QString channelId = QString::number(invite.channelId); + for (const auto& channel : m_db->getChannels()) { + if (channel.channelId == channelId && topo_node_sqlite_member_in_channel(m_db->db(), channelId.toUtf8().constData(), m_db->myNodeId())) { + GUI_INFO("invite link: opening existing group ch=%s", qPrintable(channelId)); + m_channelList->selectChannel(channelId); return; + } + } + JoinDialog dialog(m_node, m_db, this, link); + connect(&dialog, &JoinDialog::joined, this, [this](const QString& channel) { + reloadChannels(); m_channelList->selectChannel(channel); + }); + dialog.exec(); +} + void MainWindow::onDmMsgReceived(const QString& convId, quint64 author) { QString key = QStringLiteral("dm:") + convId; if (m_currentChannelId == key) { diff --git a/tools/chatgui/src/mainwindow.h b/tools/chatgui/src/mainwindow.h index 2a908134..7b706130 100644 --- a/tools/chatgui/src/mainwindow.h +++ b/tools/chatgui/src/mainwindow.h @@ -80,6 +80,8 @@ public: /* DM (p2p чат) */ void onPmRequested(const QString& chId, quint64 nodeId, const QString& name); + void onInviteToPmRequested(const QString& source, quint64 peer, const QString& name); + void onInviteLinkActivated(const QString& link); void onDmConvUpdated(const QString& convId); void onDmMsgReceived(const QString& convId, quint64 author);