Diff

plugins/mod_pep.lua @ 1136:506012db54e8

mod_pep: Initial commit (extremely basic implementation)
author Waqas Hussain <waqas20@gmail.com>
date Fri, 08 May 2009 01:07:35 +0500
child 1323:e1bfe7816761
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/mod_pep.lua	Fri May 08 01:07:35 2009 +0500
@@ -0,0 +1,48 @@
+
+local jid_bare = require "util.jid".bare;
+local jid_split = require "util.jid".split;
+local st = require "util.stanza";
+local hosts = hosts;
+local user_exists = require "core.usermanager".user_exists;
+local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
+local pairs, ipairs = pairs, ipairs;
+
+local function publish(session, node, item)
+	local stanza = st.message({from=session.full_jid, type='headline'})
+		:tag('event', {xmlns='http://jabber.org/protocol/pubsub#event'})
+			:tag('items', {node=node})
+				:add_child(item)
+			:up()
+		:up();
+
+	-- broadcast to resources
+	stanza.attr.to = session.username..'@'..session.host;
+	core_route_stanza(session, stanza);
+
+	-- broadcast to contacts
+	for jid, item in pairs(session.roster) do
+		if jid and jid ~= "pending" and (item.subscription == 'from' or item.subscription == 'both') then
+			stanza.attr.to = jid;
+			core_route_stanza(session, stanza);
+		end
+	end
+end
+
+module:add_iq_handler("c2s", "http://jabber.org/protocol/pubsub", function (session, stanza)
+	if stanza.attr.type == 'set' and (not stanza.attr.to or jid_bare(stanza.attr.from) == stanza.attr.to) then
+		local payload = stanza.tags[1];
+		if payload.name == 'pubsub' then
+			payload = payload.tags[1];
+			if payload and payload.name == 'publish' and payload.attr.node then
+				local node = payload.attr.node;
+				payload = payload.tags[1];
+				if payload then
+					publish(session, node, payload);
+					return true;
+				end -- TODO else error
+			end -- TODO else error
+		end
+	end
+	origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
+end);
+