/app.js
var xmpp = require('simple-xmpp');
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var cookie = require('./node_modules/express/node_modules/cookie');
var connect = require('./node_modules/express/node_modules/connect');
var Agent = require('./agent.js');

var cookie_secret = 'Du:drKkl8&<\\I~Tc~y$nnJbX?Zt<M}1K4lx*N<iJOc|UpSK$w#iZvxqJ1vOrv(088Ev!~2;1="M!)BVD{%:7U1{0#';
var sessionStore = new express.session.MemoryStore();
app.use(express.cookieParser(cookie_secret));
app.use(express.session({
    store: sessionStore,
    key: 'connect.sess'
}));
app.use(express.json());
app.use(express.static(__dirname + '/www'));

io.configure(function() {
    io.set('authorization', function (handshakeData, callback) {
        if (handshakeData.headers.cookie) {
            var cookies = cookie.parse(handshakeData.headers.cookie);
            var signedCookies = connect.utils.parseSignedCookies(cookies, cookie_secret);
            var sid = signedCookies['connect.sess'];
            sessionStore.load(sid, function(err, sess) {
                if (err) return callback(err);
                if (!sess) return callback('No session');

                handshakeData.session = sess;
                callback(null, true);
            });
        } else {
            callback('No session cookie');
        }
    });
});

server.listen(4000);

var agents = {};

io.sockets.on('connection', function(socket) {
    var session = socket.handshake.session;
    var agent;

    socket.on('login', function(data) {
        agent = new Agent();

        agent.on('message', function(data) {
            socket.emit('message', data);
        });

        agent.on('buddy', function(data) {
            socket.emit('buddy', data);
        });

        agent.login(data.username, data.password, function(err) {
            if (err) {
                console.log(err);
                socket.emit('login-failed');
            } else {
                socket.emit('login-successful', {
                    username: data.username
                });
                session.jid = data.username;
                session.save();
                agents[session.jid] = agent;
                console.log('logged in');
                agent.getRoster(function(err, roster) {
                    socket.emit('roster', roster);
                });
            }
        });
    });

    socket.on('logout', function() {
        agent.logout();
        session.destroy();
        socket.disconnect();
    });

    socket.on('get-roster', function() {
        agent.getRoster(function(err, roster) {
            socket.emit('roster', roster);
        });
    });

    socket.on('send-message', function(data) {
        agent.sendMessage(data);
    });
});