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);