UNPKG

shiro

Version:

Online quiz game engine, inspired by russian tv show 'What? Where? When?' (Million Dollar Mind Game).

160 lines (129 loc) 3.2 kB
var server = require('http').createServer() , path = require('path') // thrid-party , async = require('async') , merge = require('deeply') , envar = require('envar') , Wigwam = require('wigwam') // lib , Chat = require('./lib/chat') , Game = require('./lib/game') // globals , wigwam // web server instance , chat // chat instance , game // game instance // default settings , defaults = { port : 1337 , path : 'static' , data : 'data' , admin : 'assword' // admin password , socket: 'socket.io' // --socket=engine.io as an option } // params handling , serverOptions , staticPath , dataPath ; // {{{ prepare environment // set defaut parameters envar.defaults(defaults); // {{{ get web server env setup // make it absolute path staticPath = envar('path')[0] == '/' ? envar('path') : path.join(__dirname, envar('path')); dataPath = envar('data')[0] == '/' ? envar('data') : path.join(__dirname, envar('data')); // web server options serverOptions = { static: { path : staticPath, optionalHtmlExt: true }, websockets: { transformer : envar('socket'), clientLibrary: path.join(staticPath, 'a/primus.js') } }; // check for nocache flag if (envar('nocache')) { serverOptions = merge(serverOptions, {static: {cache: false}}); } // init webserver wigwam = new Wigwam(server, serverOptions); // process events wigwam.on('data connection disconnection', function wigwam_onData(socket, data) { var event; // only objects if (typeof data != 'object') return; for (event in data) { if (!data.hasOwnProperty(event)) continue; // game goes first if (typeof game.events[event] == 'function') { game.events[event].call(this, socket, data[event]); } // then chat if (typeof chat.events[event] == 'function') { chat.events[event].call(this, socket, data[event]); } } }); // }}} // --- do stuff main(); // main function main() { // get chat connectDb(function(err) { if (err) throw new Error('Cannot create chat instance. ' + err); // everything ready, open doors to the public startServer(); // add websockets access if (wigwam.instance.websockets) { game.attach({sockets: wigwam.instance.websockets}); chat.attach({sockets: wigwam.instance.websockets}); } }); } // start web server function startServer() { wigwam.listen(envar('port'), envar('host')); console.log('listening on '+(envar('host') ? envar('host') + ':' : '')+envar('port')); } // connect to db function connectDb(callback) { async.parallel( { // get chat data chat: function(asyncCb) { chat = new Chat({env: envar, storage: path.join(dataPath, 'chat.db')}); chat.init(asyncCb); }, // get game data game: function(asyncCb) { game = new Game({env: envar, storage: path.join(dataPath, 'game.db')}); game.init(asyncCb); } }, function(err) { if (err) return callback(err); // add references between chat and game game.attach({chat: chat}); chat.attach({game: game}); callback(null); }); } // }}}