summaryrefslogtreecommitdiffstats
path: root/gui/widgets/ServerStatus.cpp
blob: 3b02fd2440e953322b2fe6ae6594bfe4ca0ca5c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "ServerStatus.h"
#include "LineSeparator.h"
#include "IconLabel.h"
#include "logic/status/StatusChecker.h"

#include "MultiMC.h"

#include <QHBoxLayout>
#include <QFrame>
#include <QLabel>
#include <QMap>
#include <QToolButton>
#include <QAction>

ServerStatus::ServerStatus(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f)
{
	layout = new QHBoxLayout(this);
	layout->setContentsMargins(0, 0, 0, 0);
	goodIcon = QIcon::fromTheme("status-good");
	yellowIcon = QIcon::fromTheme("status-yellow");
	badIcon = QIcon::fromTheme("status-bad");

	addStatus("minecraft.net", tr("Web"));
	addLine();
	addStatus("account.mojang.com", tr("Account"));
	addLine();
	addStatus("skins.minecraft.net", tr("Skins"));
	addLine();
	addStatus("authserver.mojang.com", tr("Auth"));
	addLine();
	addStatus("sessionserver.mojang.com", tr("Session"));

	m_statusRefresh = new QToolButton(this);
	m_statusRefresh->setCheckable(true);
	m_statusRefresh->setToolButtonStyle(Qt::ToolButtonIconOnly);
	m_statusRefresh->setIcon(QIcon::fromTheme("refresh"));
	layout->addWidget(m_statusRefresh);

	setLayout(layout);

	// Start status checker
	{
		auto reloader = MMC->statusChecker().get();
		connect(reloader, &StatusChecker::statusChanged, this, &ServerStatus::StatusChanged);
		connect(reloader, &StatusChecker::statusLoading, this, &ServerStatus::StatusReloading);
		connect(m_statusRefresh, &QAbstractButton::clicked, this, &ServerStatus::reloadStatus);
		MMC->statusChecker()->startTimer(60000);
		reloadStatus();
	}
}

ServerStatus::~ServerStatus()
{
}

void ServerStatus::reloadStatus()
{
	MMC->statusChecker()->reloadStatus();
}

void ServerStatus::addLine()
{
	layout->addWidget(new LineSeparator(this, Qt::Vertical));
}

void ServerStatus::addStatus(QString key, QString name)
{
	{
		auto label = new IconLabel(this, badIcon, QSize(16, 16));
		label->setToolTip(key);
		serverLabels[key] = label;
		layout->addWidget(label);
	}
	{
		auto label = new QLabel(this);
		label->setText(name);
		label->setToolTip(key);
		layout->addWidget(label);
	}
}

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);
}