Software /
code /
prosody-modules
File
mod_group_bookmarks/mod_group_bookmarks.lua @ 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 |
child | 290:ee416b285802 |
line wrap: on
line source
-- 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