diff --git a/app.js b/app.js index 9cb6228..8173d8b 100644 --- a/app.js +++ b/app.js @@ -11,6 +11,12 @@ var servers = require('./servers.json'); var networkHistory = []; var connectedClients = 0; +var currentVersionIndex = { + 'PC': 0, + 'PE': 0 +}; +var networkVersions = []; + var graphData = []; var lastGraphPush = []; @@ -18,6 +24,7 @@ function pingAll() { for (var i = 0; i < servers.length; i++) { // Make sure we lock our scope. (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) { // Handle our ping results, if it succeeded. if (err) { @@ -29,20 +36,62 @@ function pingAll() { res.favicon = config.faviconOverride[network.name]; } - handlePing(network, res, err); - }); + handlePing(network, res, err, attemptedVersion); + }, attemptedVersion); })(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 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 = { info: { name: network.name, - timestamp: util.getCurrentTimeMs() - } + timestamp: util.getCurrentTimeMs(), + type: network.type + }, + versions: _networkVersions }; if (res) { @@ -53,11 +102,6 @@ function handlePing(network, res, err) { server.io.sockets.emit('update', networkSnapshot); - // Log our response. - if (!networkHistory[network.name]) { - networkHistory[network.name] = []; - } - var _networkHistory = networkHistory[network.name]; // Remove our previous data that we don't need anymore. @@ -72,12 +116,13 @@ function handlePing(network, res, err) { _networkHistory.push({ error: err, result: res, + versions: _networkVersions, timestamp: util.getCurrentTimeMs(), info: { ip: network.ip, port: network.port, 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.'); startServices(); -} \ No newline at end of file +} diff --git a/assets/css/main.css b/assets/css/main.css index 37c8c6a..e0d0f5d 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -145,7 +145,7 @@ a { } .server > .column > .rank { - width: 64px; + width: 64px; padding-top: 3px; } @@ -157,6 +157,18 @@ a { 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 { margin-bottom: 10px; margin-left: 15px; @@ -246,4 +258,4 @@ h3 { .button:hover { background: #ecf0f1; color: #3498db; -} \ No newline at end of file +} diff --git a/assets/js/site.js b/assets/js/site.js index 97fba3a..64e41d5 100644 --- a/assets/js/site.js +++ b/assets/js/site.js @@ -5,6 +5,15 @@ var historyPlot; var displayedGraphData; var hiddenGraphData = []; +var mcVersions = { + 'PC': { + 4: '1.7.2', + 5: '1.7.10', + 47: '1.8', + 107: '1.9' + } +}; + var isConnected = false; var mojangServicesUpdater; @@ -13,10 +22,21 @@ var sortServersTask; function updateServerStatus(lastEntry) { var info = lastEntry.info; 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 += '' + mcVersions[lastEntry.info.type][lastEntry.versions[i]] + ' '; + } + versionDiv.html(versions); + } else { + versionDiv.html(''); + } if (lastEntry.result) { var result = lastEntry.result; - var newStatus = '
Players: ' + formatNumber(result.players.online); + var newStatus = 'Players: ' + formatNumber(result.players.online); var listing = graphs[lastEntry.info.name].listing; @@ -36,7 +56,7 @@ function updateServerStatus(lastEntry) { div.html(newStatus); } else { - var newStatus = '
'; + var newStatus = ''; if (findErrorMessage(lastEntry.error)) { newStatus += findErrorMessage(lastEntry.error); @@ -328,7 +348,7 @@ $(document).ready(function() {
\

' + info.name + ' ' + info.type + '

\ ' + info.ip + '\ -
\ +
\ Waiting\
\
\ diff --git a/config.json b/config.json index 70b9641..eaaf70a 100644 --- a/config.json +++ b/config.json @@ -31,5 +31,16 @@ "minigames": "Minigame Networks", "pocket": "Pocket Edition Networks" }, + "versions": { + "PC": [ + 4, + 5, + 47, + 107 + ], + "PE": [ + 0 + ] + }, "categoriesVisible": true } diff --git a/lib/ping.js b/lib/ping.js index 3faa239..bc1bd1e 100644 --- a/lib/ping.js +++ b/lib/ping.js @@ -4,7 +4,7 @@ var mcpc_ping = require('mc-ping-updated'); var util = require('./util'); // 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(); mcpc_ping(host, port, function(err, res) { @@ -22,7 +22,7 @@ function pingMinecraftPC(host, port, timeout, callback) { favicon: res.favicon }); } - }, timeout); + }, timeout, version); } // 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); } -exports.ping = function(host, port, type, timeout, callback) { +exports.ping = function(host, port, type, timeout, callback, version) { if (type === 'PC') { - pingMinecraftPC(host, port || 25565, timeout, callback); + pingMinecraftPC(host, port || 25565, timeout, callback, version); } else if (type === 'PE') { pingMinecraftPE(host, port || 19132, timeout, callback); } else { throw new Error('Unsupported type: ' + type); } -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index 9b4a782..6f1e184 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A Minecraft server tracker that lets you focus on the basics.", "main": "app.js", "dependencies": { - "mc-ping-updated": "0.0.7", + "mc-ping-updated": "0.1.0", "mcpe-ping": "0.0.3", "mime": "^1.3.4", "request": "^2.65.0",