From 55d9e79983baed40241813ff17eb561a4541296d Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 4 Oct 2026 14:59:07 +0200 Subject: [PATCH] Expose read-only channel membership for invitation UI --- tools/chatgui/db/db_manager.cpp | 11 +++++++++++ tools/chatgui/db/db_manager.h | 1 + 2 files changed, 12 insertions(+) diff --git a/tools/chatgui/db/db_manager.cpp b/tools/chatgui/db/db_manager.cpp index 6b23dee0..02c39562 100644 --- a/tools/chatgui/db/db_manager.cpp +++ b/tools/chatgui/db/db_manager.cpp @@ -144,6 +144,17 @@ QList DbManager::getChannels(ChannelSortMode sort) const { return list; } +bool DbManager::isChannelMember(const QString& chId, quint64 nodeId) const { + const QByteArray sql = QStringLiteral("SELECT 1 FROM \"%1\" WHERE node_id=?").arg(peersTableName(chId)).toUtf8(); + sqlite3_stmt* statement = prepareOrNull(sql.constData()); + if (!statement) return false; + sqlite3_bind_int64(statement, 1, (sqlite3_int64)nodeId); + const int result = sqlite3_step(statement); + if (result != SQLITE_ROW && result != SQLITE_DONE) GUI_ERROR("channel membership read failed ch=%s rc=%d", qPrintable(chId), result); + sqlite3_finalize(statement); + return result == SQLITE_ROW; +} + /* Формирует человекочитаемое тело превью последнего сообщения по content_type и "d"-полю. */ static QString mediaPreviewBody(const QString& ct, const QByteArray& d) { bool isText = ct.isEmpty() || ct == QStringLiteral("text/plain") || diff --git a/tools/chatgui/db/db_manager.h b/tools/chatgui/db/db_manager.h index 230326dc..da73f76f 100644 --- a/tools/chatgui/db/db_manager.h +++ b/tools/chatgui/db/db_manager.h @@ -113,6 +113,7 @@ public: void cleanOrphanedPeers(const QString& chId) const; QString getDisplayName(quint64 nodeId) const; QMap getLocalNicknames(const QString& chId) const; + bool isChannelMember(const QString& chId, quint64 nodeId) const; /* ── Узлы ── */ QByteArray loadNodeInfo(quint64 nodeId) const;