Annotate

mod_group_bookmarks/mod_group_bookmarks.lua @ 1341:f5c256a5f209

Merge
author Kim Alvefur <zash@zash.se>
date Mon, 10 Mar 2014 00:04:00 +0100
parent 679:dcddd9195098
child 1343:7dbde05b48a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
289
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 -- Prosody IM
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 --
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 -- COPYING file in the source package for more information.
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 --
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local st = require "util.stanza"
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local datamanager = require "util.datamanager"
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local jid, datamanager = require "util.jid", require "util.datamanager";
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 local jid_bare, jid_prep, jid_split = jid.bare, jid.prep, jid.split;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local module_host = module:get_host();
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 local rooms;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local members;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 local bookmarks_file;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 module:add_feature("jabber:iq:private");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 function inject_bookmarks(username, host, data)
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local jid = username.."@"..host;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 data:reset();
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 if members[jid] then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 for _, room in ipairs(members[jid]) do
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 data:tag("conference", {
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 name = room;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 jid = room;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 autojoin = "1";
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 });
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local nick = rooms[room][jid];
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 if nick then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 data:tag("nick"):text(nick):up();
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 data:up();
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 return data;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 module:hook("iq/self/jabber:iq:private:query", function(event)
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 local origin, stanza = event.origin, event.stanza;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 local type = stanza.attr.type;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 local query = stanza.tags[1];
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 if #query.tags == 1 then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local tag = query.tags[1];
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 local key = tag.name..":"..tag.attr.xmlns;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 local data, err = datamanager.load(origin.username, origin.host, "private");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 if err then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 origin.send(st.error_reply(stanza, "wait", "internal-server-error"));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 return true;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 if stanza.attr.type == "get" then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 local data = data and data[key];
290
ee416b285802 mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents: 289
diff changeset
59 if (not data) and key == "storage:storage:bookmarks" then
ee416b285802 mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents: 289
diff changeset
60 data = st.stanza("storage", { xmlns = "storage:bookmarks" });
ee416b285802 mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
Matthew Wild <mwild1@gmail.com>
parents: 289
diff changeset
61 end
289
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 if data then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 data = st.deserialize(data);
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 if key == "storage:storage:bookmarks" then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 data = inject_bookmarks(origin.username, origin.host, data);
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"})
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 :add_child(data));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 else
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 origin.send(st.reply(stanza):add_child(stanza.tags[1]));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 return true;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 end, 1);
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 function module.load()
679
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
78 bookmarks_file = module:get_option_string("group_bookmarks_file");
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
79
289
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 rooms = { default = {} };
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 members = { };
679
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
82
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
83 if not bookmarks_file then
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
84 module:log("error", "Please specify group_bookmarks_file in your configuration");
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
85 return;
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
86 end
dcddd9195098 mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents: 290
diff changeset
87
289
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 local curr_room;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 for line in io.lines(bookmarks_file) do
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 if line:match("^%s*%[.-%]%s*$") then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 curr_room = line:match("^%s*%[(.-)%]%s*$");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 if curr_room:match("^%+") then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 curr_room = curr_room:gsub("^%+", "");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 if not members[false] then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 members[false] = {};
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 members[false][#members[false]+1] = curr_room; -- Is a public group
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 module:log("debug", "New group: %s", tostring(curr_room));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 rooms[curr_room] = rooms[curr_room] or {};
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 elseif curr_room then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 -- Add JID
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 local entryjid, name = line:match("([^=]*)=?(.*)");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 module:log("debug", "entryjid = '%s', name = '%s'", entryjid, name);
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local jid;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 jid = jid_prep(entryjid:match("%S+"));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 if jid then
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 module:log("debug", "New member of %s: %s", tostring(curr_room), tostring(jid));
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 rooms[curr_room][jid] = name or false;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 members[jid] = members[jid] or {};
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 members[jid][#members[jid]+1] = curr_room;
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 module:log("info", "Group bookmarks loaded successfully");
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 end
415034fd38c2 mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117