Mercurial > prosody-modules
comparison mod_mam_muc/mod_mam_muc.lua @ 1535:efbb047c01e7
mod_mam_muc: Update to XEP-0313 v 0.3
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 22 Oct 2014 21:42:40 +0200 |
parents | 4dd6eebc8fbd |
children | 4fb280768efc |
comparison
equal
deleted
inserted
replaced
1534:4dd6eebc8fbd | 1535:efbb047c01e7 |
---|---|
29 local max_history_length = module:get_option_number("max_history_messages", 1000); | 29 local max_history_length = module:get_option_number("max_history_messages", 1000); |
30 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", max_history_length); | 30 local default_max_items, max_max_items = 20, module:get_option_number("max_archive_query_results", max_history_length); |
31 | 31 |
32 local log_all_rooms = module:get_option_boolean("muc_log_all_rooms", false); | 32 local log_all_rooms = module:get_option_boolean("muc_log_all_rooms", false); |
33 local log_by_default = module:get_option_boolean("muc_log_by_default", true); | 33 local log_by_default = module:get_option_boolean("muc_log_by_default", true); |
34 local advertise_archive = module:get_option_boolean("muc_log_advertise", true); | |
35 | 34 |
36 local archive_store = "archive2"; | 35 local archive_store = "archive2"; |
37 local archive = module:open_store(archive_store, "archive"); | 36 local archive = module:open_store(archive_store, "archive"); |
38 if not archive or archive.name == "null" then | 37 if not archive or archive.name == "null" then |
39 module:log("error", "Could not open archive storage"); | 38 module:log("error", "Could not open archive storage"); |
107 end | 106 end |
108 end | 107 end |
109 end); | 108 end); |
110 end | 109 end |
111 | 110 |
111 local query_form = dataform { | |
112 { name = "FORM_TYPE"; type = "hidden"; value = xmlns_mam; }; | |
113 { name = "with"; type = "jid-single"; }; | |
114 { name = "start"; type = "text-single" }; | |
115 { name = "end"; type = "text-single"; }; | |
116 }; | |
117 | |
118 -- Serve form | |
119 module:hook("iq-get/self/"..xmlns_mam..":query", function(event) | |
120 local origin, stanza = event.origin, event.stanza; | |
121 return origin.send(st.reply(stanza):add_child(query_form:form())); | |
122 end); | |
123 | |
112 -- Handle archive queries | 124 -- Handle archive queries |
113 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) | 125 module:hook("iq-set/bare/"..xmlns_mam..":query", function(event) |
114 local origin, stanza = event.origin, event.stanza; | 126 local origin, stanza = event.origin, event.stanza; |
115 local room = stanza.attr.to; | 127 local room = stanza.attr.to; |
116 local room_node = jid_split(room); | 128 local room_node = jid_split(room); |
117 local orig_from = stanza.attr.from; | 129 local orig_from = stanza.attr.from; |
118 local query = stanza.tags[1]; | 130 local query = stanza.tags[1]; |
131 end | 143 end |
132 | 144 |
133 local qid = query.attr.queryid; | 145 local qid = query.attr.queryid; |
134 | 146 |
135 -- Search query parameters | 147 -- Search query parameters |
136 local qstart = query:get_child_text("start"); | 148 local qwith, qstart, qend; |
137 local qend = query:get_child_text("end"); | 149 local form = query:get_child("x", "jabber:x:data"); |
138 module:log("debug", "Archive query, id %s from %s until %s)", | 150 if form then |
139 tostring(qid), qstart or "the dawn of time", qend or "now"); | 151 local err; |
152 form, err = query_form:data(form); | |
153 if err then | |
154 return origin.send(st.error_reply(stanza, "modify", "bad-request", select(2, next(err)))) | |
155 end | |
156 qwith, qstart, qend = form["with"], form["start"], form["end"]; | |
157 qwith = qwith and jid_bare(qwith); -- dataforms does jidprep | |
158 end | |
140 | 159 |
141 if qstart or qend then -- Validate timestamps | 160 if qstart or qend then -- Validate timestamps |
142 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend)) | 161 local vstart, vend = (qstart and timestamp_parse(qstart)), (qend and timestamp_parse(qend)) |
143 if (qstart and not vstart) or (qend and not vend) then | 162 if (qstart and not vstart) or (qend and not vend) then |
144 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp")) | 163 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid timestamp")) |
167 if not data then | 186 if not data then |
168 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); | 187 return origin.send(st.error_reply(stanza, "cancel", "internal-server-error")); |
169 end | 188 end |
170 local count = err; | 189 local count = err; |
171 | 190 |
191 origin.send(st.reply(stanza)) | |
172 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; | 192 local msg_reply_attr = { to = stanza.attr.from, from = stanza.attr.to }; |
173 | 193 |
174 -- Wrap it in stuff and deliver | 194 -- Wrap it in stuff and deliver |
175 local fwd_st, first, last; | 195 local fwd_st, first, last; |
176 for id, item, when in data do | 196 for id, item, when in data do |
192 end | 212 end |
193 -- That's all folks! | 213 -- That's all folks! |
194 module:log("debug", "Archive query %s completed", tostring(qid)); | 214 module:log("debug", "Archive query %s completed", tostring(qid)); |
195 | 215 |
196 if reverse then first, last = last, first; end | 216 if reverse then first, last = last, first; end |
197 return origin.send(st.reply(stanza) | 217 return origin.send(st.message(msg_reply_attr) |
198 :query(xmlns_mam):add_child(rsm.generate { | 218 :tag("fin", { xmlns = xmlns_mam, queryid = qid }) |
199 first = first, last = last, count = count })); | 219 :add_child(rsm.generate { |
220 first = first, last = last, count = count })); | |
200 end); | 221 end); |
201 | 222 |
202 function send_history(self, to, stanza) | 223 function send_history(self, to, stanza) |
203 local maxchars, maxstanzas, seconds, since; | 224 local maxchars, maxstanzas, seconds, since; |
204 local history_tag = stanza:find("{http://jabber.org/protocol/muc}x/history") | 225 local history_tag = stanza:find("{http://jabber.org/protocol/muc}x/history") |
262 -- And stash it | 283 -- And stash it |
263 local with = stanza.name | 284 local with = stanza.name |
264 if stanza.attr.type then | 285 if stanza.attr.type then |
265 with = with .. "<" .. stanza.attr.type | 286 with = with .. "<" .. stanza.attr.type |
266 end | 287 end |
267 local ok, id = archive:append(room, nil, time_now(), with, stanza); | 288 archive:append(room, nil, time_now(), with, stanza); |
268 if ok and advertise_archive then | |
269 stanza:tag("archived", { xmlns = xmlns_mam, by = jid_bare(orig_to), id = id }):up(); | |
270 end | |
271 end | 289 end |
272 | 290 |
273 module:hook("muc-room-destroyed", function(event) | 291 module:hook("muc-room-destroyed", function(event) |
274 archive:delete(jid_split(event.room.jid)); | 292 archive:delete(jid_split(event.room.jid)); |
275 end); | 293 end); |