http = require('http'),
https = require('https'),
fs = require('fs'),
+ url = require('url'),
ws = require('socket.io'),
_ = require('./lib/underscore.min.js'),
starttls = require('./lib/starttls.js');
var config = JSON.parse(fs.readFileSync(__dirname + '/config.json', 'ascii'));
+if (config.handle_http) {
+ var static_server = require('node-static'),
+ jade = require('jade');
+}
+
var ircNumerics = {
RPL_WELCOME: '001',
RPL_ISUPPORT: '005',
case ircNumerics.RPL_WHOISUSER:
case ircNumerics.RPL_WHOISSERVER:
case ircNumerics.RPL_WHOISOPERATOR:
- case ircNumerics.RPL_WHOISIDLE:
case ircNumerics.RPL_ENDOFWHOIS:
case ircNumerics.RPL_WHOISCHANNELS:
case ircNumerics.RPL_WHOISMODES:
websocket.emit('message', {event: 'whois', server: '', nick: msg.params.split(" ", 3)[1], "msg": msg.trailing});
break;
+ case ircNumerics.RPL_WHOISIDLE:
+ params = msg.params.split(" ", 3);
+ websocket.emit('message', {event: 'whois', server: '', nick: params[1], "msg": params[2] + ' ' + msg.trailing});
case ircNumerics.RPL_MOTD:
websocket.emit('message', {event: 'motd', server: '', "msg": msg.trailing});
break;
}
};
+if (config.handle_http) {
+ var fileServer = new (static_server.Server)(__dirname + config.public_http);
+}
+
+var httpHandler = function (request, response) {
+ var uri, subs, useragent, agent, server_set, server, nick, debug, touchscreen;
+ if (config.handle_http) {
+ uri = url.parse(request.url);
+ subs = uri.pathname.substr(0, 4);
+ if ((subs === '/js/') || (subs === '/css') || (subs === '/img')) {
+ request.addListener('end', function () {
+ fileServer.serve(request, response);
+ });
+ } else if (uri.pathname === '/') {
+ useragent = (response.headers) ? response.headers['user-agent']: '';
+ if (useragent.indexOf('android') !== -1) {
+ agent = 'android';
+ touchscreen = true;
+ } else if (useragent.indexOf('iphone') !== -1) {
+ agent = 'iphone';
+ touchscreen = true;
+ } else if (useragent.indexOf('ipad') !== -1) {
+ agent = 'ipad';
+ touchscreen = true;
+ } else if (useragent.indexOf('ipod') !== -1) {
+ agent = 'ipod';
+ touchscreen = true;
+ } else {
+ agent = 'normal';
+ touchscreen = false;
+ }
+ if (uri.query) {
+ server_set = (uri.query.server !== '');
+ server = uri.query.server || 'irc.anonnet.org';
+ nick = uri.query.nick || '';
+ debug = (uri.query.debug !== '');
+ } else {
+ server = 'irc.anonnet.org';
+ nick = '';
+ }
+ response.setHeader('Connection', 'close');
+ response.setHeader('X-Generated-By', 'KiwiIRC');
+ jade.renderFile(__dirname + '/client/index.html.jade', { locals: { "touchscreen": touchscreen, "debug": debug, "server_set": server_set, "server": server, "nick": nick, "agent": agent, "config": config }}, function (err, html) {
+ if (!err) {
+ response.write(html);
+ } else {
+ response.statusCode = 500;
+ }
+ response.end();
+ });
+ } else if (uri.pathname.substr(0, 10) === '/socket.io') {
+ // Do nothing!
+ } else {
+ response.statusCode = 404;
+ response.end();
+ }
+ }
+};
+
//setup websocket listener
if (config.listen_ssl) {
- var httpServer = https.createServer({key: fs.readFileSync(__dirname + '/' + config.ssl_key), cert: fs.readFileSync(__dirname + '/' + config.ssl_cert)});
+ var httpServer = https.createServer({key: fs.readFileSync(__dirname + '/' + config.ssl_key), cert: fs.readFileSync(__dirname + '/' + config.ssl_cert)}, httpHandler);
var io = ws.listen(httpServer, {secure: true});
httpServer.listen(config.port, config.bind_address);
} else {
- var httpServer = http.createServer();
+ var httpServer = http.createServer(httpHandler);
var io = ws.listen(httpServer, {secure: false});
httpServer.listen(config.port, config.bind_address);
}
-io.sockets.on('connection', function (websocket) {
+io.of('/kiwi').on('connection', function (websocket) {
websocket.on('irc connect', function (nick, host, port, ssl, callback) {
var ircSocket;
//setup IRC connection