Merge pull request #36 from Cryptkeeper/forairan-master
forairan-master
This commit is contained in:
commit
cf5e51682a
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,3 +4,5 @@ node_modules/
|
|||||||
production/
|
production/
|
||||||
database.sql
|
database.sql
|
||||||
database.sql-journal
|
database.sql-journal
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@ -1,10 +1,8 @@
|
|||||||
**2.0.0** *(Feb 1st 2016)*
|
**2.2.0** *(Mar 6 2016)*
|
||||||
- Servers are now referenced by their name on the graph controls instead of their IP.
|
- Added supported versions per network (courtesy of [@forairan](https://github.com/forairan))
|
||||||
- Servers now display their name on hover instead of their IP.
|
- Updated dependency version of ```mc-ping-updated``` to 0.1.0
|
||||||
- Graph controls are now saved and loaded automatically.
|
|
||||||
- Moved server configuration into servers.json from config.json.
|
|
||||||
|
|
||||||
**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```.
|
- You can now categorize servers. Add a "category tag" to their entry in ```servers.json```.
|
||||||
- Define the tags in ```config.json```, such as below:
|
- 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 endpoint (```publicConfig.json```) allows the browser to know system details before the socket connection is established.
|
||||||
- New header design to make it less annoying.
|
- New header design to make it less annoying.
|
||||||
- Various bug fixes.
|
- 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
67
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,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -146,7 +146,11 @@ a {
|
|||||||
|
|
||||||
.server > .column > .rank {
|
.server > .column > .rank {
|
||||||
width: 64px;
|
width: 64px;
|
||||||
padding-top: 3px;
|
padding-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.server > .column > .url {
|
||||||
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.server > .column > h3 > .type {
|
.server > .column > h3 > .type {
|
||||||
@ -157,6 +161,18 @@ a {
|
|||||||
margin-bottom: 2px;
|
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 {
|
.category-header {
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
|
@ -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;
|
||||||
@ -12,11 +21,25 @@ 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 +59,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);
|
||||||
@ -327,8 +350,8 @@ $(document).ready(function() {
|
|||||||
</div>\
|
</div>\
|
||||||
<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 url">' + info.ip + '</span>\
|
||||||
<br />\
|
<div id="version_' + safeName(info.name) + '" class="versions"><span class="version"></span></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
|
||||||
}
|
}
|
||||||
|
@ -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,9 +46,9 @@ 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 {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "minetrack",
|
"name": "minetrack",
|
||||||
"version": "2.1.0",
|
"version": "2.2.0",
|
||||||
"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