var sys = require('sys'), xmpp = require('xmpp'), events = require('events'); var Jid = function(plain) { var tmp = plain.split('/'); this.resource = (tmp.length == 1) ? 'node' : tmp[1]; tmp = tmp[0].split('@'); this.node = tmp[0]; this.domain = tmp[1]; }; exports.Jid = Jid; Jid.prototype.toString = function() { return this.node + '@' + this.domain + '/' + this.resource; }; var Client = function(_jid, password, host) { events.EventEmitter.call(this); this.debug = true; var jabber = this; this.jid = new Jid(_jid); this.host = (host == null) ? this.jid.domain : host; this.rooms = {}; this._iq = 0; this._iqCallback = {}; this.roster = {}; this.xmpp = new xmpp.Client({ host: this.host, jid: '' + this.jid, password: password }); this.xmpp.addListener('rawStanza', function(stanza) { sys.debug("RAW: " + stanza); }); this.xmpp.addListener('authFail', function() { sys.error("[Error] Jabber : Authentication failure"); process.exit(1); }); this.xmpp.addListener('error', function(e) { sys.error(e); process.exit(1); }); this.xmpp.addListener('stanza', function(stanza) { sys.debug('STANZA: ' + stanza); if(stanza.name == 'iq') { if(stanza.attrs.type == 'result') { jabber._debug('IQ result: ' + stanza); jabber.emit('iqResult', stanza.attrs.id, stanza); } else { this._debug('IQ: ' + stanza); jabber.emit('iq', stanza); } } if(stanza.name == 'presence') { var fromm = stanza.attrs.from.split('/')[0].split('@'); if(fromm[1] == 'conference.' + this.jid.domain) { jabber.rooms[fromm[0]].emit('presence', stanza); } else { jabber.emit('presence', stanza); } } if(stanza.name == 'message') { var from = stanza.attrs.from; if(stanza.attrs.type == 'groupchat') { jabber.emit('groupchat', from, stanza); } else { jabber._debug('MESSAGE: ' + stanza); jabber.emit('message', from, stanza.getChild('body').getText(), stanza); } } }); this.xmpp.addListener('online', function() { jabber._debug("[Info] xmpp connection"); jabber.presence(); jabber.iq(new xmpp.Element('query', {xmlns: 'jabber:iq:roster'}), function(iq) { jabber._debug("MY ROSTER" + iq); }); jabber.emit('online'); }); this.addListener('groupchat', function(from, stanza) { fromName = from.split('@')[0]; jabber.rooms[fromName].emit('message', stanza); }); this.addListener('iqResult', function(id, stanza){ jabber._iqCallback[id].call(jabber, stanza); }); }; sys.inherits(Client, events.EventEmitter); exports.Client = Client; Client.prototype._debug = function(txt) { if(this.debug) { sys.debug(txt); } }; Client.prototype.message = function(to, message) { this.xmpp.send(new xmpp.Element('message', { to: to, type: 'chat'}). c('body'). t(message)); }; Client.prototype.iq = function(iq, callback) { var n = this._iq++; this._iqCallback[n] = callback; this.xmpp.send(new xmpp.Element('iq', {type:"get", id: n}).cnode(iq).tree()); }; Client.prototype.presence = function() { this.xmpp.send(new xmpp.Element('presence', {type: 'available'}).tree()); }; Client.prototype.disconnect = function() { this.xmpp.send(new xmpp.Element('presence', {type: 'unavailable'}) .c('status') .t('Logged out') .tree()); var jabber = this; /* Object.keys(this.rooms).forEach(function(room) { jabber.rooms[room].leave(); });*/ this.xmpp.end(); sys.debug("disconnect from XMPP"); };