|
|
|
|
@ -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) { |
|
|
|
|
|