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"