Software /
code /
prosody-modules
Comparison
mod_mam_muc/mod_mam_muc.lua @ 1691:1a8c791d365f
mod_mam_muc: d20cfc5ba827 .. cd87a2eba8f2 here too (uh, duplicated code)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 03 May 2015 14:05:43 +0200 |
parent | 1679:c77e9522dc66 |
child | 1865:db8b256f51ff |
comparison
equal
deleted
inserted
replaced
1690:8c0fbc685364 | 1691:1a8c791d365f |
---|---|
137 }; | 137 }; |
138 | 138 |
139 -- Serve form | 139 -- Serve form |
140 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) | 140 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) |
141 local origin, stanza = event.origin, event.stanza; | 141 local origin, stanza = event.origin, event.stanza; |
142 return origin.send(st.reply(stanza):add_child(query_form:form())); | 142 origin.send(st.reply(stanza):add_child(query_form:form())); |
143 return true; | |
143 end); | 144 end); |
144 | 145 |
145 -- Handle archive queries | 146 -- Handle archive queries |
146 module:hook("iq-set/bare/"..xmlns_mam..":query", function(event) | 147 module:hook("iq-set/bare/"..xmlns_mam..":query", function(event) |
147 local origin, stanza = event.origin, event.stanza; | 148 local origin, stanza = event.origin, event.stanza; |
170 local form = query:get_child("x", "jabber:x:data"); | 171 local form = query:get_child("x", "jabber:x:data"); |
171 if form then | 172 if form then |
172 local err; | 173 local err; |
173 form, err = query_form:data(form); | 174 form, err = query_form:data(form); |
174 if err then | 175 if err then |
175 return origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))) | 176 origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))); |
177 return true; | |
176 end | 178 end |
177 qstart, qend = form["start"], form["end"]; | 179 qstart, qend = form["start"], form["end"]; |
178 end | 180 end |
179 | 181 |
180 if qstart or qend then -- Validate timestamps | 182 if qstart or qend then -- Validate timestamps |
195 if type(before) ~= "string" then before = nil; end | 197 if type(before) ~= "string" then before = nil; end |
196 | 198 |
197 -- Load all the data! | 199 -- Load all the data! |
198 local data, err = archive:find(room_node, { | 200 local data, err = archive:find(room_node, { |
199 start = qstart; ["end"] = qend; -- Time range | 201 start = qstart; ["end"] = qend; -- Time range |
200 limit = qmax; | 202 limit = qmax + 1; |
201 before = before; after = after; | 203 before = before; after = after; |
202 reverse = reverse; | 204 reverse = reverse; |
203 total = true; | 205 total = true; |
204 with = "message<groupchat"; | 206 with = "message<groupchat"; |
205 }); | 207 }); |
206 | 208 |
207 if not data then | 209 if not data then |
208 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); | 210 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); |
209 end | 211 end |
210 local count = err; | 212 local total = err; |
211 | 213 |
212 origin.send(st.reply(stanza)) | 214 origin.send(st.reply(stanza)) |
213 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; | 215 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; |
214 | 216 |
217 local results = {}; | |
218 | |
215 -- Wrap it in stuff and deliver | 219 -- Wrap it in stuff and deliver |
216 local fwd_st, first, last; | 220 local first, last; |
221 local count = 0; | |
222 local complete = "true"; | |
217 for id, item, when in data do | 223 for id, item, when in data do |
218 fwd_st = st.message(msg_reply_attr) | 224 count = count + 1; |
225 if count > qmax then | |
226 complete = nil; | |
227 break; | |
228 end | |
229 local fwd_st = st.message(msg_reply_attr) | |
219 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }) | 230 :tag("result", { xmlns = xmlns_mam, queryid = qid, id = id }) |
220 :tag("forwarded", { xmlns = xmlns_forward }) | 231 :tag("forwarded", { xmlns = xmlns_forward }) |
221 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); | 232 :tag("delay", { xmlns = xmlns_delay, stamp = timestamp(when) }):up(); |
222 | 233 |
223 if not is_stanza(item) then | 234 if not is_stanza(item) then |
227 fwd_st:add_child(item); | 238 fwd_st:add_child(item); |
228 | 239 |
229 if not first then first = id; end | 240 if not first then first = id; end |
230 last = id; | 241 last = id; |
231 | 242 |
232 origin.send(fwd_st); | 243 if reverse then |
233 end | 244 results[count] = fwd_st; |
245 else | |
246 origin.send(fwd_st); | |
247 end | |
248 end | |
249 if reverse then | |
250 for i = #results, 1, -1 do | |
251 origin.send(results[i]); | |
252 end | |
253 end | |
254 | |
234 -- That's all folks! | 255 -- That's all folks! |
235 module:log("debug", "Archive query %s completed", tostring(qid)); | 256 module:log("debug", "Archive query %s completed", tostring(qid)); |
236 | 257 |
237 if reverse then first, last = last, first; end | 258 if reverse then first, last = last, first; end |
238 return origin.send(st.message(msg_reply_attr) | 259 origin.send(st.message(msg_reply_attr) |
239 :tag("fin", { xmlns = xmlns_mam, queryid = qid }) | 260 :tag("fin", { xmlns = xmlns_mam, queryid = qid, complete = complete }) |
240 :add_child(rsm.generate { | 261 :add_child(rsm.generate { |
241 first = first, last = last, count = count })); | 262 first = first, last = last, count = total })); |
263 return true; | |
242 end); | 264 end); |
243 | 265 |
244 module:hook("muc-get-history", function (event) | 266 module:hook("muc-get-history", function (event) |
245 local room = event.room; | 267 local room = event.room; |
246 if not logging_enabled(room) then return end | 268 if not logging_enabled(room) then return end |