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 |