diff options
author | Kim Alvefur <zash@zash.se> | 2020-11-30 23:42:13 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2020-11-30 23:42:13 +0100 |
commit | 9e5dbb42176d2d22bd69ffdc872df58a3a17c19f (patch) | |
tree | dd0287ecd90f5259c46619b11862fb9f669e9ff2 | |
parent | af189d81030a05c4bff49acdd6bd7d0770157c5f (diff) | |
download | prosody-9e5dbb42176d2d22bd69ffdc872df58a3a17c19f.tar.gz prosody-9e5dbb42176d2d22bd69ffdc872df58a3a17c19f.zip |
mod_mam: Implement extended MAM metadata query
-rw-r--r-- | plugins/mod_mam/mod_mam.lua | 36 | ||||
-rw-r--r-- | spec/scansion/mam_extended.scs | 14 |
2 files changed, 49 insertions, 1 deletions
diff --git a/plugins/mod_mam/mod_mam.lua b/plugins/mod_mam/mod_mam.lua index f252d179..423a68ca 100644 --- a/plugins/mod_mam/mod_mam.lua +++ b/plugins/mod_mam/mod_mam.lua @@ -229,6 +229,41 @@ module:hook("iq-set/self/"..xmlns_mam..":query", function(event) return true; end); +module:hook("iq-get/self/"..xmlns_mam..":metadata", function (event) + local origin, stanza = event.origin, event.stanza; + + local reply = st.reply(stanza):tag("metadata", { xmlns = xmlns_mam }); + + do + local first = archive:find(origin.username, { limit = 1 }); + if not first then + origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); + return true; + end + + local id, _, when = first(); + if id then + reply:tag("start", { id = id, timestamp = timestamp(when) }):up(); + end + end + + do + local last = archive:find(origin.username, { limit = 1, reverse = true }); + if not last then + origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); + return true; + end + + local id, _, when = last(); + if id then + reply:tag("end", { id = id, timestamp = timestamp(when) }):up(); + end + end + + origin.send(reply); + return true; +end); + local function has_in_roster(user, who) local roster = rm_load_roster(user, host); module:log("debug", "%s has %s in roster? %s", user, who, roster[who] and "yes" or "no"); @@ -522,7 +557,6 @@ module:hook("message/full", message_handler, 0); local advertise_extended = module:get_option_boolean("mam_advertise_extend", false); -- TODO before-id, after-id -- TODO ids --- TODO archive metadata query -- TODO delete feature flag option module:hook("account-disco-info", function(event) diff --git a/spec/scansion/mam_extended.scs b/spec/scansion/mam_extended.scs index 7e291510..a1c50ffc 100644 --- a/spec/scansion/mam_extended.scs +++ b/spec/scansion/mam_extended.scs @@ -36,6 +36,20 @@ Romeo sends: <body>U there?</body> </message> +# Metadata +Romeo sends: + <iq type="get" id="mamextmeta"> + <metadata xmlns="urn:xmpp:mam:2"/> + </iq> + +Romeo receives: + <iq type="result" id="mamextmeta"> + <metadata xmlns="urn:xmpp:mam:2"> + <start timestamp="2008-08-22T21:09:04Z" xmlns="urn:xmpp:mam:2" id="{scansion:any}"/> + <end timestamp="2008-08-22T21:09:04Z" xmlns="urn:xmpp:mam:2" id="{scansion:any}"/> + </metadata> + </iq> + Romeo sends: <iq type="set" id="mamquery1"> <query xmlns="urn:xmpp:mam:2" queryid="q1"/> |