var sys = require('sys'), xmpp = require('node-xmpp'), colors = require('colors'), events = require('events'); function Pubsub(client, to) { this.client = client; if(to == null) { to = 'pubsub.' + this.client.jid.domain; } this.to = to; this._eventCallback = {}; var pubsub = this; this.client.addListener('pubsub:event', function(from, node, event_, stanza) { if(from == pubsub.to) { // sys.debug('a pubsub event'.yellow); var cb = pubsub._eventCallback[node]; if(cb != null) { cb.call(pubsub, event_, stanza); } } }); }; sys.inherits(Pubsub, events.EventEmitter); exports.Pubsub = Pubsub; Pubsub.prototype.createTree = function() { /*sys.debug(new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}) .c('create', {node: '/home/' + this.client.jid.domain + '/user'}).up() .c('configure') .tree());*/ this.client.iqSet(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}) .c('create', {node: '/home/' + this.client.jid.domain + '/user'}).up() .c('configure') .tree(), function(stanza) { // sys.debug(stanza.toString().yellow); // sys.debug(stanza.getChild('pubsub', 'http://jabber.org/protocol/pubsub').toString.yellow); } ); }; Pubsub.prototype.disco = function(callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('query', {xmlns: 'http://jabber.org/protocol/disco#info'}), function(iq) { callback.call(jabber, iq.getChild('query', 'http://jabber.org/protocol/disco#info')); } ); }; Pubsub.prototype.discoNode = function(node, callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('query', {xmlns: 'http://jabber.org/protocol/disco#info', node: node}), function(iq) { callback.call(jabber, iq.getChild('query', 'http://jabber.org/protocol/disco#info')); } ); }; Pubsub.prototype.subscriptions = function(callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}).c('subscriptions'), function(iq) { callback.call(jabber, iq .getChild('pubsub', 'http://jabber.org/protocol/pubsub') .getChild('subscriptions') .getChildren('subscription') ); } ); }; Pubsub.prototype.nodeSubscriptions = function(node, callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}).c('subscriptions', {node: node}), function(iq) { callback.call(jabber, iq .getChild('pubsub', 'http://jabber.org/protocol/pubsub') .getChild('subscriptions') .getChildren('subscription') ); } ); }; Pubsub.prototype.discoNodeItems = function(node, callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('query', {xmlns: 'http://jabber.org/protocol/disco#items', node: node}), function(iq) { callback.call(jabber, iq.getChild('query', 'http://jabber.org/protocol/disco#items').getChildren('item')); } ); }; Pubsub.prototype.discoNodes = function(callback) { var jabber = this.client; this.client.iq(this.to, new xmpp.Element('query', {xmlns: 'http://jabber.org/protocol/disco#items'}), function(iq) { callback.call(jabber, iq.getChild('query', 'http://jabber.org/protocol/disco#items').getChildren('item')); } ); }; Pubsub.prototype.node = function(node, callback) { var exist = false; var pubsub = this; this.discoNodes(function(items) { items.forEach(function(item) { if(item.attrs.node == node) { exist = true; } }); if(! exist) { pubsub.createNode(node, callback); } else { callback.call(pubsub.client); } }); }; Pubsub.prototype.createNode = function(node, callback) { var jabber = this.client; this.client.iqSet(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}) .c('create', {node: node}).up() .c('configure') .tree(), function(stanza) { var pubsub = stanza.getChild('pubsub', 'http://jabber.org/protocol/pubsub'); if(pubsub != null) { // sys.debug(pubsub.toString().yellow); callback.call(jabber); } } ); }; Pubsub.prototype.publish = function(node, content) { this.client.iqSet(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}) .c('publish', {node: node}) .c('item') .cnode(content) .tree(), function(iq) { // sys.debug('PUBLISH : ' + iq); // sys.debug('just published'.yellow); } ); }; Pubsub.prototype.suscribe = function(node, onMessage, onSuscribed) { var jabber = this.client; var pubsub = this; jabber.iqSet(this.to, new xmpp.Element('pubsub', {xmlns: 'http://jabber.org/protocol/pubsub'}) .c('subscribe', { node: node, jid: jabber.jid.user + '@' + jabber.jid.domain }) .tree(), function(iq) { // sys.debug(('Suscribe to ' + node).yellow); pubsub._eventCallback[node] = onMessage; var s = iq.getChild('pubsub', 'http://jabber.org/protocol/pubsub').attrs; onSuscribed.call(jabber, s.subscription, s.subid); } ); };