--- /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
+