Warning, file /network/ruqola/src/widgets/administratordialog/serverinfo/administratorserverinfowidget.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "administratorserverinfowidget.h"
0008 #include "connection.h"
0009 #include "license/licenseslistjob.h"
0010 #include "misc/lineeditcatchreturnkey.h"
0011 #include "misc/statisticsjob.h"
0012 #include "rocketchataccount.h"
0013 #include "ruqolawidgets_debug.h"
0014 #include "serverinfojob.h"
0015 
0016 #include <KIO/Global>
0017 #include <KLocalizedString>
0018 #include <KTreeWidgetSearchLine>
0019 #include <KTreeWidgetSearchLineWidget>
0020 #include <QApplication>
0021 #include <QClipboard>
0022 #include <QHeaderView>
0023 #include <QMenu>
0024 #include <QPushButton>
0025 #include <QTreeWidget>
0026 #include <QVBoxLayout>
0027 
0028 AdministratorServerInfoWidget::AdministratorServerInfoWidget(RocketChatAccount *account, QWidget *parent)
0029     : QWidget(parent)
0030     , mTreeWidget(new QTreeWidget(this))
0031     , mSearchLineWidget(new KTreeWidgetSearchLineWidget(this, mTreeWidget))
0032     , mRefreshButton(new QPushButton(QIcon::fromTheme(QStringLiteral("view-refresh")), {}, this))
0033     , mRocketChatAccount(account)
0034 {
0035     auto mainLayout = new QVBoxLayout(this);
0036     mainLayout->setObjectName(QStringLiteral("mainLayout"));
0037 #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
0038     mainLayout->setContentsMargins({});
0039     mainLayout->setSpacing(0);
0040 #endif
0041 
0042     auto hboxLayout = new QHBoxLayout;
0043     hboxLayout->setObjectName(QStringLiteral("hboxLayout"));
0044     hboxLayout->setContentsMargins({});
0045     mainLayout->addLayout(hboxLayout);
0046     mSearchLineWidget->setObjectName(QStringLiteral("mSearchLineWidget"));
0047     new LineEditCatchReturnKey(mSearchLineWidget->searchLine(), this);
0048     hboxLayout->addWidget(mSearchLineWidget);
0049     mRefreshButton->setObjectName(QStringLiteral("mRefreshButton"));
0050     mRefreshButton->setToolTip(i18n("Refresh"));
0051     hboxLayout->addWidget(mRefreshButton);
0052     connect(mRefreshButton, &QPushButton::clicked, this, &AdministratorServerInfoWidget::slotRefreshInfo);
0053 
0054     mTreeWidget->setObjectName(QStringLiteral("mTreeWidget"));
0055     mTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
0056     connect(mTreeWidget, &QTreeWidget::customContextMenuRequested, this, &AdministratorServerInfoWidget::slotContextMenu);
0057 
0058     mainLayout->addWidget(mTreeWidget);
0059     mTreeWidget->header()->hide();
0060     mTreeWidget->setColumnCount(2);
0061 }
0062 
0063 AdministratorServerInfoWidget::~AdministratorServerInfoWidget() = default;
0064 
0065 void AdministratorServerInfoWidget::slotContextMenu(const QPoint &pos)
0066 {
0067     QMenu menu(this);
0068     const QModelIndex index = mTreeWidget->indexAt(pos);
0069     menu.addAction(QIcon::fromTheme(QStringLiteral("edit-copy")), i18n("Copy"), this, [index]() {
0070         const QString currentValue = index.data().toString();
0071         QClipboard *clip = QApplication::clipboard();
0072         clip->setText(currentValue, QClipboard::Clipboard);
0073         clip->setText(currentValue, QClipboard::Selection);
0074     });
0075     menu.exec(mTreeWidget->viewport()->mapToGlobal(pos));
0076 }
0077 
0078 void AdministratorServerInfoWidget::slotRefreshInfo()
0079 {
0080     loadStatisticInfo(true);
0081 }
0082 
0083 void AdministratorServerInfoWidget::initialize()
0084 {
0085     if (!mRocketChatAccount->ruqolaServerConfig()->hasAtLeastVersion(4, 0, 0)) {
0086         auto serverInfoJob = new RocketChatRestApi::ServerInfoJob(this);
0087         serverInfoJob->setForceRequiresAuthentication(true);
0088         mRocketChatAccount->restApi()->initializeRestApiJob(serverInfoJob);
0089         connect(serverInfoJob, &RocketChatRestApi::ServerInfoJob::serverInfoDone, this, &AdministratorServerInfoWidget::slotServerInfoDone);
0090         if (!serverInfoJob->start()) {
0091             qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start ServerInfoJob";
0092         }
0093     } else {
0094         loadLicensesInfo();
0095         loadStatisticInfo(false);
0096     }
0097 }
0098 
0099 void AdministratorServerInfoWidget::slotServerInfoDone(const QString &versionInfo, const QJsonObject &obj)
0100 {
0101     Q_UNUSED(versionInfo)
0102     // qDebug() << " obj " << obj;
0103     mServerInfo.parseServerInfo(obj);
0104     // qDebug() << " info " << mServerInfo;
0105     loadStatisticInfo(false);
0106     loadServerInfo();
0107 }
0108 
0109 void AdministratorServerInfoWidget::loadLicensesInfo()
0110 {
0111     auto licenseInfoJob = new RocketChatRestApi::LicensesListJob(this);
0112     mRocketChatAccount->restApi()->initializeRestApiJob(licenseInfoJob);
0113     connect(licenseInfoJob, &RocketChatRestApi::LicensesListJob::licensesListDone, this, &AdministratorServerInfoWidget::slotLicensesListDone);
0114     if (!licenseInfoJob->start()) {
0115         qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start LicensesListJob";
0116     }
0117 }
0118 
0119 void AdministratorServerInfoWidget::slotLicensesListDone(const QJsonObject &obj)
0120 {
0121     // Load Statistic after loading licenses info
0122     fillLicenses(obj);
0123     loadStatisticInfo(false);
0124 }
0125 
0126 void AdministratorServerInfoWidget::fillLicenses(const QJsonObject &obj)
0127 {
0128     QStringList listLicences;
0129     const QJsonArray licenses = obj.value(QStringLiteral("licenses")).toArray();
0130     for (const auto &a : licenses) {
0131         listLicences.append(a.toString());
0132     }
0133     auto licenseItem = new QTreeWidgetItem(mTreeWidget);
0134     licenseItem->setText(0, i18n("Licenses"));
0135     createItemFromLicense(licenseItem, i18n("Omnichannel"), listLicences.contains(QStringLiteral("livechat-enterprise")));
0136     createItemFromLicense(licenseItem, i18n("Auditing"), listLicences.contains(QStringLiteral("auditing")));
0137     createItemFromLicense(licenseItem, i18n("Canned Responses"), listLicences.contains(QStringLiteral("canned-responses")));
0138     createItemFromLicense(licenseItem, i18n("Engagement Dashboard"), listLicences.contains(QStringLiteral("engagement-dashboard")));
0139     createItemFromLicense(licenseItem, i18n("Read Receipts"), listLicences.contains(QStringLiteral("message-read-receipt")));
0140 }
0141 
0142 void AdministratorServerInfoWidget::createItemFromLicense(QTreeWidgetItem *licenseInfoItem, const QString &name, bool valid)
0143 {
0144     auto item = new QTreeWidgetItem(licenseInfoItem);
0145     item->setText(0, name);
0146     item->setIcon(0, valid ? QIcon::fromTheme(QStringLiteral("dialog-ok-apply")) : QIcon::fromTheme(QStringLiteral("dialog-cancel")));
0147     licenseInfoItem->addChild(item);
0148 }
0149 
0150 void AdministratorServerInfoWidget::loadStatisticInfo(bool refresh)
0151 {
0152     auto statisticJob = new RocketChatRestApi::StatisticsJob(this);
0153     statisticJob->setRefresh(refresh);
0154     mRocketChatAccount->restApi()->initializeRestApiJob(statisticJob);
0155     connect(statisticJob, &RocketChatRestApi::StatisticsJob::statisticDone, this, &AdministratorServerInfoWidget::slotStatisticDone);
0156     if (!statisticJob->start()) {
0157         qCDebug(RUQOLAWIDGETS_LOG) << "Impossible to start StatisticsJob";
0158     }
0159 }
0160 
0161 void AdministratorServerInfoWidget::parseServerInfo(QTreeWidgetItem *serverInfoItem, const QJsonObject &obj)
0162 {
0163     createItemFromStringValue(serverInfoItem, obj, i18n("Version"), QStringLiteral("version"));
0164     createItemFromStringValue(serverInfoItem, obj, i18n("Deployment ID"), QStringLiteral("uniqueId"));
0165 }
0166 
0167 void AdministratorServerInfoWidget::createItemFromStringValue(QTreeWidgetItem *parentItem,
0168                                                               const QJsonObject &obj,
0169                                                               const QString &label,
0170                                                               const QString &identifier)
0171 {
0172     const QJsonValue objValue = obj.value(identifier);
0173     if (!objValue.isUndefined()) {
0174         auto item = new QTreeWidgetItem(parentItem);
0175         item->setText(0, label);
0176         item->setText(1, objValue.toString());
0177         item->addChild(item);
0178     }
0179 }
0180 
0181 void AdministratorServerInfoWidget::parseUsageInfo(QTreeWidgetItem *usageInfoItem, const QJsonObject &obj)
0182 {
0183     // qDebug() << " obj " << obj;
0184     createItemFromIntValue(usageInfoItem, obj, i18n("Rocket.Chat App Users"), QStringLiteral("appUsers"));
0185     createItemDisplayFormat(usageInfoItem, obj, i18n("Total Uploads Size"), QStringLiteral("uploadsTotalSize"));
0186     createItemFromIntValue(usageInfoItem, obj, i18n("Total Uploads"), QStringLiteral("uploadsTotal"));
0187 
0188     createItemFromIntValue(usageInfoItem, obj, i18n("Online Users"), QStringLiteral("onlineUsers"));
0189     createItemFromIntValue(usageInfoItem, obj, i18n("Away Users"), QStringLiteral("awayUsers"));
0190     createItemFromIntValue(usageInfoItem, obj, i18n("Offline Users"), QStringLiteral("offlineUsers"));
0191     createItemFromIntValue(usageInfoItem, obj, i18n("Busy Users"), QStringLiteral("busyUsers"));
0192 
0193     createItemFromIntValue(usageInfoItem, obj, i18n("Activated Users"), QStringLiteral("activeUsers"));
0194     createItemFromIntValue(usageInfoItem, obj, i18n("Activated Guests"), QStringLiteral("activeGuests"));
0195     createItemFromIntValue(usageInfoItem, obj, i18n("Deactivated Users"), QStringLiteral("nonActiveUsers"));
0196 
0197     createItemFromIntValue(usageInfoItem, obj, i18n("Total Channels"), QStringLiteral("totalChannels"));
0198     createItemFromIntValue(usageInfoItem, obj, i18n("Total Rooms"), QStringLiteral("totalRooms"));
0199     createItemFromIntValue(usageInfoItem, obj, i18n("Total Private Groups"), QStringLiteral("totalPrivateGroups"));
0200     createItemFromIntValue(usageInfoItem, obj, i18n("Total Direct Message Rooms"), QStringLiteral("totalDirect"));
0201     createItemFromIntValue(usageInfoItem, obj, i18n("Total Threads"), QStringLiteral("totalThreads"));
0202     createItemFromIntValue(usageInfoItem, obj, i18n("Total Users"), QStringLiteral("totalUsers"));
0203     createItemFromIntValue(usageInfoItem, obj, i18n("Total Discussions"), QStringLiteral("totalDiscussions"));
0204     createItemFromIntValue(usageInfoItem, obj, i18n("Total Omnichannel Rooms"), QStringLiteral("totalLivechat"));
0205 
0206     createItemFromIntValue(usageInfoItem, obj, i18n("Total Messages"), QStringLiteral("totalMessages"));
0207     createItemFromIntValue(usageInfoItem, obj, i18n("Total Messages in Channels"), QStringLiteral("totalChannelMessages"));
0208     createItemFromIntValue(usageInfoItem, obj, i18n("Total Messages in Private Groups"), QStringLiteral("totalPrivateGroupMessages"));
0209     createItemFromIntValue(usageInfoItem, obj, i18n("Total Messages in Direct Messages"), QStringLiteral("totalDirectMessages"));
0210     createItemFromIntValue(usageInfoItem, obj, i18n("Total Connected Users"), QStringLiteral("totalConnectedUsers"));
0211 }
0212 
0213 void AdministratorServerInfoWidget::createItemFromIntValue(QTreeWidgetItem *usageInfoItem,
0214                                                            const QJsonObject &obj,
0215                                                            const QString &label,
0216                                                            const QString &identifier)
0217 {
0218     const QJsonValue totalDirectMessages = obj.value(identifier);
0219     if (!totalDirectMessages.isUndefined()) {
0220         auto item = new QTreeWidgetItem(usageInfoItem);
0221         item->setText(0, label);
0222         item->setText(1, QString::number(totalDirectMessages.toInt()));
0223         usageInfoItem->addChild(item);
0224     }
0225 }
0226 
0227 void AdministratorServerInfoWidget::createItemDisplayFormat(QTreeWidgetItem *parentItem,
0228                                                             const QJsonObject &obj,
0229                                                             const QString &label,
0230                                                             const QString &identifier)
0231 {
0232     const QJsonValue objValue = obj.value(identifier);
0233     if (!objValue.isUndefined()) {
0234         auto item = new QTreeWidgetItem(parentItem);
0235         item->setText(0, label);
0236         item->setText(1, KIO::convertSize(objValue.toDouble()));
0237         item->addChild(item);
0238     }
0239 }
0240 
0241 void AdministratorServerInfoWidget::parseRuntimeInfo(QTreeWidgetItem *runtimeInfoItem, const QJsonObject &obj)
0242 {
0243     const QJsonObject runtimeObj = obj.value(QLatin1String("os")).toObject();
0244     createItemFromStringValue(runtimeInfoItem, runtimeObj, i18n("OS Release"), QStringLiteral("release"));
0245     createItemFromStringValue(runtimeInfoItem, runtimeObj, i18n("OS Type"), QStringLiteral("type"));
0246     createItemFromStringValue(runtimeInfoItem, runtimeObj, i18n("OS Platform"), QStringLiteral("platform"));
0247     createItemDisplayFormat(runtimeInfoItem, runtimeObj, i18n("OS Total Memory"), QStringLiteral("totalmem"));
0248     createItemDisplayFormat(runtimeInfoItem, runtimeObj, i18n("OS Free Memory"), QStringLiteral("freemem"));
0249 }
0250 
0251 void AdministratorServerInfoWidget::parseCommitInfo(QTreeWidgetItem *commitInfoItem)
0252 {
0253     {
0254         auto item = new QTreeWidgetItem(commitInfoItem);
0255         item->setText(0, i18n("Hash"));
0256         item->setText(1, mServerInfo.commitHash());
0257         item->addChild(item);
0258     }
0259     {
0260         auto item = new QTreeWidgetItem(commitInfoItem);
0261         item->setText(0, i18n("Branch"));
0262         item->setText(1, mServerInfo.commitBranch());
0263         item->addChild(item);
0264     }
0265     {
0266         auto item = new QTreeWidgetItem(commitInfoItem);
0267         item->setText(0, i18n("Tag"));
0268         item->setText(1, mServerInfo.commitTag());
0269         item->addChild(item);
0270     }
0271     {
0272         auto item = new QTreeWidgetItem(commitInfoItem);
0273         item->setText(0, i18n("Author"));
0274         item->setText(1, mServerInfo.commitAuthor());
0275         item->addChild(item);
0276     }
0277     {
0278         auto item = new QTreeWidgetItem(commitInfoItem);
0279         item->setText(0, i18n("Subject"));
0280         item->setText(1, mServerInfo.commitSubject());
0281         item->addChild(item);
0282     }
0283 }
0284 
0285 void AdministratorServerInfoWidget::parseBuildInfo(QTreeWidgetItem *buildInfoItem)
0286 {
0287     {
0288         auto item = new QTreeWidgetItem(buildInfoItem);
0289         item->setText(0, i18n("OS Release"));
0290         item->setText(1, mServerInfo.osRelease());
0291         item->addChild(item);
0292     }
0293     {
0294         auto item = new QTreeWidgetItem(buildInfoItem);
0295         item->setText(0, i18n("Node Version"));
0296         item->setText(1, mServerInfo.nodeVersion());
0297         item->addChild(item);
0298     }
0299     {
0300         auto item = new QTreeWidgetItem(buildInfoItem);
0301         item->setText(0, i18n("Arch"));
0302         item->setText(1, mServerInfo.arch());
0303         item->addChild(item);
0304     }
0305     {
0306         auto item = new QTreeWidgetItem(buildInfoItem);
0307         item->setText(0, i18n("OS Platform"));
0308         item->setText(1, mServerInfo.platform());
0309         item->addChild(item);
0310     }
0311 }
0312 
0313 void AdministratorServerInfoWidget::slotStatisticDone(const QJsonObject &obj)
0314 {
0315     delete mServerInfoItem;
0316     mServerInfoItem = new QTreeWidgetItem(mTreeWidget);
0317     mServerInfoItem->setText(0, i18n("Server Info"));
0318     parseServerInfo(mServerInfoItem, obj);
0319 
0320     delete mUsageInfoItem;
0321     mUsageInfoItem = new QTreeWidgetItem(mTreeWidget);
0322     mUsageInfoItem->setText(0, i18n("Usage"));
0323     parseUsageInfo(mUsageInfoItem, obj);
0324 
0325     delete mRuntimeInfoItem;
0326     mRuntimeInfoItem = new QTreeWidgetItem(mTreeWidget);
0327     mRuntimeInfoItem->setText(0, i18n("Runtime Environment"));
0328     parseRuntimeInfo(mRuntimeInfoItem, obj);
0329     mTreeWidget->expandAll();
0330     mTreeWidget->resizeColumnToContents(1);
0331     mTreeWidget->resizeColumnToContents(0);
0332 }
0333 
0334 void AdministratorServerInfoWidget::loadServerInfo()
0335 {
0336     auto commitItem = new QTreeWidgetItem(mTreeWidget);
0337     commitItem->setText(0, i18n("Commit"));
0338     parseCommitInfo(commitItem);
0339 
0340     auto buildItem = new QTreeWidgetItem(mTreeWidget);
0341     buildItem->setText(0, i18n("Build Environment"));
0342     parseBuildInfo(buildItem);
0343 }
0344 
0345 #include "moc_administratorserverinfowidget.cpp"