Mercurial > prosody-modules
comparison mod_archive/mod_archive.lua @ 223:de71a52fc63a
mod_archive: Mapping an message to some collection based on timestamp
author | shinysky<shinysky1986(AT)gmail.com> |
---|---|
date | Sun, 25 Jul 2010 20:55:04 +0800 |
parents | 6e6a08b0531a |
children | 96e29ff5fa07 |
comparison
equal
deleted
inserted
replaced
222:6e6a08b0531a | 223:de71a52fc63a |
---|---|
51 local function store_msg(msg, node, host, isfrom) | 51 local function store_msg(msg, node, host, isfrom) |
52 local body = msg:child_with_name("body"); | 52 local body = msg:child_with_name("body"); |
53 local thread = msg:child_with_name("thread"); | 53 local thread = msg:child_with_name("thread"); |
54 local data = dm.list_load(node, host, ARCHIVE_DIR); | 54 local data = dm.list_load(node, host, ARCHIVE_DIR); |
55 local tag = (isfrom and "from") or "to"; | 55 local tag = (isfrom and "from") or "to"; |
56 local utc = os_time(); | |
56 if data then | 57 if data then |
57 for k, v in ipairs(data) do | 58 if thread then |
58 local collection = st.deserialize(v); | 59 for k, v in ipairs(data) do |
59 if collection.attr["thread"] == thread:get_text() then | 60 local collection = st.deserialize(v); |
60 -- TODO figure out secs | 61 if collection.attr["thread"] == thread:get_text() then |
61 collection:tag(tag, {secs='1', utc=os_time()}):add_child(body); | 62 -- TODO figure out secs |
63 collection:tag(tag, {secs='1', utc=utc}):add_child(body); | |
64 local ver = tonumber(collection.attr["version"]) + 1; | |
65 collection.attr["version"] = tostring(ver); | |
66 collection.attr["access"] = utc; | |
67 data[k] = collection; | |
68 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); | |
69 return; | |
70 end | |
71 end | |
72 else -- if the last collection occurs on the same day, then join it | |
73 -- TODO assuming the collection list are in reverse chronological order | |
74 local collection = st.deserialize(data[1]); | |
75 local difftime = os.difftime(date_parse(utc), date_parse(collection.attr["start"])); | |
76 if difftime < 86400 then -- 60 * 60 * 24 | |
77 collection:tag(tag, {secs='1', utc=utc}):add_child(body); | |
62 local ver = tonumber(collection.attr["version"]) + 1; | 78 local ver = tonumber(collection.attr["version"]) + 1; |
63 collection.attr["version"] = tostring(ver); | 79 collection.attr["version"] = tostring(ver); |
64 collection.attr["access"] = os_time(); | 80 collection.attr["access"] = utc; |
65 data[k] = collection; | 81 data[1] = collection; |
66 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); | 82 dm.list_store(node, host, ARCHIVE_DIR, st.preserialize(data)); |
67 return; | 83 return; |
68 end | 84 end |
69 end | 85 end |
70 end | 86 end |
71 -- not found, create new collection | 87 -- not found, create new collection |
72 local utc = os_time(); | |
73 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}); | 88 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}); |
74 collection:tag(tag, {secs='0', utc=utc}):add_child(body); | 89 collection:tag(tag, {secs='0', utc=utc}):add_child(body); |
75 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); | 90 dm.list_append(node, host, ARCHIVE_DIR, st.preserialize(collection)); |
76 end | 91 end |
77 | 92 |
345 end | 360 end |
346 | 361 |
347 ------------------------------------------------------------ | 362 ------------------------------------------------------------ |
348 -- Archive Management | 363 -- Archive Management |
349 ------------------------------------------------------------ | 364 ------------------------------------------------------------ |
350 local function filter_with(with, coll_with) | 365 local function filter_jid(rule, jid) |
351 return not with or coll_with:find(with); | 366 return not rule or jid.compare(jid, rule); |
352 end | 367 end |
353 | 368 |
354 local function filter_start(start, coll_start) | 369 local function filter_start(start, coll_start) |
355 return not start or start <= coll_start; | 370 return not start or start <= coll_start; |
356 end | 371 end |
376 local resset = {} | 391 local resset = {} |
377 if data then | 392 if data then |
378 for k, v in ipairs(data) do | 393 for k, v in ipairs(data) do |
379 local collection = st.deserialize(v); | 394 local collection = st.deserialize(v); |
380 if collection[1] then -- has children(not deleted) | 395 if collection[1] then -- has children(not deleted) |
381 local res = filter_with(elem.attr["with"], collection.attr["with"]); | 396 local res = filter_jid(elem.attr["with"], collection.attr["with"]); |
382 res = res and filter_start(elem.attr["start"], collection.attr["start"]); | 397 res = res and filter_start(elem.attr["start"], collection.attr["start"]); |
383 res = res and filter_end(elem.attr["end"], collection.attr["start"]); | 398 res = res and filter_end(elem.attr["end"], collection.attr["start"]); |
384 if res then | 399 if res then |
385 table.insert(resset, collection); | 400 table.insert(resset, collection); |
386 end | 401 end |
533 local count = table.getn(data); | 548 local count = table.getn(data); |
534 local found = false; | 549 local found = false; |
535 for i = count, 1, -1 do | 550 for i = count, 1, -1 do |
536 local collection = st.deserialize(data[i]); | 551 local collection = st.deserialize(data[i]); |
537 if collection[1] then -- has children(not deleted) | 552 if collection[1] then -- has children(not deleted) |
538 local res = filter_with(elem.attr["with"], collection.attr["with"]); | 553 local res = filter_jid(elem.attr["with"], collection.attr["with"]); |
539 res = res and filter_start(elem.attr["start"], collection.attr["start"]); | 554 res = res and filter_start(elem.attr["start"], collection.attr["start"]); |
540 res = res and filter_end(elem.attr["end"], collection.attr["start"]); | 555 res = res and filter_end(elem.attr["end"], collection.attr["start"]); |
541 if res then | 556 if res then |
542 -- table.remove(data, i); | 557 -- table.remove(data, i); |
543 local temp = st.stanza('chat', collection.attr); | 558 local temp = st.stanza('chat', collection.attr); |
647 elseif not exactmatch then | 662 elseif not exactmatch then |
648 if tobool(child.attr['exactmatch']) then | 663 if tobool(child.attr['exactmatch']) then |
649 if child.attr[k] == v then | 664 if child.attr[k] == v then |
650 return child; | 665 return child; |
651 end | 666 end |
652 elseif filter_with(child.attr[k], v) then | 667 elseif filter_jid(child.attr[k], v) then |
653 return child; | 668 return child; |
654 end | 669 end |
655 end | 670 end |
656 else | 671 else |
657 return child; | 672 return child; |