# HG changeset patch # User Emmanuel Gil Peyrot # Date 1534610210 -3600 # Node ID 73906187f964eb975e54e799a949342e09fd9c24 # Parent bd8e94ff726bb40057dfcc1a853236d5485cb66e mod_default_bookmarks: Add support for trunk’s mod_pep. diff -r bd8e94ff726b -r 73906187f964 mod_default_bookmarks/README.markdown --- a/mod_default_bookmarks/README.markdown Sat Aug 18 17:25:44 2018 +0100 +++ b/mod_default_bookmarks/README.markdown Sat Aug 18 17:36:50 2018 +0100 @@ -37,3 +37,12 @@ -- You can also use this compact syntax: "yetanother@conference.example.com"; -- this will get "yetanother" as name }; + +Compatibility +------------- + + ------- --------------- + trunk Works + 0.10 Should work + 0.9 Should work + ------- --------------- diff -r bd8e94ff726b -r 73906187f964 mod_default_bookmarks/mod_default_bookmarks.lua --- a/mod_default_bookmarks/mod_default_bookmarks.lua Sat Aug 18 17:25:44 2018 +0100 +++ b/mod_default_bookmarks/mod_default_bookmarks.lua Sat Aug 18 17:36:50 2018 +0100 @@ -2,48 +2,82 @@ -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- Copyright (C) 2011 Kim Alvefur +-- Copyright (C) 2018 Emmanuel Gil Peyrot -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- - local st = require "util.stanza" - local dm_load = require "util.datamanager".load local jid_split = require "util.jid".split -module:hook("iq/self/jabber:iq:private:query", function(event) - local origin, stanza = event.origin, event.stanza; - local typ = stanza.attr.type; - local from = stanza.attr.from; - local query = stanza.tags[1]; - if #query.tags == 1 and typ == "get" then - local tag = query.tags[1]; - local key = tag.name..":"..tag.attr.xmlns; - if key == "storage:storage:bookmarks" then - local data, err = dm_load(origin.username, origin.host, "private"); - if not(data and data[key]) then - local bookmarks = module:get_option("default_bookmarks"); - if bookmarks and #bookmarks > 0 then - local reply = st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}) - :tag("storage", { xmlns = "storage:bookmarks" }); - local nick = jid_split(from); - for i=1,#bookmarks do - local bookmark = bookmarks[i]; - if type(bookmark) ~= "table" then -- assume it's only a jid - bookmark = { jid = bookmark, name = jid_split(bookmark) }; - end - reply:tag("conference", { - jid = bookmark.jid, - name = bookmark.name, - autojoin = "1", - }):tag("nick"):text(nick):up():up(); - end - origin.send(reply); - return true; - end - end +-- COMPAT w/trunk +local is_on_trunk = false; +local mm = require "core.modulemanager"; +if mm.get_modules_for_host then + if mm.get_modules_for_host(module.host):contains("bookmarks") then + is_on_trunk = true; + end +end + +local function get_default_bookmarks(nickname) + local bookmarks = module:get_option("default_bookmarks"); + if not bookmarks or #bookmarks == 0 then + return false; + end + local reply = st.stanza("storage", { xmlns = "storage:bookmarks" }); + local nick = nickname and st.stanza("nick"):text(nickname); + for _, bookmark in ipairs(bookmarks) do + if type(bookmark) ~= "table" then -- assume it's only a jid + bookmark = { jid = bookmark, name = jid_split(bookmark) }; + end + reply:tag("conference", { + jid = bookmark.jid, + name = bookmark.name, + autojoin = "1", + }); + if nick then + reply:add_child(nick):up(); + end + reply:up(); + end + return reply; +end + +if is_on_trunk then + local mod_bookmarks = module:depends "bookmarks"; + local function on_bookmarks_empty(event) + local session = event.session; + local bookmarks = get_default_bookmarks(session.username); + if bookmarks then + mod_bookmarks.publish_to_pep(session.full_jid, bookmarks); end end -end, 1); + module:hook("bookmarks/empty", on_bookmarks_empty); +else + local function on_private_xml_get(event) + local origin, stanza = event.origin, event.stanza; + local tag = stanza.tags[1].tags[1]; + local key = tag.name..":"..tag.attr.xmlns; + if key ~= "storage:storage:bookmarks" then + return; + end + + local data, err = dm_load(origin.username, origin.host, "private"); + if data and data[key] then + return; + end + + local bookmarks = get_default_bookmarks(origin.username); + if not bookmarks then + return; + end; + + local reply = st.reply(stanza):tag("query", { xmlns = "jabber:iq:private" }) + :add_child(bookmarks); + origin.send(reply); + return true; + end + module:hook("iq-get/self/jabber:iq:private:query", on_private_xml_get, 1); +end