Comparison

mod_http_muc_log/mod_http_muc_log.lua @ 3485:181561d0aae5

mod_http_muc_log: Add functionality for hiding joins and parts For Guus
author Kim Alvefur <zash@zash.se>
date Wed, 13 Mar 2019 22:47:08 +0100
parent 3283:97b8b07ae1d1
child 3486:887ce59cf396
comparison
equal deleted inserted replaced
3484:ce89fabb1f02 3485:181561d0aae5
3 local jid_split = require"util.jid".split; 3 local jid_split = require"util.jid".split;
4 local nodeprep = require"util.encodings".stringprep.nodeprep; 4 local nodeprep = require"util.encodings".stringprep.nodeprep;
5 local it = require"util.iterators"; 5 local it = require"util.iterators";
6 local url = require"socket.url"; 6 local url = require"socket.url";
7 local os_time, os_date = os.time, os.date; 7 local os_time, os_date = os.time, os.date;
8 local httplib = require "util.http";
8 local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape); 9 local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape);
9 10
10 local archive = module:open_store("muc_log", "archive"); 11 local archive = module:open_store("muc_log", "archive");
11 12
12 -- Support both old and new MUC code 13 -- Support both old and new MUC code
107 return iter(); 108 return iter();
108 end 109 end
109 110
110 local lazy = module:get_option_boolean(module.name .. "_lazy_calendar", true); 111 local lazy = module:get_option_boolean(module.name .. "_lazy_calendar", true);
111 112
113 local function hide_presence(request)
114 if request.url.query then
115 local data = httplib.formdecode(request.url.query);
116 if data then
117 return data.p == "h"
118 end
119 end
120 return false;
121 end
122
112 -- Produce the calendar view 123 -- Produce the calendar view
113 local function years_page(event, path) 124 local function years_page(event, path)
114 local response = event.response; 125 local request, response = event.request, event.response;
115 126
116 local room = nodeprep(path:match("^(.*)/$")); 127 local room = nodeprep(path:match("^(.*)/$"));
117 local is_open = open_room(room); 128 local is_open = open_room(room);
118 if is_open == nil then 129 if is_open == nil then
119 return -- implicit 404 130 return -- implicit 404
202 213
203 response.headers.content_type = "text/html; charset=utf-8"; 214 response.headers.content_type = "text/html; charset=utf-8";
204 return render(template, { 215 return render(template, {
205 title = get_room(room):get_name(); 216 title = get_room(room):get_name();
206 jid = get_room(room).jid; 217 jid = get_room(room).jid;
218 hide_presence = hide_presence(request);
207 years = years; 219 years = years;
208 links = { 220 links = {
209 { href = "../", rel = "up", text = "Room list" }, 221 { href = "../", rel = "up", text = "Room list" },
210 }; 222 };
211 }); 223 });
212 end 224 end
213 225
214 -- Produce the chat log view 226 -- Produce the chat log view
215 local function logs_page(event, path) 227 local function logs_page(event, path)
216 local response = event.response; 228 local request, response = event.request, event.response;
217 229
218 -- FIXME In the year, 105105, if MUC is still alive, 230 -- FIXME In the year, 105105, if MUC is still alive,
219 -- if Prosody can survive... Enjoy this Y10k bug 231 -- if Prosody can survive... Enjoy this Y10k bug
220 local room, date = path:match("^(.-)/(%d%d%d%d%-%d%d%-%d%d)$"); 232 local room, date = path:match("^(.-)/(%d%d%d%d%-%d%d%-%d%d)$");
221 room = nodeprep(room); 233 room = nodeprep(room);
232 244
233 local logs, i = {}, 1; 245 local logs, i = {}, 1;
234 local iter, err = archive:find(room, { 246 local iter, err = archive:find(room, {
235 ["start"] = day_start; 247 ["start"] = day_start;
236 ["end"] = day_start + 86399; 248 ["end"] = day_start + 86399;
249 ["with"] = hide_presence(request) and "message<groupchat" or nil;
237 }); 250 });
238 if not iter then 251 if not iter then
239 module:log("warn", "Could not search archive: %s", err or "no error"); 252 module:log("warn", "Could not search archive: %s", err or "no error");
240 return 500; 253 return 500;
241 end 254 end
302 315
303 response.headers.content_type = "text/html; charset=utf-8"; 316 response.headers.content_type = "text/html; charset=utf-8";
304 return render(template, { 317 return render(template, {
305 title = ("%s - %s"):format(get_room(room):get_name(), date); 318 title = ("%s - %s"):format(get_room(room):get_name(), date);
306 jid = get_room(room).jid; 319 jid = get_room(room).jid;
320 hide_presence = hide_presence(request);
307 lines = logs; 321 lines = logs;
308 links = { 322 links = {
309 { href = "./", rel = "up", text = "Calendar" }, 323 { href = "./", rel = "up", text = "Calendar" },
310 { href = prev_when, rel = "prev", text = prev_when}, 324 { href = prev_when, rel = "prev", text = prev_when},
311 { href = next_when, rel = "next", text = next_when}, 325 { href = next_when, rel = "next", text = next_when},
312 }; 326 };
313 }); 327 });
314 end 328 end
315 329
316 local function list_rooms(event) 330 local function list_rooms(event)
317 local response = event.response; 331 local request, response = event.request, event.response;
318 local room_list, i = {}, 1; 332 local room_list, i = {}, 1;
319 for room in each_room() do 333 for room in each_room() do
320 if not (room.get_hidden or room.is_hidden)(room) then 334 if not (room.get_hidden or room.is_hidden)(room) then
321 room_list[i], i = { 335 room_list[i], i = {
322 href = get_link(jid_split(room.jid), nil); 336 href = get_link(jid_split(room.jid), nil);
328 342
329 response.headers.content_type = "text/html; charset=utf-8"; 343 response.headers.content_type = "text/html; charset=utf-8";
330 return render(template, { 344 return render(template, {
331 title = module:get_option_string("name", "Prosody Chatrooms"); 345 title = module:get_option_string("name", "Prosody Chatrooms");
332 jid = module.host; 346 jid = module.host;
347 hide_presence = hide_presence(request);
333 rooms = room_list; 348 rooms = room_list;
334 }); 349 });
335 end 350 end
336 351
337 module:provides("http", { 352 module:provides("http", {