z-nomp/libs/website.js

158 lines
4.1 KiB
JavaScript

var fs = require('fs');
var path = require('path');
var async = require('async');
var dot = require('dot');
var express = require('express');
var watch = require('node-watch');
var api = require('./api.js');
module.exports = function(logger){
var portalConfig = JSON.parse(process.env.portalConfig);
var poolConfigs = JSON.parse(process.env.pools);
var websiteConfig = portalConfig.website;
var portalApi = new api(logger, portalConfig, poolConfigs);
var portalStats = portalApi.stats;
var logSystem = 'Website';
var pageFiles = {
'index.html': 'index',
'home.html': '',
'getting_started.html': 'getting_started',
'stats.html': 'stats',
'api.html': 'api'
};
var pageTemplates = {};
var pageProcessed = {};
var indexesProcessed = {};
var processTemplates = function(){
for (var pageName in pageTemplates){
if (pageName === 'index') continue;
pageProcessed[pageName] = pageTemplates[pageName]({
poolsConfigs: poolConfigs,
stats: portalStats.stats,
portalConfig: portalConfig
});
indexesProcessed[pageName] = pageTemplates.index({
page: pageProcessed[pageName],
selected: pageName,
stats: portalStats.stats,
poolConfigs: poolConfigs,
portalConfig: portalConfig
});
}
//logger.debug(logSystem, 'Stats', 'Website updated to latest stats');
};
var readPageFiles = function(){
async.each(Object.keys(pageFiles), function(fileName, callback){
var filePath = 'website/' + (fileName === 'index.html' ? '' : 'pages/') + fileName;
fs.readFile(filePath, 'utf8', function(err, data){
var pTemp = dot.template(data);
pageTemplates[pageFiles[fileName]] = pTemp
callback();
});
}, function(err){
if (err){
console.log('error reading files for creating dot templates: '+ JSON.stringify(err));
return;
}
processTemplates();
});
};
watch('website', function(filename){
//if (event === 'change' && filename in pageFiles)
//READ ALL THE FILEZ BLAHHH
readPageFiles();
});
portalStats.getGlobalStats(function(){
readPageFiles(Object.keys(pageFiles));
});
var buildUpdatedWebsite = function(){
portalStats.getGlobalStats(function(){
processTemplates();
var statData = 'data: ' + JSON.stringify(portalStats.stats) + '\n\n';
for (var uid in portalApi.liveStatConnections){
var res = portalApi.liveStatConnections[uid];
res.write(statData);
}
});
};
setInterval(buildUpdatedWebsite, websiteConfig.statUpdateInterval * 1000);
var app = express();
var getPage = function(pageId){
if (pageId in pageProcessed){
var requestedPage = pageProcessed[pageId];
return requestedPage;
}
};
var route = function(req, res, next){
var pageId = req.params.page || '';
if (pageId in indexesProcessed){
res.end(indexesProcessed[pageId]);
}
else
next();
};
app.get('/get_page', function(req, res, next){
var requestedPage = getPage(req.query.id);
if (requestedPage){
res.end(requestedPage);
return;
}
next();
});
app.get('/:page', route);
app.get('/', route);
app.get('/api/:method', function(req, res, next){
portalApi.handleApiRequest(req, res, next);
});
app.use('/static', express.static('website/static'));
app.use(function(err, req, res, next){
console.error(err.stack);
res.end(500, 'Something broke!');
});
app.listen(portalConfig.website.port, function(){
logger.debug(logSystem, 'Server', 'Website started on port ' + portalConfig.website.port);
});
};