Merge pull request #36 from Cryptkeeper/forairan-master

forairan-master
This commit is contained in:
Cryptkeeper 2016-03-06 01:32:00 -06:00
commit cf5e51682a
8 changed files with 141 additions and 40 deletions

2
.gitignore vendored

@ -4,3 +4,5 @@ node_modules/
production/
database.sql
database.sql-journal
.DS_Store

@ -1,10 +1,8 @@
**2.0.0** *(Feb 1st 2016)*
- Servers are now referenced by their name on the graph controls instead of their IP.
- Servers now display their name on hover instead of their IP.
- Graph controls are now saved and loaded automatically.
- Moved server configuration into servers.json from config.json.
**2.2.0** *(Mar 6 2016)*
- Added supported versions per network (courtesy of [@forairan](https://github.com/forairan))
- Updated dependency version of ```mc-ping-updated``` to 0.1.0
**2.1.0** *(Feb 23rd 2016)*
**2.1.0** *(Feb 23 2016)*
- You can now categorize servers. Add a "category tag" to their entry in ```servers.json```.
- Define the tags in ```config.json```, such as below:
@ -21,3 +19,9 @@
- New endpoint (```publicConfig.json```) allows the browser to know system details before the socket connection is established.
- New header design to make it less annoying.
- Various bug fixes.
**2.0.0** *(Feb 1 2016)*
- Servers are now referenced by their name on the graph controls instead of their IP.
- Servers now display their name on hover instead of their IP.
- Graph controls are now saved and loaded automatically.
- Moved server configuration into servers.json from config.json.

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

@ -146,7 +146,11 @@ a {
.server > .column > .rank {
width: 64px;
padding-top: 3px;
padding-top: 4px;
}
.server > .column > .url {
font-size: 16px;
}
.server > .column > h3 > .type {
@ -157,6 +161,18 @@ a {
margin-bottom: 2px;
}
.server > .column > .versions {
min-height: 23px;
padding-bottom: 1px;
}
.server > .column > .versions > .version {
padding: 1px 5px;
border-radius: 2px;
border: 1px solid #636363;
font-size: 12px;
}
.category-header {
margin-bottom: 10px;
margin-left: 15px;

@ -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;
@ -12,11 +21,25 @@ 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 += '<span class="version">' + mcVersions[lastEntry.info.type][lastEntry.versions[i]] + '</span>&nbsp;';
}
versionDiv.html(versions);
} else {
versionDiv.html('');
}
if (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;
@ -36,7 +59,7 @@ function updateServerStatus(lastEntry) {
div.html(newStatus);
} else {
var newStatus = '<br /><span class="color-red">';
var newStatus = '<span class="color-red">';
if (findErrorMessage(lastEntry.error)) {
newStatus += findErrorMessage(lastEntry.error);
@ -327,8 +350,8 @@ $(document).ready(function() {
</div>\
<div class="column" style="width: 220px;">\
<h3>' + info.name + '&nbsp;<span class="type">' + info.type + '</span></h3>\
<span class="color-gray">' + info.ip + '</span>\
<br />\
<span class="color-gray url">' + info.ip + '</span>\
<div id="version_' + safeName(info.name) + '" class="versions"><span class="version"></span></div>\
<span id="status_' + safeName(info.name) + '">Waiting</span>\
</div>\
<div class="column" style="float: right;">\

@ -31,5 +31,16 @@
"minigames": "Minigame Networks",
"pocket": "Pocket Edition Networks"
},
"versions": {
"PC": [
4,
5,
47,
107
],
"PE": [
0
]
},
"categoriesVisible": true
}

@ -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,9 +46,9 @@ 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 {

@ -1,10 +1,10 @@
{
"name": "minetrack",
"version": "2.1.0",
"version": "2.2.0",
"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",