Mercurial > psgxs
diff modules/mod_publish_message.js @ 34:dcf1f09f8cee
Add message to publish module and various fixes.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 05 Nov 2010 15:31:13 +0100 |
parents | |
children | 6697f394301f |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/modules/mod_publish_message.js @@ -0,0 +1,87 @@ +var config = require('../configuration'); +var storage = require('../storage'); +var notifs = require('../notifs'); +var errors = require('../errors'); +var utils = require('../util'); +var toBareJID = utils.toBareJID; +var NS = require('../namespaces'); +var xmpp = require('xmpp'); + +exports.publish = { + stanza: 'message', + child: 'body', + func: function(response, stanza, request, to, from) { + if (!config.enabled('publish')) + return makeError(response, errors.pub.publish.item_publication_not_supported.n); + + var nodeID = utils.toResource(from); + console.log(require('sys').inspect(nodeID)); + if (!nodeID || nodeID == '') + return makeError(response, errors.nodeid_required.n); + + var autocreate = false; + if (!storage.existsNode(nodeID)) { + if (config.enabled('auto-create')) + autocreate = true; + else + return makeError(response, errors.node_does_not_exist.n); + } + + var affil = storage.getAffiliation(toBareJID(to), nodeID); + if (typeof affil == 'number' && affil != errors.node_does_not_exist.n) + return makeError(response, affil); + if (!autocreate && affil != 'super-owner' && affil != 'owner' && affil != 'publisher' && affil != 'publish-only') + return makeError(response, errors.forbidden.n); + + if (!config.enabled('item-ids')) + return makeError(response, errors.itemid_required.n); + var itemID = utils.makeRandomId(); + + var now = new Date(); + + var item = xmpp.stanza('item', {xmlns: NS.PUBSUB, id: itemID}); + item.c('entry', {xmlns: NS.ATOM}); + if (stanza.getChild('subject')) + item.c('title').t(stanza.getChild('subject')).up(); + item.c('summary').t(request.getText()).up(); + item.c('id').t(itemID).up(); + item.c('published').t(now.toString()).up(); + item.c('updated').t(now.toString()).up(); + console.log(require('sys').inspect(item, false, null)); + + if (!config.enabled('persistent-items')) { + var notifications = storage.purgeNode(nodeID); + if (typeof notifications == 'number') + return makeError(response, r); + } + + if (autocreate) { + if (!form) + form = {}; + form['pubsub#creator'] = toBareJID(to); + + var r = storage.createNode(nodeID, form); + if (typeof r == 'number') + return makeError(response, r); + } + + var content = item.getChild(); + + subscribers = storage.setItem(nodeID, itemID, content); + if (typeof subscribers == 'number') + return makeError(response, subscribers); + + var attrs = {}; + if (content) + attrs[itemID] = {content: content}; + else + attrs[itemID] = {}; + notifs.send(subscribers, 'items', nodeID, attrs); + + response.c('pubsub', {xmlns: NS.PUBSUB}) + .c('publish', {node: nodeID}) + .c('item', {id: itemID}); + + return response; + } +}