Show supported versions for PC servers
The Minetrack daemon will send a different protocol version each time it pings a server. If a server responds with the same protocol version, it is assumed that the version is supported, and it is shown on the page above the server's player count. The list of versions to be tried is stored in config.json. At the moment, 4 versions are checked: - 4 (Minecraft 1.7.2) - 5 (Minecraft 1.7.10) - 47 (Minecraft 1.8) - 107 (Minecraft 1.9)
This commit is contained in:
parent
df72b98d53
commit
43c284aa8a
69
app.js
69
app.js
@ -11,6 +11,12 @@ var servers = require('./servers.json');
|
|||||||
var networkHistory = [];
|
var networkHistory = [];
|
||||||
var connectedClients = 0;
|
var connectedClients = 0;
|
||||||
|
|
||||||
|
var currentVersionIndex = {
|
||||||
|
'PC': 0,
|
||||||
|
'PE': 0
|
||||||
|
};
|
||||||
|
var networkVersions = [];
|
||||||
|
|
||||||
var graphData = [];
|
var graphData = [];
|
||||||
var lastGraphPush = [];
|
var lastGraphPush = [];
|
||||||
|
|
||||||
@ -18,6 +24,7 @@ function pingAll() {
|
|||||||
for (var i = 0; i < servers.length; i++) {
|
for (var i = 0; i < servers.length; i++) {
|
||||||
// Make sure we lock our scope.
|
// Make sure we lock our scope.
|
||||||
(function(network) {
|
(function(network) {
|
||||||
|
var attemptedVersion = config.versions[network.type][currentVersionIndex[network.type]];
|
||||||
ping.ping(network.ip, network.port, network.type, config.rates.connectTimeout, function(err, res) {
|
ping.ping(network.ip, network.port, network.type, config.rates.connectTimeout, function(err, res) {
|
||||||
// Handle our ping results, if it succeeded.
|
// Handle our ping results, if it succeeded.
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -29,20 +36,62 @@ function pingAll() {
|
|||||||
res.favicon = config.faviconOverride[network.name];
|
res.favicon = config.faviconOverride[network.name];
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePing(network, res, err);
|
handlePing(network, res, err, attemptedVersion);
|
||||||
});
|
}, attemptedVersion);
|
||||||
})(servers[i]);
|
})(servers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentVersionIndex['PC']++;
|
||||||
|
currentVersionIndex['PE']++;
|
||||||
|
|
||||||
|
if (currentVersionIndex['PC'] >= config.versions['PC'].length) {
|
||||||
|
// Loop around
|
||||||
|
currentVersionIndex['PC'] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentVersionIndex['PE'] >= config.versions['PE'].length) {
|
||||||
|
// Loop around
|
||||||
|
currentVersionIndex['PE'] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is where the result of a ping is feed.
|
// This is where the result of a ping is feed.
|
||||||
// This stores it and converts it to ship to the frontend.
|
// This stores it and converts it to ship to the frontend.
|
||||||
function handlePing(network, res, err) {
|
function handlePing(network, res, err, attemptedVersion) {
|
||||||
|
// Log our response.
|
||||||
|
if (!networkHistory[network.name]) {
|
||||||
|
networkHistory[network.name] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the version list
|
||||||
|
if (!networkVersions[network.name]) {
|
||||||
|
networkVersions[network.name] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the result version matches the attempted version, the version is supported
|
||||||
|
var _networkVersions = networkVersions[network.name];
|
||||||
|
if (res) {
|
||||||
|
if (res.version == attemptedVersion) {
|
||||||
|
if (_networkVersions.indexOf(res.version) == -1) {
|
||||||
|
_networkVersions.push(res.version);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Mismatch, so remove the version from the supported version list
|
||||||
|
var index = _networkVersions.indexOf(attemptedVersion);
|
||||||
|
if (index != -1) {
|
||||||
|
_networkVersions.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the clients
|
||||||
var networkSnapshot = {
|
var networkSnapshot = {
|
||||||
info: {
|
info: {
|
||||||
name: network.name,
|
name: network.name,
|
||||||
timestamp: util.getCurrentTimeMs()
|
timestamp: util.getCurrentTimeMs(),
|
||||||
}
|
type: network.type
|
||||||
|
},
|
||||||
|
versions: _networkVersions
|
||||||
};
|
};
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
@ -53,11 +102,6 @@ function handlePing(network, res, err) {
|
|||||||
|
|
||||||
server.io.sockets.emit('update', networkSnapshot);
|
server.io.sockets.emit('update', networkSnapshot);
|
||||||
|
|
||||||
// Log our response.
|
|
||||||
if (!networkHistory[network.name]) {
|
|
||||||
networkHistory[network.name] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
var _networkHistory = networkHistory[network.name];
|
var _networkHistory = networkHistory[network.name];
|
||||||
|
|
||||||
// Remove our previous data that we don't need anymore.
|
// Remove our previous data that we don't need anymore.
|
||||||
@ -72,12 +116,13 @@ function handlePing(network, res, err) {
|
|||||||
_networkHistory.push({
|
_networkHistory.push({
|
||||||
error: err,
|
error: err,
|
||||||
result: res,
|
result: res,
|
||||||
|
versions: _networkVersions,
|
||||||
timestamp: util.getCurrentTimeMs(),
|
timestamp: util.getCurrentTimeMs(),
|
||||||
info: {
|
info: {
|
||||||
ip: network.ip,
|
ip: network.ip,
|
||||||
port: network.port,
|
port: network.port,
|
||||||
type: network.type,
|
type: network.type,
|
||||||
name: network.name
|
name: network.name,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -217,4 +262,4 @@ if (config.logToDatabase) {
|
|||||||
logger.log('warn', 'Database logging is not enabled. You can enable it by setting "logToDatabase" to true in config.json. This requires sqlite3 to be installed.');
|
logger.log('warn', 'Database logging is not enabled. You can enable it by setting "logToDatabase" to true in config.json. This requires sqlite3 to be installed.');
|
||||||
|
|
||||||
startServices();
|
startServices();
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.server > .column > .rank {
|
.server > .column > .rank {
|
||||||
width: 64px;
|
width: 64px;
|
||||||
padding-top: 3px;
|
padding-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,6 +157,18 @@ a {
|
|||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.server > .column > .versions {
|
||||||
|
min-height: 22px;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.server > .column > .versions > .version {
|
||||||
|
padding: 1px 5px;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid #A09E9E;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
.category-header {
|
.category-header {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
@ -246,4 +258,4 @@ h3 {
|
|||||||
.button:hover {
|
.button:hover {
|
||||||
background: #ecf0f1;
|
background: #ecf0f1;
|
||||||
color: #3498db;
|
color: #3498db;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,15 @@ var historyPlot;
|
|||||||
var displayedGraphData;
|
var displayedGraphData;
|
||||||
var hiddenGraphData = [];
|
var hiddenGraphData = [];
|
||||||
|
|
||||||
|
var mcVersions = {
|
||||||
|
'PC': {
|
||||||
|
4: '1.7.2',
|
||||||
|
5: '1.7.10',
|
||||||
|
47: '1.8',
|
||||||
|
107: '1.9'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var isConnected = false;
|
var isConnected = false;
|
||||||
|
|
||||||
var mojangServicesUpdater;
|
var mojangServicesUpdater;
|
||||||
@ -13,10 +22,21 @@ var sortServersTask;
|
|||||||
function updateServerStatus(lastEntry) {
|
function updateServerStatus(lastEntry) {
|
||||||
var info = lastEntry.info;
|
var info = lastEntry.info;
|
||||||
var div = $('#status_' + safeName(info.name));
|
var div = $('#status_' + safeName(info.name));
|
||||||
|
var versionDiv = $('#version_' + safeName(info.name));
|
||||||
|
|
||||||
|
if (lastEntry.versions) {
|
||||||
|
var versions = '';
|
||||||
|
for (var i = 0; i < lastEntry.versions.length; i++) {
|
||||||
|
versions += '<span class="version">' + mcVersions[lastEntry.info.type][lastEntry.versions[i]] + '</span> ';
|
||||||
|
}
|
||||||
|
versionDiv.html(versions);
|
||||||
|
} else {
|
||||||
|
versionDiv.html('');
|
||||||
|
}
|
||||||
|
|
||||||
if (lastEntry.result) {
|
if (lastEntry.result) {
|
||||||
var result = lastEntry.result;
|
var result = lastEntry.result;
|
||||||
var newStatus = '<br />Players: ' + formatNumber(result.players.online);
|
var newStatus = 'Players: ' + formatNumber(result.players.online);
|
||||||
|
|
||||||
var listing = graphs[lastEntry.info.name].listing;
|
var listing = graphs[lastEntry.info.name].listing;
|
||||||
|
|
||||||
@ -36,7 +56,7 @@ function updateServerStatus(lastEntry) {
|
|||||||
|
|
||||||
div.html(newStatus);
|
div.html(newStatus);
|
||||||
} else {
|
} else {
|
||||||
var newStatus = '<br /><span class="color-red">';
|
var newStatus = '<span class="color-red">';
|
||||||
|
|
||||||
if (findErrorMessage(lastEntry.error)) {
|
if (findErrorMessage(lastEntry.error)) {
|
||||||
newStatus += findErrorMessage(lastEntry.error);
|
newStatus += findErrorMessage(lastEntry.error);
|
||||||
@ -328,7 +348,7 @@ $(document).ready(function() {
|
|||||||
<div class="column" style="width: 220px;">\
|
<div class="column" style="width: 220px;">\
|
||||||
<h3>' + info.name + ' <span class="type">' + info.type + '</span></h3>\
|
<h3>' + info.name + ' <span class="type">' + info.type + '</span></h3>\
|
||||||
<span class="color-gray">' + info.ip + '</span>\
|
<span class="color-gray">' + info.ip + '</span>\
|
||||||
<br />\
|
<div id="version_' + safeName(info.name) + '" class="versions"></div>\
|
||||||
<span id="status_' + safeName(info.name) + '">Waiting</span>\
|
<span id="status_' + safeName(info.name) + '">Waiting</span>\
|
||||||
</div>\
|
</div>\
|
||||||
<div class="column" style="float: right;">\
|
<div class="column" style="float: right;">\
|
||||||
|
11
config.json
11
config.json
@ -31,5 +31,16 @@
|
|||||||
"minigames": "Minigame Networks",
|
"minigames": "Minigame Networks",
|
||||||
"pocket": "Pocket Edition Networks"
|
"pocket": "Pocket Edition Networks"
|
||||||
},
|
},
|
||||||
|
"versions": {
|
||||||
|
"PC": [
|
||||||
|
4,
|
||||||
|
5,
|
||||||
|
47,
|
||||||
|
107
|
||||||
|
],
|
||||||
|
"PE": [
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
"categoriesVisible": true
|
"categoriesVisible": true
|
||||||
}
|
}
|
||||||
|
10
lib/ping.js
10
lib/ping.js
@ -4,7 +4,7 @@ var mcpc_ping = require('mc-ping-updated');
|
|||||||
var util = require('./util');
|
var util = require('./util');
|
||||||
|
|
||||||
// This is a wrapper function for mc-ping-updated, mainly used to convert the data structure of the result.
|
// This is a wrapper function for mc-ping-updated, mainly used to convert the data structure of the result.
|
||||||
function pingMinecraftPC(host, port, timeout, callback) {
|
function pingMinecraftPC(host, port, timeout, callback, version) {
|
||||||
var startTime = util.getCurrentTimeMs();
|
var startTime = util.getCurrentTimeMs();
|
||||||
|
|
||||||
mcpc_ping(host, port, function(err, res) {
|
mcpc_ping(host, port, function(err, res) {
|
||||||
@ -22,7 +22,7 @@ function pingMinecraftPC(host, port, timeout, callback) {
|
|||||||
favicon: res.favicon
|
favicon: res.favicon
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, timeout);
|
}, timeout, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a wrapper function for mcpe-ping, mainly used to convert the data structure of the result.
|
// This is a wrapper function for mcpe-ping, mainly used to convert the data structure of the result.
|
||||||
@ -46,12 +46,12 @@ function pingMinecraftPE(host, port, timeout, callback) {
|
|||||||
}, timeout);
|
}, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.ping = function(host, port, type, timeout, callback) {
|
exports.ping = function(host, port, type, timeout, callback, version) {
|
||||||
if (type === 'PC') {
|
if (type === 'PC') {
|
||||||
pingMinecraftPC(host, port || 25565, timeout, callback);
|
pingMinecraftPC(host, port || 25565, timeout, callback, version);
|
||||||
} else if (type === 'PE') {
|
} else if (type === 'PE') {
|
||||||
pingMinecraftPE(host, port || 19132, timeout, callback);
|
pingMinecraftPE(host, port || 19132, timeout, callback);
|
||||||
} else {
|
} else {
|
||||||
throw new Error('Unsupported type: ' + type);
|
throw new Error('Unsupported type: ' + type);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"description": "A Minecraft server tracker that lets you focus on the basics.",
|
"description": "A Minecraft server tracker that lets you focus on the basics.",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mc-ping-updated": "0.0.7",
|
"mc-ping-updated": "0.1.0",
|
||||||
"mcpe-ping": "0.0.3",
|
"mcpe-ping": "0.0.3",
|
||||||
"mime": "^1.3.4",
|
"mime": "^1.3.4",
|
||||||
"request": "^2.65.0",
|
"request": "^2.65.0",
|
||||||
|
Loading…
Reference in New Issue
Block a user