comparison mod_archive/mod_archive.lua @ 209:254c13e049f7

mod_archive: added a 'access' attribute to the chat element, representing the time last accessed.
author shinysky<shinysky1986(AT)gmail.com>
date Tue, 13 Jul 2010 23:24:49 +0800
parents 27b8a7482149
children 2d63d50d9713
comparison
equal deleted inserted replaced
208:214cb85cdfbf 209:254c13e049f7
53 if collection.attr["thread"] == thread:get_text() then 53 if collection.attr["thread"] == thread:get_text() then
54 -- TODO figure out secs 54 -- TODO figure out secs
55 collection:tag(tag, {secs='1', utc=os_time()}):add_child(body); 55 collection:tag(tag, {secs='1', utc=os_time()}):add_child(body);
56 local ver = tonumber(collection.attr["version"]) + 1; 56 local ver = tonumber(collection.attr["version"]) + 1;
57 collection.attr["version"] = tostring(ver); 57 collection.attr["version"] = tostring(ver);
58 collection.attr["access"] = os_time();
58 data[k] = collection; 59 data[k] = collection;
59 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); 60 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
60 return; 61 return;
61 end 62 end
62 end 63 end
63 end 64 end
64 -- not found, create new collection 65 -- not found, create new collection
65 local utc = os_time(); 66 local utc = os_time();
66 local collection = st.stanza('chat', {with = isfrom and msg.attr.to or msg.attr.from, start=utc, thread=thread:get_text(), version='0'}); 67 local collection = st.stanza('chat', {with = isfrom and msg.attr.to or msg.attr.from, start=utc, thread=thread:get_text(), version='0', access=utc});
67 collection:tag(tag, {secs='0', utc=utc}):add_child(body); 68 collection:tag(tag, {secs='0', utc=utc}):add_child(body);
68 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); 69 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection));
69 end 70 end
70 71
71 local function save_result(collection) 72 local function save_result(collection)
305 end 306 end
306 end 307 end
307 local ver = tonumber(collection.attr["version"]) + 1; 308 local ver = tonumber(collection.attr["version"]) + 1;
308 collection.attr["version"] = tostring(ver); 309 collection.attr["version"] = tostring(ver);
309 collection.attr["subject"] = elem.attr["subject"]; 310 collection.attr["subject"] = elem.attr["subject"];
311 collection.attr["access"] = os_time();
310 origin.send(st.reply(stanza):add_child(save_result(collection))); 312 origin.send(st.reply(stanza):add_child(save_result(collection)));
311 data[k] = collection; 313 data[k] = collection;
312 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); 314 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
313 return true; 315 return true;
314 end 316 end
315 end 317 end
316 end 318 end
317 -- not found, create new collection 319 -- not found, create new collection
318 elem.attr["version"] = "0"; 320 elem.attr["version"] = "0";
321 elem.attr["access"] = os_time();
319 origin.send(st.reply(stanza):add_child(save_result(elem))); 322 origin.send(st.reply(stanza):add_child(save_result(elem)));
320 -- TODO check if elem is valid(?) 323 -- TODO check if elem is valid(?)
321 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(elem)); 324 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(elem));
322 -- TODO unsuccessful reply 325 -- TODO unsuccessful reply
323 return true; 326 return true;
354 local elem = stanza.tags[1]; 357 local elem = stanza.tags[1];
355 local resset = {} 358 local resset = {}
356 if data then 359 if data then
357 for k, v in ipairs(data) do 360 for k, v in ipairs(data) do
358 local collection = st.deserialize(v); 361 local collection = st.deserialize(v);
359 local res = filter_with(elem.attr["with"], collection.attr["with"]); 362 if collection[1] then -- has children(not deleted)
360 res = res and filter_start(elem.attr["start"], collection.attr["start"]); 363 local res = filter_with(elem.attr["with"], collection.attr["with"]);
361 res = res and filter_end(elem.attr["end"], collection.attr["start"]); 364 res = res and filter_start(elem.attr["start"], collection.attr["start"]);
362 if res then 365 res = res and filter_end(elem.attr["end"], collection.attr["start"]);
363 table.insert(resset, collection); 366 if res then
367 table.insert(resset, collection);
368 end
364 end 369 end
365 end 370 end
366 end 371 end
367 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); 372 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'});
368 local count = table.getn(resset); 373 local count = table.getn(resset);
426 local elem = stanza.tags[1]; 431 local elem = stanza.tags[1];
427 local collection = nil; 432 local collection = nil;
428 if data then 433 if data then
429 for k, v in ipairs(data) do 434 for k, v in ipairs(data) do
430 local c = st.deserialize(v); 435 local c = st.deserialize(v);
431 if c.attr["with"] == elem.attr["with"] 436 if c[1] -- not deleted
437 and c.attr["with"] == elem.attr["with"]
432 and c.attr["start"] == elem.attr["start"] then 438 and c.attr["start"] == elem.attr["start"] then
433 collection = c; 439 collection = c;
434 break; 440 break;
435 end 441 end
436 end 442 end
508 if data then 514 if data then
509 local count = table.getn(data); 515 local count = table.getn(data);
510 local found = false; 516 local found = false;
511 for i = count, 1, -1 do 517 for i = count, 1, -1 do
512 local collection = st.deserialize(data[i]); 518 local collection = st.deserialize(data[i]);
513 local res = filter_with(elem.attr["with"], collection.attr["with"]); 519 if collection[1] then -- has children(not deleted)
514 res = res and filter_start(elem.attr["start"], collection.attr["start"]); 520 local res = filter_with(elem.attr["with"], collection.attr["with"]);
515 res = res and filter_end(elem.attr["end"], collection.attr["start"]); 521 res = res and filter_start(elem.attr["start"], collection.attr["start"]);
516 if res then 522 res = res and filter_end(elem.attr["end"], collection.attr["start"]);
517 module:log("debug", "-- removing:\n%s", tostring(collection)); 523 if res then
518 table.remove(data, i); 524 -- table.remove(data, i);
519 found = true; 525 local temp = st.stanza('chat', collection.attr);
526 temp.attr["access"] = os_time();
527 data[i] = temp;
528 found = true;
529 end
520 end 530 end
521 end 531 end
522 if found then 532 if found then
523 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); 533 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data));
524 else 534 else