Browse Source

Wire desktop invitation sending and joining from message links

master
evgeny 5 days ago
parent
commit
d369ff968d
  1. 42
      tools/chatgui/src/mainwindow.cpp
  2. 2
      tools/chatgui/src/mainwindow.h

42
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<DmInviteDialog*>(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) {

2
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);

Loading…
Cancel
Save