# HG changeset patch # User Matthew Wild # Date 1292862253 0 # Node ID 415034fd38c2c441ce44c59f9eee6f03fdce7077 # Parent 9233d7ee3c09ba516110c147b6958147950fe06b mod_group_bookmarks: Module to inject room bookmarks to user private XML stores diff -r 9233d7ee3c09 -r 415034fd38c2 mod_group_bookmarks/mod_group_bookmarks.lua --- /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 +