Software /
code /
prosody-modules
Comparison
mod_archive/mod_archive.lua @ 187:670c99e96c52
mod_archive: first commit for manual archiving, need polishing
author | shinysky<shinysky1986(AT)gmail.com> |
---|---|
date | Sun, 27 Jun 2010 14:03:56 +0800 |
parent | 182:43d9e0944276 |
child | 188:5e8ea3733dc6 |
comparison
equal
deleted
inserted
replaced
186:ba3837c565c9 | 187:670c99e96c52 |
---|---|
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'}); | 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); | 64 collection:tag(tag, {secs='0'}):add_child(body); |
65 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); | 65 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); |
66 end | 66 end |
67 | 67 |
68 local function save_result(collection) | |
69 local save = st.stanza('save', {xmlns='urn:xmpp:archive'}); | |
70 local chat = st.stanza('chat', collection.attr); | |
71 save:add_child(chat); | |
72 return save; | |
73 end | |
74 | |
68 ------------------------------------------------------------ | 75 ------------------------------------------------------------ |
69 -- Preferences | 76 -- Preferences |
70 ------------------------------------------------------------ | 77 ------------------------------------------------------------ |
71 local function preferences_handler(event) | 78 local function preferences_handler(event) |
72 local origin, stanza = event.origin, event.stanza; | 79 local origin, stanza = event.origin, event.stanza; |
176 end | 183 end |
177 return true; | 184 return true; |
178 end | 185 end |
179 | 186 |
180 local function itemremove_handler(event) | 187 local function itemremove_handler(event) |
188 -- TODO use 'assert' to check imcoming stanza? | |
189 -- or use pcall() to catch exceptions? | |
181 local origin, stanza = event.origin, event.stanza; | 190 local origin, stanza = event.origin, event.stanza; |
182 if stanza.attr.type ~= "set" then | 191 if stanza.attr.type ~= "set" then |
183 return false; | 192 return false; |
184 end | 193 end |
185 local elem = stanza.tags[1].tags[1]; | 194 local elem = stanza.tags[1].tags[1]; |
272 module:log("debug", "-- stanza:\n%s", tostring(event.stanza)); | 281 module:log("debug", "-- stanza:\n%s", tostring(event.stanza)); |
273 return true; | 282 return true; |
274 end | 283 end |
275 | 284 |
276 local function save_handler(event) | 285 local function save_handler(event) |
277 module:log("debug", "-- stanza:\n%s", tostring(event.stanza)); | 286 local origin, stanza = event.origin, event.stanza; |
287 if stanza.attr.type ~= "set" then | |
288 return false; | |
289 end | |
290 local elem = stanza.tags[1].tags[1]; | |
291 if not elem or elem.name ~= "chat" then | |
292 return false; | |
293 end | |
294 local node, host = origin.username, origin.host; | |
295 local data = dm.list_load(node, host, ARCHIVE_DIR); | |
296 if data then | |
297 for k, v in ipairs(data) do | |
298 local collection = st.deserialize(v); | |
299 if collection.attr["with"] == elem.attr["with"] | |
300 and collection.attr["start"] == elem.attr["start"] then | |
301 -- TODO check if there're duplicates | |
302 for newchild in elem:children() do | |
303 if type(newchild) == "table" then | |
304 collection:add_child(newchild) | |
305 end | |
306 end | |
307 local ver = tonumber(collection.attr["version"]) + 1; | |
308 collection.attr["version"] = tostring(ver); | |
309 collection.attr["subject"] = elem.attr["subject"]; | |
310 origin.send(st.reply(stanza):add_child(save_result(collection))); | |
311 data[k] = collection; | |
312 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); | |
313 return true; | |
314 end | |
315 end | |
316 end | |
317 -- not found, create new collection | |
318 elem.attr["version"] = "0"; | |
319 origin.send(st.reply(stanza):add_child(save_result(elem))); | |
320 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(elem)); | |
321 -- TODO unsuccessful reply | |
278 return true; | 322 return true; |
279 end | 323 end |
280 | 324 |
281 ------------------------------------------------------------ | 325 ------------------------------------------------------------ |
282 -- Message Handler | 326 -- Message Handler |