crunchbutton/cli/chat.js
2015-01-22 13:13:10 -08:00

196 lines
4.3 KiB
JavaScript

// Setup basic express server
require('newrelic');
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3696;
var http = require('http');
var querystring = require('querystring');
var bodyParser = require('body-parser');
var key = 'eoW5Z/nhFNMPjjYI62czeNhaK6x5jgsw94rFrSZnoLpa/fVswc+fJlhK1vi21kk7RHz5Dzvv0XvJkmdmc3ldY7JjmjgsZvVLq0E8x+jXBO9Dtp3tvlndHcj8v3onjP0ghh8vf4oSE1nbGKxsqpTHDpgHP6QLjJb+4vNyWmoDhlEwr4EabditQsALfSUvXJrgXR6JQ3NlDke/1w9mC9X7KEG52VLIZJhGyyPB4Dt2sWEYIXOTahy5PDGPCNxw';
server.listen(port, function () {
console.log('Server listening at port %d', port);
});
app.use(bodyParser.json());
var sendBroadcast = function(payload, to, event) {
var sockets = {};
console.log('recieved broadcast...', to, event, payload);
// @todo: prevent duplicate messages
if (to.room) {
if (typeof to.room != 'object') {
to.room = [to.room];
}
for (var x in to.room) {
io.to(to.room[x]).emit(to.room[x] + '.' + event, payload);
continue;
io.sockets.clients(to.room[x]).forEach(function(socket) {
if (!sockets[socket.phpsessid]) {
sockets[socket.phpsessid] = socket;
}
});
}
}
if (to.admin) {
if (typeof to.admin != 'object') {
to.admin = [to.admin];
}
io.sockets.clients().forEach(function(socket) {
if (to.admin.indexOf(socket.id_admin) > -1) {
if (!sockets[socket.phpsessid]) {
sockets[socket.phpsessid] = socket;
}
}
});
}
for (var x in sockets) {
sockets[x].emit(event, payload);
}
}
// from php
app.post('/', function (req, res) {
if (req.body._key != key) {
res.status(401).end();
return;
}
sendBroadcast(req.body.payload, req.body.to, req.body.event);
res.send('{"status":"sent"}');
});
app.all('*', function (req, res) {
res.redirect(302, 'https://cockpit.la/');
});
io.on('connection', function (socket) {
var addedUser = false;
console.log('user connected...');
socket.events = {};
// from socket
socket.on('event.broadcast', function (payload) {
sendBroadcast(payload.payload, payload.to, payload.event);
});
socket.on('event.message', function (payload) {
console.log('recieved message...', payload);
if (!payload.url) {
return;
}
var post = querystring.stringify(payload.data);
var options = {
host: socket.apiHost || 'beta.cockpit.la',
path: payload.url,
port: '80',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post.length,
'Cookie': 'PHPSESSID=' + socket.phpsessid + '; token=' + socket.token
}
};
var complete = function(data) {
console.log('api response: ', data);
socket.emit('event.response', data);
};
var req = http.request(options, function(res) {
console.log('statusCode: ', res.statusCode);
console.log('headers: ', res.headers);
res.setEncoding('utf8');
var str = '';
res.on('data', function (chunk) {
str += chunk;
});
res.on('end', function () {
complete(str);
});
});
req.on('error', function (err) {
console.log(err);
});
req.write(post);
req.end();
});
// listen for events
socket.on('event.subscribe', function (event) {
console.log('subscribing to ', event);
socket.join(event);
});
// stop listening for events
socket.on('event.unsubscribe', function (event) {
console.log('unsubscribing to ', event);
socket.leave(event);
});
// set the auth to be used for authentication
socket.on('auth', function (payload) {
socket.phpsessid = payload.phpsessid;
socket.token = payload.token;
socket.apiHost = payload.host || 'beta.cockpit.la';
var options = {
host: socket.apiHost,
path: '/api/config',
port: '443',
method: 'GET',
headers: {
'Cookie': 'PHPSESSID=' + socket.phpsessid + '; token=' + socket.token
}
};
var complete = function(data) {
console.log('config response: ', data);
if (data.user && data.user.id_admin) {
socket.id_admin = data.user.id_admin;
}
};
var req = http.request(options, function(res) {
console.log('statusCode: ', res.statusCode);
console.log('headers: ', res.headers);
var str = '';
res.on('data', function (chunk) {
str += chunk;
});
res.on('end', function () {
complete(str);
});
});
req.on('error', function (err) {
console.log(err);
});
});
});