Merge pull request #3185 from kb-1000/remove-status

GH-4157 Remove broken Mojang services status
This commit is contained in:
Petr Mrázek 2021-10-08 23:18:15 +02:00 committed by GitHub
commit 0c798b8fc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 0 additions and 441 deletions

View File

@ -82,7 +82,6 @@ public:
QString RESOURCE_BASE = "https://resources.download.minecraft.net/"; QString RESOURCE_BASE = "https://resources.download.minecraft.net/";
QString LIBRARY_BASE = "https://libraries.minecraft.net/"; QString LIBRARY_BASE = "https://libraries.minecraft.net/";
QString AUTH_BASE = "https://authserver.mojang.com/"; QString AUTH_BASE = "https://authserver.mojang.com/";
QString MOJANG_STATUS_URL = "https://status.mojang.com/check";
QString IMGUR_BASE_URL = "https://api.imgur.com/3/"; QString IMGUR_BASE_URL = "https://api.imgur.com/3/";
QString FMLLIBS_BASE_URL = "https://files.multimc.org/fmllibs/"; QString FMLLIBS_BASE_URL = "https://files.multimc.org/fmllibs/";
QString TRANSLATIONS_BASE_URL = "https://files.multimc.org/translations/"; QString TRANSLATIONS_BASE_URL = "https://files.multimc.org/translations/";

View File

