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;
+	}
+}