From 08aa5e406a1f7b39182e79ea4eb7fabf7d61eaa3 Mon Sep 17 00:00:00 2001 From: makefu Date: Mon, 30 Dec 2013 14:34:38 +0100 Subject: //Cancer -> // because that is what painload is all about --- webchat/index.js | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 webchat/index.js (limited to 'webchat/index.js') diff --git a/webchat/index.js b/webchat/index.js new file mode 100644 index 00000000..9569fc80 --- /dev/null +++ b/webchat/index.js @@ -0,0 +1,172 @@ +'use strict'; +var fs = require('fs'); +var http = require('https'); +var sockjs = require('sockjs'); +var connect = require('connect'); +var irc = require('irc'); +var make_sockjs_server_connection_transport = require('./sockjs_server_connection_transport.js') +var RPC = require('./public/rpc.js'); +var irc_nicks = [] + +function pluck (key) { + return function (object) { + return object[key] + } +} + +var clients = []; +clients.broadcast = function (method, params) { + clients.map(pluck('rpc')).forEach(function (rpc) { + rpc.send(method, params) + }) +} + +var irc_reconnect = function() { //reconnt to irc + console.log("would reconnect now") +// irc_client.disconnect() +// irc_client.connect() +} + +var pingTimeoutDelay = 3*60*1000 +var lastping = setTimeout(irc_reconnect, pingTimeoutDelay) + +var irc_client = new irc.Client('irc.freenode.net', 'kweb', { //create irc_client to talk to irc + channels: ['#krebs'], //todo: read from local_config + sasl: true, + secure: true, + userName: 'kweb', //todo: read from local_config + realName: 'kweb', //todo: read from local_config + password: fs.readFileSync(__dirname+'/local_config/irc.key').toString(), + debug: true, + showErrors: true, + floodProtection: true, + port: 6697, + autoRejoin: true, + autoConnect: true, + stripColors: true +}); + +irc_client.on('ping', function(server) { //restart timer on server ping + console.log("got ping from server, renewing timeout for automatic reconnect"); + clearTimeout(lastping); + lastping = setTimeout(irc_reconnect, pingTimeoutDelay); //reconnect after irc timeout +}) + +irc_client.on('message#krebs', function(from, message) { + console.log({ from: from, message: message }); + clients.broadcast('msg', {nick: from, msg: message}) + clearTimeout(lastping); +}); + +irc_client.on('names#krebs', function(nicks) { + Object.keys(nicks).forEach(function (nick) { + irc_nicks.push(nick) + clients.broadcast('join', {type: 'irc', nick: nick}) + }) +}) + +irc_client.on('join#krebs', function(nick, msg) { + if (nick !== 'kweb'){ + irc_nicks.push(nick) + clients.broadcast('join', {type: 'irc', nick: nick}) + } +}) + +irc_client.on('part#krebs', function(nick, rs, msg) { + clients.broadcast('part', {type: 'irc', nick: nick}) +}); + +irc_client.on('error', function (error) { + irc_nicks.forEach( function(nick) { + client.rpc.send('part', {type: 'irc', nick: nick}) + irc_nicks.splice(irc_nicks.indexOf(nick)) + }) + console.log('irc-client error', error) +}) + +var echo = sockjs.createServer(); + +var total_clients_ever_connected = 0 + +echo.on('connection', function (connection) { + var client = {} + client.rpc = new RPC(make_sockjs_server_connection_transport(connection)) + client.nick = 'anon'+(++total_clients_ever_connected) + client.rpc.send('your_nick', {nick: client.nick}) + client.rpc.register('msg', {msg: 'string'}, function (params, callback) { + callback(null) + clients.broadcast('msg', {type: 'web', nick: client.nick, msg: params.msg}) + irc_client.say('#krebs', client.nick + ' → ' + params.msg) + }) + client.rpc.register('nick', {nick: 'string'}, function (params, callback) { + if (!!~clients.map(pluck('nick')).indexOf(params.nick)) { + callback('name already taken') + } else if (/^anon[0-9]+$/.test(params.nick)) { + callback('bad nick') + } else { + var oldnick = client.nick + client.nick = params.nick + callback(null) + clients.broadcast('nick', {type: 'web', newnick: client.nick, oldnick: oldnick}) + irc_client.say('#krebs', oldnick + ' is now known as ' + client.nick) + } + }) + connection.on('close', function() { //propagate if client quits the page + clients.splice(clients.indexOf(client)); + clients.broadcast('part', {type: 'web', nick: client.nick}) + irc_client.say('#krebs', client.nick + ' has parted') + }) + //send the irc nicklist to the new joined client + irc_nicks.forEach( function(nick) { + client.rpc.send('join', {type: 'irc', nick: nick}) + }) + //send nicklist to newly joined client + clients.map(pluck('nick')).forEach(function (nick) { + client.rpc.send('join', {type: 'web', nick: nick}) + }) + //add new client to list + clients.push(client) + //send all including the new client the join + clients.broadcast('join', {type: 'web', nick: client.nick}) + //send join to irc + irc_client.say('#krebs', client.nick + ' has joined') +}) + +var app = connect() + .use(connect.logger('dev')) + .use(connect.static(__dirname+'/public')) + .use( function (req, res) { + res.writeHead(200, {'Content-Type': 'text/html'}); + var page_template='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='\n'; + page_template+='
'; + page_template+='
'; + page_template+='
'; + page_template+='hello, this is the official krebs support:
\n'; + page_template+='
\n'; + page_template+='
'; + page_template+='
'; + page_template+='
'; + res.end(page_template); + + }) + +var web_serv_options = { //certificates for https + key: fs.readFileSync(__dirname+'/local_config/server_npw.key'), + cert: fs.readFileSync(__dirname+'/local_config/server.crt'), +}; +var server = http.createServer(web_serv_options, app); +echo.installHandlers(server, {prefix:'/echo'}); +server.listen(1337, '0.0.0.0'); +console.log('Server running at https://127.0.0.1:1337/'); -- cgit v1.2.3