@ -193,13 +193,6 @@ set(ICONS_SOURCES
icons/IconUtils.cpp icons/IconUtils.cpp
) )
# Minecraft services status checker
set(STATUS_SOURCES
# Status system
status/StatusChecker.h
status/StatusChecker.cpp
)
# Support for Minecraft instances and launch # Support for Minecraft instances and launch
set(MINECRAFT_SOURCES set(MINECRAFT_SOURCES
# Minecraft support # Minecraft support
@ -546,7 +539,6 @@ set(LOGIC_SOURCES
${UPDATE_SOURCES} ${UPDATE_SOURCES}
${NOTIFICATIONS_SOURCES} ${NOTIFICATIONS_SOURCES}
${NEWS_SOURCES} ${NEWS_SOURCES}
${STATUS_SOURCES}
${MINECRAFT_SOURCES} ${MINECRAFT_SOURCES}
${SCREENSHOTS_SOURCES} ${SCREENSHOTS_SOURCES}
${TASKS_SOURCES} ${TASKS_SOURCES}
@ -796,8 +788,6 @@ SET(MULTIMC_SOURCES
widgets/PageContainer.cpp widgets/PageContainer.cpp
widgets/PageContainer.h widgets/PageContainer.h
widgets/PageContainer_p.h widgets/PageContainer_p.h
widgets/ServerStatus.cpp
widgets/ServerStatus.h
widgets/VersionListView.cpp widgets/VersionListView.cpp
widgets/VersionListView.h widgets/VersionListView.h
widgets/VersionSelectWidget.cpp widgets/VersionSelectWidget.cpp

View File

@ -73,7 +73,6 @@
#include "groupview/GroupView.h" #include "groupview/GroupView.h"
#include "groupview/InstanceDelegate.h" #include "groupview/InstanceDelegate.h"
#include "widgets/LabeledToolButton.h" #include "widgets/LabeledToolButton.h"
#include "widgets/ServerStatus.h"
#include "dialogs/NewInstanceDialog.h" #include "dialogs/NewInstanceDialog.h"
#include "dialogs/ProgressDialog.h" #include "dialogs/ProgressDialog.h"
#include "dialogs/AboutDialog.h" #include "dialogs/AboutDialog.h"
@ -739,10 +738,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow
m_statusLeft = new QLabel(tr("No instance selected"), this); m_statusLeft = new QLabel(tr("No instance selected"), this);
m_statusCenter = new QLabel(tr("Total playtime: 0s."), this); m_statusCenter = new QLabel(tr("Total playtime: 0s."), this);
m_statusRight = new ServerStatus(this);
statusBar()->addPermanentWidget(m_statusLeft, 1); statusBar()->addPermanentWidget(m_statusLeft, 1);
statusBar()->addPermanentWidget(m_statusCenter, 1); statusBar()->addPermanentWidget(m_statusCenter, 1);
statusBar()->addPermanentWidget(m_statusRight, 0);
// Add "manage accounts" button, right align // Add "manage accounts" button, right align
QWidget *spacer = new QWidget(); QWidget *spacer = new QWidget();

View File

@ -36,7 +36,6 @@ class QLabel;
class MinecraftLauncher; class MinecraftLauncher;
class BaseProfilerFactory; class BaseProfilerFactory;
class GroupView; class GroupView;
class ServerStatus;
class KonamiCode; class KonamiCode;
class InstanceTask; class InstanceTask;
@ -207,7 +206,6 @@ private:
QToolButton *newsLabel = nullptr; QToolButton *newsLabel = nullptr;
QLabel *m_statusLeft = nullptr; QLabel *m_statusLeft = nullptr;
QLabel *m_statusCenter = nullptr; QLabel *m_statusCenter = nullptr;
ServerStatus *m_statusRight = nullptr;
QMenu *accountMenu = nullptr; QMenu *accountMenu = nullptr;
QToolButton *accountMenuButton = nullptr; QToolButton *accountMenuButton = nullptr;
KonamiCode * secretEventFilter = nullptr; KonamiCode * secretEventFilter = nullptr;

View File

@ -1,148 +0,0 @@
/* Copyright 2013-2021 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "StatusChecker.h"
#include <QByteArray>
#include <QDebug>
#include <BuildConfig.h>
StatusChecker::StatusChecker()
{
}
void StatusChecker::timerEvent(QTimerEvent *e)
{
QObject::timerEvent(e);
reloadStatus();
}
void StatusChecker::reloadStatus()
{
if (isLoadingStatus())
{
// qDebug() << "Ignored request to reload status. Currently reloading already.";
return;
}
// qDebug() << "Reloading status.";
NetJob* job = new NetJob("Status JSON");
job->addNetAction(Net::Download::makeByteArray(BuildConfig.MOJANG_STATUS_URL, &dataSink));
QObject::connect(job, &NetJob::succeeded, this, &StatusChecker::statusDownloadFinished);
QObject::connect(job, &NetJob::failed, this, &StatusChecker::statusDownloadFailed);
m_statusNetJob.reset(job);
emit statusLoading(true);
job->start();
}
void StatusChecker::statusDownloadFinished()
{
qDebug() << "Finished loading status JSON.";
m_statusEntries.clear();
m_statusNetJob.reset();
QJsonParseError jsonError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(dataSink, &jsonError);
if (jsonError.error != QJsonParseError::NoError)
{
fail("Error parsing status JSON:" + jsonError.errorString());
return;
}
if (!jsonDoc.isArray())
{
fail("Error parsing status JSON: JSON root is not an array");
return;
}
QJsonArray root = jsonDoc.array();
for(auto status = root.begin(); status != root.end(); ++status)
{
QVariantMap map = (*status).toObject().toVariantMap();
for (QVariantMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
{
QString key = iter.key();
QVariant value = iter.value();
if(value.type() == QVariant::Type::String)
{
m_statusEntries.insert(key, value.toString());
//qDebug() << "Status JSON object: " << key << m_statusEntries[key];
}
else
{
fail("Malformed status JSON: expected status type to be a string.");
return;
}
}
}
succeed();
}
void StatusChecker::statusDownloadFailed(QString reason)
{
fail(tr("Failed to load status JSON:\n%1").arg(reason));
}
QMap<QString, QString> StatusChecker::getStatusEntries() const
{
return m_statusEntries;
}
bool StatusChecker::isLoadingStatus() const
{
return m_statusNetJob.get() != nullptr;
}
QString StatusChecker::getLastLoadErrorMsg() const
{
return m_lastLoadError;
}
void StatusChecker::succeed()
{
if(m_prevEntries != m_statusEntries)
{
emit statusChanged(m_statusEntries);
m_prevEntries = m_statusEntries;
}
m_lastLoadError = "";
qDebug() << "Status loading succeeded.";
m_statusNetJob.reset();
emit statusLoading(false);
}
void StatusChecker::fail(const QString& errorMsg)
{
if(m_prevEntries != m_statusEntries)
{
emit statusChanged(m_statusEntries);
m_prevEntries = m_statusEntries;
}
m_lastLoadError = errorMsg;
qDebug() << "Failed to load status:" << errorMsg;
m_statusNetJob.reset();
emit statusLoading(false);
}

View File

@ -1,58 +0,0 @@
/* Copyright 2013-2021 MultiMC Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <QObject>
#include <QString>
#include <QList>
#include <net/NetJob.h>
class StatusChecker : public QObject
{
Q_OBJECT
public: /* con/des */
StatusChecker();
public: /* methods */
QString getLastLoadErrorMsg() const;
bool isLoadingStatus() const;
QMap<QString, QString> getStatusEntries() const;
signals:
void statusLoading(bool loading);
void statusChanged(QMap<QString, QString> newStatus);
public slots:
void reloadStatus();
protected: /* methods */
virtual void timerEvent(QTimerEvent *);
protected slots:
void statusDownloadFinished();
void statusDownloadFailed(QString reason);
void succeed();
void fail(const QString& errorMsg);
protected: /* data */
QMap<QString, QString> m_prevEntries;
QMap<QString, QString> m_statusEntries;
NetJobPtr m_statusNetJob;
QString m_lastLoadError;
QByteArray dataSink;
};

View File

@ -1,179 +0,0 @@
#include "ServerStatus.h"
#include "LineSeparator.h"
#include "IconLabel.h"
#include "status/StatusChecker.h"
#include <DesktopServices.h>
#include "MultiMC.h"
#include <QHBoxLayout>
#include <QFrame>
#include <QLabel>
#include <QMap>
#include <QToolButton>
#include <QAction>
class ClickableLabel : public QLabel
{
Q_OBJECT
public:
ClickableLabel(QWidget *parent) : QLabel(parent)
{
setCursor(Qt::PointingHandCursor);
}
~ClickableLabel(){};
signals:
void clicked();
protected:
void mousePressEvent(QMouseEvent *event)
{
emit clicked();
}
};
class ClickableIconLabel : public IconLabel
{
Q_OBJECT
public:
ClickableIconLabel(QWidget *parent, QIcon icon, QSize size) : IconLabel(parent, icon, size)
{
setCursor(Qt::PointingHandCursor);
}
~ClickableIconLabel(){};
signals:
void clicked();
protected:
void mousePressEvent(QMouseEvent *event)
{
emit clicked();
}
};
ServerStatus::ServerStatus(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
{
layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
goodIcon = MMC->getThemedIcon("status-good");
yellowIcon = MMC->getThemedIcon("status-yellow");
badIcon = MMC->getThemedIcon("status-bad");
addStatus("authserver.mojang.com", tr("Auth"));
addLine();
addStatus("session.minecraft.net", tr("Session"));
addLine();
addStatus("textures.minecraft.net", tr("Skins"));
addLine();
addStatus("api.mojang.com", tr("API"));
m_statusRefresh = new QToolButton(this);
m_statusRefresh->setCheckable(true);
m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly);
m_statusRefresh->setIcon(MMC->getThemedIcon("refresh"));
layout->addWidget(m_statusRefresh);
setLayout(layout);
// Start status checker
m_statusChecker.reset(new StatusChecker());
{
auto reloader = m_statusChecker.get();
connect(reloader, &StatusChecker::statusChanged, this, &ServerStatus::StatusChanged);
connect(reloader, &StatusChecker::statusLoading, this, &ServerStatus::StatusReloading);
connect(m_statusRefresh, &QAbstractButton::clicked, this, &ServerStatus::reloadStatus);
m_statusChecker->startTimer(60000);
reloadStatus();
}
}
ServerStatus::~ServerStatus()
{
}
void ServerStatus::reloadStatus()
{
m_statusChecker->reloadStatus();
}
void ServerStatus::addLine()
{
layout->addWidget(new LineSeparator(this, Qt::Vertical));
}
void ServerStatus::addStatus(QString key, QString name)
{
{
auto label = new ClickableIconLabel(this, badIcon, QSize(16, 16));
label->setToolTip(key);
serverLabels[key] = label;
layout->addWidget(label);
connect(label,SIGNAL(clicked()),SLOT(clicked()));
}
{
auto label = new ClickableLabel(this);
label->setText(name);
label->setToolTip(key);
layout->addWidget(label);
connect(label,SIGNAL(clicked()),SLOT(clicked()));
}
}
void ServerStatus::clicked()
{
DesktopServices::openUrl(QUrl("https://github.com/MultiMC/MultiMC5/wiki/Mojang-Services-Status"));
}
void ServerStatus::setStatus(QString key, int value)
{
if (!serverLabels.contains(key))
return;
IconLabel *label = serverLabels[key];
switch(value)
{
case 0:
label->setIcon(goodIcon);
break;
case 1:
label->setIcon(yellowIcon);
break;
default:
case 2:
label->setIcon(badIcon);
break;
}
}
void ServerStatus::StatusChanged(const QMap<QString, QString> statusEntries)
{
auto convertStatus = [&](QString status)->int
{
if (status == "green")
return 0;
else if (status == "yellow")
return 1;
else if (status == "red")
return 2;
return 2;
}
;
auto iter = statusEntries.begin();
while (iter != statusEntries.end())
{
QString key = iter.key();
auto value = convertStatus(iter.value());
setStatus(key, value);
iter++;
}
}
void ServerStatus::StatusReloading(bool is_reloading)
{
m_statusRefresh->setChecked(is_reloading);
}
#include "ServerStatus.moc"

View File

@ -1,40 +0,0 @@
#pragma once
#include <QString>
#include <QWidget>
#include <QMap>
#include <QIcon>
#include <memory>
class IconLabel;
class QToolButton;
class QHBoxLayout;
class StatusChecker;
class ServerStatus: public QWidget
{
Q_OBJECT
public:
explicit ServerStatus(QWidget *parent = nullptr, Qt::WindowFlags f = 0);
virtual ~ServerStatus();
public slots:
void reloadStatus();
void StatusChanged(const QMap<QString, QString> statuses);
void StatusReloading(bool is_reloading);
private slots:
void clicked();
private: /* methods */
void addLine();
void addStatus(QString key, QString name);
void setStatus(QString key, int value);
private: /* data */
QHBoxLayout * layout = nullptr;
QToolButton *m_statusRefresh = nullptr;
QMap<QString, IconLabel *> serverLabels;
QIcon goodIcon;
QIcon yellowIcon;
QIcon badIcon;
std::shared_ptr<StatusChecker> m_statusChecker;
};