Mercurial > prosody-modules
comparison mod_archive/mod_archive.lua @ 210:2d63d50d9713
mod_archive: Replication is done!
| author | shinysky<shinysky1986(AT)gmail.com> |
|---|---|
| date | Wed, 14 Jul 2010 16:49:38 +0800 |
| parents | 254c13e049f7 |
| children | 1861290055c0 |
comparison
equal
deleted
inserted
replaced
| 209:254c13e049f7 | 210:2d63d50d9713 |
|---|---|
| 11 local datetime = require "util.datetime"; | 11 local datetime = require "util.datetime"; |
| 12 | 12 |
| 13 local PREFS_DIR = "archive_prefs"; | 13 local PREFS_DIR = "archive_prefs"; |
| 14 local ARCHIVE_DIR = "archive"; | 14 local ARCHIVE_DIR = "archive"; |
| 15 local xmlns_rsm = "http://jabber.org/protocol/rsm"; | 15 local xmlns_rsm = "http://jabber.org/protocol/rsm"; |
| 16 local DEFAULT_MAX = 100; | |
| 16 | 17 |
| 17 module:add_feature("urn:xmpp:archive"); | 18 module:add_feature("urn:xmpp:archive"); |
| 18 module:add_feature("urn:xmpp:archive:auto"); | 19 module:add_feature("urn:xmpp:archive:auto"); |
| 19 module:add_feature("urn:xmpp:archive:manage"); | 20 module:add_feature("urn:xmpp:archive:manage"); |
| 20 module:add_feature("urn:xmpp:archive:manual"); | 21 module:add_feature("urn:xmpp:archive:manual"); |
| 372 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); | 373 local reply = st.reply(stanza):tag('list', {xmlns='urn:xmpp:archive'}); |
| 373 local count = table.getn(resset); | 374 local count = table.getn(resset); |
| 374 if count > 0 then | 375 if count > 0 then |
| 375 local max = elem.tags[1]:child_with_name("max"); | 376 local max = elem.tags[1]:child_with_name("max"); |
| 376 if max then | 377 if max then |
| 377 max = tonumber(max:get_text()) or 100; | 378 max = tonumber(max:get_text()) or DEFAULT_MAX; |
| 378 else max = 100; end | 379 else max = DEFAULT_MAX; end |
| 379 local after = elem.tags[1]:child_with_name("after"); | 380 local after = elem.tags[1]:child_with_name("after"); |
| 380 local before = elem.tags[1]:child_with_name("before"); | 381 local before = elem.tags[1]:child_with_name("before"); |
| 381 local index = elem.tags[1]:child_with_name("index"); | 382 local index = elem.tags[1]:child_with_name("index"); |
| 382 local s, e = 1, 1+max; | 383 local s, e = 1, 1+max; |
| 383 if after then | 384 if after then |
| 456 local reply = st.reply(stanza):tag('chat', collection.attr); | 457 local reply = st.reply(stanza):tag('chat', collection.attr); |
| 457 local count = table.getn(resset); | 458 local count = table.getn(resset); |
| 458 if count > 0 then | 459 if count > 0 then |
| 459 local max = elem.tags[1]:child_with_name("max"); | 460 local max = elem.tags[1]:child_with_name("max"); |
| 460 if max then | 461 if max then |
| 461 max = tonumber(max:get_text()) or 100; | 462 max = tonumber(max:get_text()) or DEFAULT_MAX; |
| 462 else max = 100; end | 463 else max = DEFAULT_MAX; end |
| 463 local after = elem.tags[1]:child_with_name("after"); | 464 local after = elem.tags[1]:child_with_name("after"); |
| 464 local before = elem.tags[1]:child_with_name("before"); | 465 local before = elem.tags[1]:child_with_name("before"); |
| 465 local index = elem.tags[1]:child_with_name("index"); | 466 local index = elem.tags[1]:child_with_name("index"); |
| 466 local s, e = 1, 1+max; | 467 local s, e = 1, 1+max; |
| 467 if after then | 468 if after then |
| 542 | 543 |
| 543 ------------------------------------------------------------ | 544 ------------------------------------------------------------ |
| 544 -- Replication | 545 -- Replication |
| 545 ------------------------------------------------------------ | 546 ------------------------------------------------------------ |
| 546 local function modified_handler(event) | 547 local function modified_handler(event) |
| 547 module:log("debug", "-- stanza:\n%s", tostring(event.stanza)); | 548 local origin, stanza = event.origin, event.stanza; |
| 549 local node, host = origin.username, origin.host; | |
| 550 local data = dm.list_load(node, host, ARCHIVE_DIR); | |
| 551 local elem = stanza.tags[1]; | |
| 552 local resset = {} | |
| 553 if data then | |
| 554 for k, v in ipairs(data) do | |
| 555 local collection = st.deserialize(v); | |
| 556 local res = filter_start(elem.attr["start"], collection.attr["access"]); | |
| 557 if res then | |
| 558 table.insert(resset, collection); | |
| 559 end | |
| 560 end | |
| 561 end | |
| 562 local reply = st.reply(stanza):tag('modified', {xmlns='urn:xmpp:archive'}); | |
| 563 local count = table.getn(resset); | |
| 564 if count > 0 then | |
| 565 local max = elem.tags[1]:child_with_name("max"); | |
| 566 if max then | |
| 567 max = tonumber(max:get_text()) or DEFAULT_MAX; | |
| 568 else max = DEFAULT_MAX; end | |
| 569 local after = elem.tags[1]:child_with_name("after"); | |
| 570 local before = elem.tags[1]:child_with_name("before"); | |
| 571 local index = elem.tags[1]:child_with_name("index"); | |
| 572 local s, e = 1, 1+max; | |
| 573 if after then | |
| 574 after = after:get_text(); | |
| 575 s = find_coll(resset, after); | |
| 576 if not s then -- not found | |
| 577 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | |
| 578 return true; | |
| 579 end | |
| 580 s = s + 1; | |
| 581 e = s + max; | |
| 582 elseif before then | |
| 583 before = before:get_text(); | |
| 584 if not before or before == '' then -- the last page | |
| 585 e = count + 1; | |
| 586 s = e - max; | |
| 587 else | |
| 588 e = find_coll(resset, before); | |
| 589 if not e then -- not found | |
| 590 origin.send(st.error_reply(stanza, "cancel", "item-not-found")); | |
| 591 return true; | |
| 592 end | |
| 593 s = e - max; | |
| 594 end | |
| 595 elseif index then | |
| 596 s = tonumber(index:get_text()) + 1; -- 0-based | |
| 597 e = s + max; | |
| 598 end | |
| 599 if s < 1 then s = 1; end | |
| 600 if e > count + 1 then e = count + 1; end | |
| 601 -- Assuming result set is sorted. | |
| 602 for i = s, e-1 do | |
| 603 if resset[i][1] then | |
| 604 reply:add_child(st.stanza('changed', resset[i].attr)); | |
| 605 else | |
| 606 reply:add_child(st.stanza('removed', resset[i].attr)); | |
| 607 end | |
| 608 end | |
| 609 local set = st.stanza('set', {xmlns = xmlns_rsm}); | |
| 610 if s <= e-1 then | |
| 611 set:tag('first', {index=s-1}):text(gen_uid(resset[s])):up() | |
| 612 :tag('last'):text(gen_uid(resset[e-1])):up(); | |
| 613 end | |
| 614 set:tag('count'):text(tostring(count)):up(); | |
| 615 reply:add_child(set); | |
| 616 end | |
| 617 origin.send(reply); | |
| 548 return true; | 618 return true; |
| 549 end | 619 end |
| 550 | 620 |
| 551 ------------------------------------------------------------ | 621 ------------------------------------------------------------ |
| 552 -- Message Handler | 622 -- Message Handler |
