var graphs = []; var lastPlayerEntries = []; 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; 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 listing = graphs[lastEntry.info.name].listing; if (listing.length > 0) { newStatus += ' ('; var playerDifference = listing[listing.length - 1][1] - listing[0][1]; if (playerDifference >= 0) { newStatus += '+'; } newStatus += playerDifference + ')'; } lastPlayerEntries[info.name] = result.players.online; div.html(newStatus); } else { var newStatus = ''; if (findErrorMessage(lastEntry.error)) { newStatus += findErrorMessage(lastEntry.error); } else { newStatus += 'Failed to ping!'; } div.html(newStatus + ''); } var keys = Object.keys(lastPlayerEntries); var totalPlayers = 0; for (var i = 0; i < keys.length; i++) { totalPlayers += lastPlayerEntries[keys[i]]; } $("#stat_totalPlayers").text(formatNumber(totalPlayers)); $("#stat_networks").text(formatNumber(keys.length)); } function sortServers() { if (categoriesVisible) { var byCategories = getServersByCategory(); var categories = Object.keys(byCategories); for (var i = 0; i < categories.length; i++) { var relevantPlayers = []; for (var x = 0; x < byCategories[categories[i]].length; x++) { var server = byCategories[categories[i]][x]; relevantPlayers[server.name] = lastPlayerEntries[server.name]; } var keys = Object.keys(relevantPlayers); keys.sort(function(a, b) { return relevantPlayers[b] - relevantPlayers[a]; }); for (var x = 0; x < keys.length; x++) { $('#' + safeName(keys[x])).appendTo('#server-container-' + categories[i]); $('#ranking_' + safeName(keys[x])).text('#' + (x + 1)); } } } else { var serverNames = []; var keys = Object.keys(lastPlayerEntries); for (var i = 0; i < keys.length; i++) { serverNames.push(keys[i]); } serverNames.sort(function(a, b) { return (lastPlayerEntries[b] || 0) - (lastPlayerEntries[a] || 0); }); for (var i = 0; i < serverNames.length; i++) { $('#' + safeName(serverNames[i])).appendTo('#server-container-all'); $('#ranking_' + safeName(serverNames[i])).text('#' + (i + 1)); } } } function setAllGraphVisibility(visible) { if (visible) { var keys = Object.keys(hiddenGraphData); for (var i = 0; i < keys.length; i++) { displayedGraphData[keys[i]] = hiddenGraphData[keys[i]]; } hiddenGraphData = []; } else { var keys = Object.keys(displayedGraphData); for (var i = 0; i < keys.length; i++) { hiddenGraphData[keys[i]] = displayedGraphData[keys[i]]; } displayedGraphData = []; } $('.graph-control').each(function(index, item) { item.checked = visible; }); historyPlot.setData(convertGraphData(displayedGraphData)); historyPlot.setupGrid(); historyPlot.draw(); // Update our localStorage if (visible) { resetGraphControls(); } else { saveGraphControls(Object.keys(displayedGraphData)); } } function validateBootTime(bootTime, socket) { $('#tagline-text').text('Validating...'); console.log('Remote bootTime is ' + bootTime + ', local is ' + publicConfig.bootTime); if (bootTime === publicConfig.bootTime) { $('#tagline-text').text('Loading...'); socket.emit('requestListing'); if (!isMobileBrowser()) socket.emit('requestHistoryGraph'); isConnected = true; // Start any special updating tasks. mojangServicesUpdater = setInterval(updateMojangServices, 1000); sortServersTask = setInterval(sortServers, 10000); } else { $('#tagline-text').text('Updating...'); $.getScript('/publicConfig.json', function(data, textStatus, xhr) { if (xhr.status === 200) { validateBootTime(publicConfig.bootTime, socket); } else { $('#tagline').attr('class', 'status-offline'); $('#tagline-text').text('Failed to update! Refresh?'); } }); } } $(document).ready(function() { var socket = io.connect({ reconnect: true, reconnectDelay: 1000, reconnectionAttempts: 10 }); socket.on('bootTime', function(bootTime) { validateBootTime(bootTime, socket); }); socket.on('disconnect', function() { if (mojangServicesUpdater) clearInterval(mojangServicesUpdater); if (sortServersTask) clearInterval(sortServersTask); $('#tagline').attr('class', 'status-offline'); $('#tagline-text').text('Disconnected! Refresh?'); lastPlayerEntries = {}; graphs = {}; $('#server-container-list').html(''); createdCategories = false; $('#big-graph').html(''); $('#big-graph-checkboxes').html(''); $('#big-graph-controls').css('display', 'none'); $('#category-controller').css('display', 'none'); $("#stat_totalPlayers").text(0); $("#stat_networks").text(0); isConnected = false; }); socket.on('historyGraph', function(rawData) { var shownServers = loadGraphControls(); if (shownServers) { var keys = Object.keys(rawData); hiddenGraphData = []; displayedGraphData = []; for (var i = 0; i < keys.length; i++) { var name = keys[i]; if (shownServers.indexOf(name) !== -1) { displayedGraphData[name] = rawData[name]; } else { hiddenGraphData[name] = rawData[name]; } } } else { displayedGraphData = rawData; } $('#big-graph').css('height', '400px'); historyPlot = $.plot('#big-graph', convertGraphData(displayedGraphData), bigChartOptions); $('#big-graph').bind('plothover', handlePlotHover); var keys = Object.keys(rawData); var sinceBreak = 0; var html = '
' + keys[i] + ' | '; if (sinceBreak >= 7) { sinceBreak = 0; html += '