Software / code / prosody-modules
Comparison
mod_mam/mod_mam.lua @ 903:8a1beff848c1
mod_mam: Implemented an empty <before/>, to request the last n items in the archive.
| author | Thijs Alkemade <thijsalkemade@gmail.com> |
|---|---|
| date | Sun, 27 Jan 2013 17:34:16 +0100 |
| parent | 808:ba2e207e1fb7 |
| child | 982:ce8bb0386d08 |
comparison
equal
deleted
inserted
replaced
| 902:490cb9161c81 | 903:8a1beff848c1 |
|---|---|
| 21 local rm_load_roster = require "core.rostermanager".load_roster; | 21 local rm_load_roster = require "core.rostermanager".load_roster; |
| 22 | 22 |
| 23 local tostring = tostring; | 23 local tostring = tostring; |
| 24 local time_now = os.time; | 24 local time_now = os.time; |
| 25 local m_min = math.min; | 25 local m_min = math.min; |
| 26 local t_insert = table.insert; | |
| 26 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse; | 27 local timestamp, timestamp_parse = require "util.datetime".datetime, require "util.datetime".parse; |
| 27 local uuid = require "util.uuid".generate; | 28 local uuid = require "util.uuid".generate; |
| 28 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50); | 29 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", 50); |
| 29 local global_default_policy = module:get_option("default_archive_policy", false); | 30 local global_default_policy = module:get_option("default_archive_policy", false); |
| 30 -- TODO Should be possible to enforce it too | 31 -- TODO Should be possible to enforce it too |
| 163 local qmax = m_min(qset and qset.max or default_max_items, max_max_items); | 164 local qmax = m_min(qset and qset.max or default_max_items, max_max_items); |
| 164 local qset_matches = not (qset and qset.after); | 165 local qset_matches = not (qset and qset.after); |
| 165 local first, last, index; | 166 local first, last, index; |
| 166 local n = 0; | 167 local n = 0; |
| 167 local start = qset and qset.index or 1; | 168 local start = qset and qset.index or 1; |
| 169 local results = {}; | |
| 170 -- An empty <before/> means: give the last n items. So we loop backwards. | |
| 171 local reverse = qset and qset.before or false; | |
| 168 | 172 |
| 169 module:log("debug", "Loaded %d items, about to filter", #data); | 173 module:log("debug", "Loaded %d items, about to filter", #data); |
| 170 for i=start,#data do | 174 for i=(reverse and #data or start),(reverse and start or #data),(reverse and -1 or 1) do |
| 171 local item = data[i]; | 175 local item = data[i]; |
| 172 local when, with, resource = item.when, item.with, item.resource; | 176 local when, with, resource = item.when, item.with, item.resource; |
| 173 local id = item.id; | 177 local id = item.id; |
| 174 --module:log("debug", "id is %s", id); | 178 --module:log("debug", "id is %s", id); |
| 175 | 179 |
| 193 :tag("forwarded", { xmlns = xmlns_forward }) | 197 :tag("forwarded", { xmlns = xmlns_forward }) |
| 194 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); | 198 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); |
| 195 local orig_stanza = st.deserialize(item.stanza); | 199 local orig_stanza = st.deserialize(item.stanza); |
| 196 orig_stanza.attr.xmlns = "jabber:client"; | 200 orig_stanza.attr.xmlns = "jabber:client"; |
| 197 fwd_st:add_child(orig_stanza); | 201 fwd_st:add_child(orig_stanza); |
| 198 origin.send(fwd_st); | 202 if reverse then |
| 203 t_insert(results, 1, fwd_st); | |
| 204 else | |
| 205 results[#results + 1] = fwd_st; | |
| 206 end | |
| 199 if not first then | 207 if not first then |
| 200 index = i; | 208 index = i; |
| 201 first = id; | 209 first = id; |
| 202 end | 210 end |
| 203 last = id; | 211 last = id; |
| 217 if n >= qmax then | 225 if n >= qmax then |
| 218 module:log("debug", "Max number of items matched"); | 226 module:log("debug", "Max number of items matched"); |
| 219 break | 227 break |
| 220 end | 228 end |
| 221 end | 229 end |
| 230 for _,v in pairs(results) do | |
| 231 origin.send(v); | |
| 232 end | |
| 222 -- That's all folks! | 233 -- That's all folks! |
| 223 module:log("debug", "Archive query %s completed", tostring(qid)); | 234 module:log("debug", "Archive query %s completed", tostring(qid)); |
| 224 | 235 |
| 225 local reply = st.reply(stanza); | 236 local reply = st.reply(stanza); |
| 226 if last then | 237 if last then |
| 227 -- This is a bit redundant, isn't it? | 238 -- This is a bit redundant, isn't it? |
| 228 reply:query(xmlns_mam):add_child(rsm.generate{first = first, last = last, count = n}); | 239 reply:query(xmlns_mam):add_child(rsm.generate{first = (reverse and last or first), last = (reverse and first or last), count = n}); |
| 229 end | 240 end |
| 230 origin.send(reply); | 241 origin.send(reply); |
| 231 return true | 242 return true |
| 232 end | 243 end |
| 233 end); | 244 end); |