comparison mod_archive/mod_archive.lua @ 182:43d9e0944276

mod_archive: now auto archiving is almost done.
author shinysky<shinysky1986(AT)gmail.com>
date Mon, 21 Jun 2010 15:28:57 +0800
parents 62f47a93b5b7
children 670c99e96c52
comparison
equal deleted inserted replaced
181:15bc93c85a08 182:43d9e0944276
19 module:add_feature("urn:xmpp:archive:pref"); 19 module:add_feature("urn:xmpp:archive:pref");
20 20
21 ------------------------------------------------------------ 21 ------------------------------------------------------------
22 -- Utils 22 -- Utils
23 ------------------------------------------------------------ 23 ------------------------------------------------------------
24 local function load_prefs(node, host, dir) 24 local function load_prefs(node, host)
25 return st.deserialize(dm.load(node, host, dir or PREFS_DIR)); 25 return st.deserialize(dm.load(node, host, PREFS_DIR));
26 end 26 end
27 27
28 local function store_prefs(data, node, host, dir) 28 local function store_prefs(data, node, host)
29 dm.store(node, host, dir or PREFS_DIR, st.preserialize(data)); 29 dm.store(node, host, PREFS_DIR, st.preserialize(data));
30 end 30 end
31 31
32 local function store_msg(data, node, host, dir) 32 local function store_msg(msg, node, host, isfrom)
33 dm.list_append(node, host, dir or ARCHIVE_DIR, st.preserialize(data)); 33 local body = msg:child_with_name("body");
34 local thread = msg:child_with_name("thread");
35 local data = dm.list_load(node, host, ARCHIVE_DIR);
36 local tag = (isfrom and "from") or "to";
37 if data then
38 for k, v in ipairs(data) do
39 -- <chat with='juliet@capulet.com/chamber'
40 -- start='1469-07-21T02:56:15Z'
41 -- thread='damduoeg08'
42 -- subject='She speaks!'
43 -- version='1'>
44 -- <from secs='0'><body>Art thou not Romeo, and a Montague?</body></from>
45 -- <to secs='11'><body>Neither, fair saint, if either thee dislike.</body></to>
46 -- <from secs='7'><body>How cam'st thou hither, tell me, and wherefore?</body></from>
47 -- <note utc='1469-07-21T03:04:35Z'>I think she might fancy me.</note>
48 -- </chat>
49 local collection = st.deserialize(v);
50 if collection.attr["thread"] == thread:get_text() then
51 -- TODO figure out secs
52 collection:tag(tag, {secs='1'}):add_child(body);
53 local ver = tonumber(collection.attr["version"]) + 1;
54 collection.attr["version"] = tostring(ver);
55 data[k] = collection;
56 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
57 return;
58 end
59 end
60 end
61 -- not found, create new collection
62 -- TODO figure out start time
63 local collection = st.stanza('chat', {with = isfrom and msg.attr.to or msg.attr.from, start='2010-06-01T09:56:15Z', thread=thread:get_text(), version='0'});
64 collection:tag(tag, {secs='0'}):add_child(body);
65 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection));
34 end 66 end
35 67
36 ------------------------------------------------------------ 68 ------------------------------------------------------------
37 -- Preferences 69 -- Preferences
38 ------------------------------------------------------------ 70 ------------------------------------------------------------
65 data:tag('auto', {save='false'}):up(); 97 data:tag('auto', {save='false'}):up();
66 end 98 end
67 local elem = stanza.tags[1].tags[1]; -- iq:pref:xxx 99 local elem = stanza.tags[1].tags[1]; -- iq:pref:xxx
68 if not elem then return false end 100 if not elem then return false end
69 -- "default" | "item" | "session" | "method" 101 -- "default" | "item" | "session" | "method"
70 -- FIXME there may be many item/session/method sections!!
71 elem.attr["xmlns"] = nil; -- TODO why there is an extra xmlns attr? 102 elem.attr["xmlns"] = nil; -- TODO why there is an extra xmlns attr?
72 if elem.name == "default" then 103 if elem.name == "default" then
73 local setting = data:child_with_name(elem.name) 104 local setting = data:child_with_name(elem.name)
74 for k, v in pairs(elem.attr) do 105 for k, v in pairs(elem.attr) do
75 setting.attr[k] = v; 106 setting.attr[k] = v;
249 280
250 ------------------------------------------------------------ 281 ------------------------------------------------------------
251 -- Message Handler 282 -- Message Handler
252 ------------------------------------------------------------ 283 ------------------------------------------------------------
253 local function msg_handler(data) 284 local function msg_handler(data)
285 -- TODO if not auto_archive_enabled then return nil;
254 module:log("debug", "-- Enter msg_handler()"); 286 module:log("debug", "-- Enter msg_handler()");
255 local origin, stanza = data.origin, data.stanza; 287 local origin, stanza = data.origin, data.stanza;
256 local body = stanza:child_with_name("body"); 288 local body = stanza:child_with_name("body");
289 local thread = stanza:child_with_name("thread");
257 module:log("debug", "-- msg:\n%s", tostring(stanza)); 290 module:log("debug", "-- msg:\n%s", tostring(stanza));
258 if body then 291 if body then
259 module:log("debug", "-- msg body:\n%s", tostring(body)); 292 module:log("debug", "-- msg body:\n%s", tostring(body));
260 -- module:log("debug", "-- msg body text:\n%s", body:get_text()); 293 -- TODO mapping messages and conversations to collections if no thread
261 local from_node, from_host = jid.split(stanza.attr.from); 294 if thread then
262 local to_node, to_host = jid.split(stanza.attr.to); 295 module:log("debug", "-- msg thread:\n%s", tostring(thread));
263 -- FIXME the format of collections 296 -- module:log("debug", "-- msg body text:\n%s", body:get_text());
264 if from_host == "localhost" then -- FIXME only archive messages of users on this host 297 local from_node, from_host = jid.split(stanza.attr.from);
265 store_msg(stanza, from_node, from_host); 298 local to_node, to_host = jid.split(stanza.attr.to);
266 end 299 -- FIXME only archive messages of users on this host
267 if to_host == "localhost" then 300 if from_host == "localhost" then
268 store_msg(stanza, to_node, to_host); 301 store_msg(stanza, from_node, from_host, true);
302 end
303 if to_host == "localhost" then
304 store_msg(stanza, to_node, to_host, false);
305 end
269 end 306 end
270 end 307 end
271 return nil; 308 return nil;
272 end 309 end
273 310