changeset 289:415034fd38c2

mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
author Matthew Wild <mwild1@gmail.com>
date Mon, 20 Dec 2010 16:24:13 +0000
parents 9233d7ee3c09
children ee416b285802
files mod_group_bookmarks/mod_group_bookmarks.lua
diffstat 1 files changed, 109 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_group_bookmarks/mod_group_bookmarks.lua	Mon Dec 20 16:24:13 2010 +0000
@@ -0,0 +1,109 @@
+-- Prosody IM
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
+-- 
+-- This project is MIT/X11 licensed. Please see the
+-- COPYING file in the source package for more information.
+--
+
+
+local st = require "util.stanza"
+
+local datamanager = require "util.datamanager"
+local jid, datamanager = require "util.jid", require "util.datamanager";
+local jid_bare, jid_prep, jid_split = jid.bare, jid.prep, jid.split;
+
+local module_host = module:get_host();
+
+local rooms;
+local members;
+
+local bookmarks_file;
+
+module:add_feature("jabber:iq:private");
+
+function inject_bookmarks(username, host, data)
+	local jid = username.."@"..host;
+	data:reset();
+	if members[jid] then
+		for _, room in ipairs(members[jid]) do
+			data:tag("conference", {
+				name = room;
+				jid = room;
+				autojoin = "1";
+			});
+			local nick = rooms[room][jid];
+			if nick then
+				data:tag("nick"):text(nick):up();
+			end
+			data:up();
+		end
+	end
+	return data;
+end
+
+module:hook("iq/self/jabber:iq:private:query", function(event)
+	local origin, stanza = event.origin, event.stanza;
+	local type = stanza.attr.type;
+	local query = stanza.tags[1];
+	if #query.tags == 1 then
+		local tag = query.tags[1];
+		local key = tag.name..":"..tag.attr.xmlns;
+		local data, err = datamanager.load(origin.username, origin.host, "private");
+		if err then
+			origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
+			return true;
+		end
+		if stanza.attr.type == "get" then
+			local data = data and data[key];
+			if data then
+				data = st.deserialize(data);
+				if key == "storage:storage:bookmarks" then
+					data = inject_bookmarks(origin.username, origin.host, data);
+				end
+				origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"})
+					:add_child(data));
+			else
+				origin.send(st.reply(stanza):add_child(stanza.tags[1]));
+			end
+			return true;
+		end
+	end
+end, 1);
+
+function module.load()
+	bookmarks_file = config.get(module:get_host(), "core", "group_bookmarks_file");
+	if not bookmarks_file then return; end
+	
+	rooms = { default = {} };
+	members = { };
+	local curr_room;
+	for line in io.lines(bookmarks_file) do
+		if line:match("^%s*%[.-%]%s*$") then
+			curr_room = line:match("^%s*%[(.-)%]%s*$");
+			if curr_room:match("^%+") then
+				curr_room = curr_room:gsub("^%+", "");
+				if not members[false] then
+					members[false] = {};
+				end
+				members[false][#members[false]+1] = curr_room; -- Is a public group
+			end
+			module:log("debug", "New group: %s", tostring(curr_room));
+			rooms[curr_room] = rooms[curr_room] or {};
+		elseif curr_room then
+			-- Add JID
+			local entryjid, name = line:match("([^=]*)=?(.*)");
+			module:log("debug", "entryjid = '%s', name = '%s'", entryjid, name);
+			local jid;
+			jid = jid_prep(entryjid:match("%S+"));
+			if jid then
+				module:log("debug", "New member of %s: %s", tostring(curr_room), tostring(jid));
+				rooms[curr_room][jid] = name or false;
+				members[jid] = members[jid] or {};
+				members[jid][#members[jid]+1] = curr_room;
+			end
+		end
+	end
+	module:log("info", "Group bookmarks loaded successfully");
+end
+