mod_http_muc_log/mod_http_muc_log.lua
author Kim Alvefur <zash@zash.se>
Sun, 25 Jun 2023 16:27:55 +0200
changeset 5575 ca3c2d11823c
parent 5122 7bce75e74f86
child 5585 df483d9056f5
permissions -rw-r--r--
mod_pubsub_feeds: Track latest timestamp seen in feeds instead of last poll This should ensure that an entry that has a publish timestmap after the previously oldest post, but before the time of the last poll check, is published to the node. Previously if an entry would be skipped if it was published at 13:00 with a timestamp of 12:30, where the last poll was at 12:45. For feeds that lack a timestamp, it now looks for the first post that is not published, assuming that the feed is in reverse chronological order, then iterates back up from there.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
     1
local mt = require"util.multitable";
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local datetime = require"util.datetime";
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local jid_split = require"util.jid".split;
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local nodeprep = require"util.encodings".stringprep.nodeprep;
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
     5
local url = require"socket.url";
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
     6
local os_time, os_date = os.time, os.date;
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
     7
local httplib = require "util.http";
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
     8
local render_funcs = {};
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
     9
local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape, render_funcs);
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
1571
eed7db9f3157 mod_mam_muc, mod_http_muc_log: Change store name from 'archive2' to 'muc_log' to distinguish it from personal MAM archives. Old data will require migration.
Kim Alvefur <zash@zash.se>
parents: 1564
diff changeset
    11
local archive = module:open_store("muc_log", "archive");
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
4974
8c7b7db69f5b mod_http_muc_log: Drop support for pre-0.11 MUC API
Kim Alvefur <zash@zash.se>
parents: 4967
diff changeset
    13
-- Prosody 0.11+ MUC API
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local mod_muc = module:depends"muc";
4974
8c7b7db69f5b mod_http_muc_log: Drop support for pre-0.11 MUC API
Kim Alvefur <zash@zash.se>
parents: 4967
diff changeset
    15
local each_room = mod_muc.each_room;
8c7b7db69f5b mod_http_muc_log: Drop support for pre-0.11 MUC API
Kim Alvefur <zash@zash.se>
parents: 4967
diff changeset
    16
local get_room_from_jid = mod_muc.get_room_from_jid;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
local function get_room(name)
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	local jid = name .. '@' .. module.host;
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	return get_room_from_jid(jid);
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
3586
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
    23
local use_oob = module:get_option_boolean(module.name .. "_show_images", false);
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
module:depends"http";
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
    26
local template;
1582
8e282eb0c70c mod_http_muc_log: Split out template into a configurable file.
Kim Alvefur <zash@zash.se>
parents: 1581
diff changeset
    27
do
4186
1890115b2773 mod_http_muc_log: Move template into a directory to ease packaging
Kim Alvefur <zash@zash.se>
parents: 4038
diff changeset
    28
	local template_filename = module:get_option_string(module.name .. "_template", "res/" .. module.name .. ".html");
3070
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    29
	local template_file, err = module:load_resource(template_filename);
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    30
	if template_file then
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    31
		template, err = template_file:read("*a");
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    32
		template_file:close();
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    33
	end
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    34
	if not template then
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    35
		module:log("error", "Error loading template: %s", err);
3490
887ce59cf396 mod_http_muc_log: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
    36
		template = render("<h1>mod_{module} could not read the template</h1>\
887ce59cf396 mod_http_muc_log: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
    37
		<p>Tried to open <b>{filename}</b></p>\
887ce59cf396 mod_http_muc_log: Split long line [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
    38
		<pre>{error}</pre>",
3070
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    39
			{ module = module.name, filename = template_filename, error = err });
cefc375d0929 mod_http_muc_log: Handle errors while loading template file in a more graceful manner
Kim Alvefur <zash@zash.se>
parents: 3068
diff changeset
    40
	end
1582
8e282eb0c70c mod_http_muc_log: Split out template into a configurable file.
Kim Alvefur <zash@zash.se>
parents: 1581
diff changeset
    41
end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
    43
local resources = module:get_option_path(module.name .. "_resources", "static");
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
    44
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
    45
-- local base_url = module:http_url() .. '/'; -- TODO: Generate links in a smart way
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    46
local get_link do
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    47
	local link, path = { path = '/' }, { "", "", is_directory = true };
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    48
	function get_link(room, date)
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    49
		path[1], path[2] = room, date;
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    50
		path.is_directory = not date;
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    51
		link.path = url.build_path(path);
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    52
		return url.build(link);
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    53
	end
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
    54
end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
3597
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    56
local function get_absolute_link(room, date)
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    57
	local link = url.parse(module:http_url());
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    58
	local path = url.parse_path(link.path);
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    59
	if room then
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    60
		table.insert(path, room);
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    61
		if date then
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    62
			table.insert(path, date)
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    63
			path.is_directory = false;
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    64
		else
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    65
			path.is_directory = true;
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    66
		end
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    67
	end
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    68
	link.path = url.build_path(path)
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    69
	return url.build(link)
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    70
end
0b670831ace3 mod_http_muc_log: Correctly build absolute URLs
Kim Alvefur <zash@zash.se>
parents: 3596
diff changeset
    71
3063
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
    72
-- Whether room can be joined by anyone
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
    73
local function open_room(room) -- : boolean
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	if type(room) == "string" then
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
		room = get_room(room);
3065
25eecbb195d9 mod_http_muc_log: Add comment about argument to policy function
Kim Alvefur <zash@zash.se>
parents: 3064
diff changeset
    76
		-- assumed to be a room object otherwise
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	end
3061
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    78
	if not room then
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    79
		return nil;
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    80
	end
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    81
3063
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
    82
	if (room.get_members_only or room.is_members_only)(room) then
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
    83
		return false;
3061
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    84
	end
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    85
3063
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
    86
	if room:get_password() then
3061
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    87
		return false;
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    88
	end
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    89
f69a2e97d912 mod_http_muc_log: Improve readability of policy function
Kim Alvefur <zash@zash.se>
parents: 2850
diff changeset
    90
	return true;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
3600
6e529f53b3c3 mod_http_muc_log: Allow specifying the default view
Kim Alvefur <zash@zash.se>
parents: 3599
diff changeset
    93
-- Can be set to "latest"
6e529f53b3c3 mod_http_muc_log: Allow specifying the default view
Kim Alvefur <zash@zash.se>
parents: 3599
diff changeset
    94
local default_view = module:get_option_string(module.name .. "_default_view", nil);
6e529f53b3c3 mod_http_muc_log: Allow specifying the default view
Kim Alvefur <zash@zash.se>
parents: 3599
diff changeset
    95
3068
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
    96
module:hook("muc-disco#info", function (event)
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
    97
	local room = event.room;
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
    98
	if open_room(room) then
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
    99
		table.insert(event.form, { name = "muc#roominfo_logs", type="text-single" });
3600
6e529f53b3c3 mod_http_muc_log: Allow specifying the default view
Kim Alvefur <zash@zash.se>
parents: 3599
diff changeset
   100
		event.formdata["muc#roominfo_logs"] = get_absolute_link(jid_split(event.room.jid), default_view);
3068
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
   101
	end
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
   102
end);
ce61f1826f1f mod_http_muc_log: Include URL in disco#info for public rooms
Kim Alvefur <zash@zash.se>
parents: 3067
diff changeset
   103
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   104
local function sort_Y(a,b) return a.year > b.year end
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   105
local function sort_m(a,b) return a.n > b.n end
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   106
2594
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   107
-- Time zone hack?
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   108
local t_diff = os_time(os_date("*t")) - os_time(os_date("!*t"));
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   109
local function time(t)
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   110
	return os_time(t) + t_diff;
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   111
end
2840
52a7c0f6aea1 mod_http_muc_log: Add a function for rounding timestamps down to midnight
Kim Alvefur <zash@zash.se>
parents: 2830
diff changeset
   112
local function date_floor(t)
52a7c0f6aea1 mod_http_muc_log: Add a function for rounding timestamps down to midnight
Kim Alvefur <zash@zash.se>
parents: 2830
diff changeset
   113
	return t - t % 86400;
52a7c0f6aea1 mod_http_muc_log: Add a function for rounding timestamps down to midnight
Kim Alvefur <zash@zash.se>
parents: 2830
diff changeset
   114
end
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   115
2594
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   116
-- Fetch one item
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   117
local function find_once(room, query, retval)
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   118
	if query then query.limit = 1; else query = { limit = 1 }; end
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   119
	local iter, err = archive:find(room, query);
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   120
	if not iter then return iter, err; end
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   121
	if retval then
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   122
		return select(retval, iter());
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   123
	end
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   124
	return iter();
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   125
end
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   126
2830
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   127
local lazy = module:get_option_boolean(module.name .. "_lazy_calendar", true);
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   128
3601
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   129
local presence_logged = module:get_option_boolean("muc_log_presences", false);
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   130
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   131
local function hide_presence(request)
3601
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   132
	if not presence_logged then
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   133
		return false;
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   134
	end
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   135
	if request.url.query then
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   136
		local data = httplib.formdecode(request.url.query);
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   137
		if data then
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   138
			return data.p == "h"
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   139
		end
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   140
	end
5121
2b94ee74d1f1 Backed out changeset 85882735fd33
Jonas Schäfer <jonas@wielicki.name>
parents: 5120
diff changeset
   141
	return false;
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   142
end
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   143
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   144
local function get_dates(room) --> { integer, ... }
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   145
	local date_list = archive.dates and archive:dates(room);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   146
	if date_list then
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   147
		for i = 1, #date_list do
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   148
			date_list[i] = datetime.parse(date_list[i].."T00:00:00Z");
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   149
		end
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   150
		return date_list;
3063
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   151
	end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   152
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   153
	if lazy then
2830
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   154
		-- Lazy with many false positives
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   155
		date_list = {};
2830
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   156
		local first_day = find_once(room, nil, 3);
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   157
		local last_day = find_once(room, { reverse = true }, 3);
2843
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   158
		if first_day and last_day then
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   159
			first_day = date_floor(first_day);
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   160
			last_day = date_floor(last_day);
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   161
			for when = first_day, last_day, 86400 do
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   162
				table.insert(date_list, when);
2843
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   163
			end
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   164
		else
7738d7158dd0 mod_http_muc_log: Return a 404 page if there are no messages to derive a time span from
Kim Alvefur <zash@zash.se>
parents: 2842
diff changeset
   165
			return; -- 404
2830
ed26608920d4 mod_http_muc_log: Switch to an inaccurate but O(1) method of producing the calendar view
Kim Alvefur <zash@zash.se>
parents: 2767
diff changeset
   166
		end
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   167
		return date_list;
1836
48125f2c358b mod_http_muc_log: If archive driver provides the dates method, use it
Kim Alvefur <zash@zash.se>
parents: 1754
diff changeset
   168
	end
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   169
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   170
	-- Collect date the hard way
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   171
	module:log("debug", "Find all dates with messages");
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   172
	date_list = {};
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   173
	local next_day;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   174
	repeat
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   175
		local when = find_once(room, { start = next_day; }, 3);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   176
		if not when then break; end
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   177
		table.insert(date_list, when);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   178
		next_day = date_floor(when) + 86400;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   179
	until not next_day;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   180
	return date_list;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   181
end
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   182
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   183
function render_funcs.calendarize(date_list)
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   184
	-- convert array of timestamps to a year / month / day tree
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   185
	local dates = mt.new();
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   186
	for _, when in ipairs(date_list) do
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   187
		local t = os_date("!*t", when);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   188
		dates:set(t.year, t.month, t.day, when);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   189
	end
2594
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   190
	-- Wrangle Y/m/d tree into year / month / week / day tree for calendar view
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   191
	local years = {};
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   192
	for current_year, months_t in pairs(dates.data) do
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   193
		local t = { year = current_year, month = 1, day = 1 };
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   194
		local months = { };
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   195
		local year = { year = current_year, months = months };
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   196
		years[#years+1] = year;
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   197
		for current_month, days_t in pairs(months_t) do
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   198
			t.day = 1;
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   199
			t.month = current_month;
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   200
			local tmp = os_date("!*t", time(t));
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   201
			local days = {};
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   202
			local week = { days = days }
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   203
			local weeks = { week };
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   204
			local month = { year = year.year, month = os_date("!%B", time(t)), n = current_month, weeks = weeks };
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   205
			months[#months+1] = month;
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   206
			local current_day = 1;
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   207
			for _=1, (tmp.wday+5)%7 do
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   208
				days[current_day], current_day = {}, current_day+1;
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   209
			end
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   210
			for i = 1, 31 do
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   211
				t.day = i;
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   212
				tmp = os_date("!*t", time(t));
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   213
				if tmp.month ~= current_month then break end
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   214
				if i > 1 and tmp.wday == 2 then
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   215
					days = {};
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   216
					weeks[#weeks+1] = { days = days };
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   217
					current_day = 1;
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   218
				end
2689
cd5781ca782d mod_http_muc_log: Remove caching
Kim Alvefur <zash@zash.se>
parents: 2597
diff changeset
   219
				days[current_day] = {
cd5781ca782d mod_http_muc_log: Remove caching
Kim Alvefur <zash@zash.se>
parents: 2597
diff changeset
   220
					wday = tmp.wday, day = i, href = days_t[i] and datetime.date(days_t[i])
cd5781ca782d mod_http_muc_log: Remove caching
Kim Alvefur <zash@zash.se>
parents: 2597
diff changeset
   221
				};
cd5781ca782d mod_http_muc_log: Remove caching
Kim Alvefur <zash@zash.se>
parents: 2597
diff changeset
   222
				current_day = current_day+1;
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   223
			end
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   224
		end
3753
cb61f0e06de3 mod_http_muc_log: Fix sorting months
Kim Alvefur <zash@zash.se>
parents: 3726
diff changeset
   225
		table.sort(months, sort_m);
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   226
	end
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   227
	table.sort(years, sort_Y);
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   228
	return years;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   229
end
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   230
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   231
-- Produce the calendar view
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   232
local function years_page(event, path)
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   233
	local request, response = event.request, event.response;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   234
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   235
	local room = nodeprep(path:match("^(.*)/$"));
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   236
	local is_open = open_room(room);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   237
	if is_open == nil then
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   238
		return -- implicit 404
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   239
	elseif is_open == false then
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   240
		return 403;
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   241
	end
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   242
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   243
	local date_list = get_dates(room);
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   244
	if not date_list then
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   245
		return; -- 404
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   246
	end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   247
2594
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   248
	-- Phew, all wrangled, all that's left is rendering it with the template
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   249
1579
9e784ddac236 mod_http_muc_log: Include charset in Content-Type header
Kim Alvefur <zash@zash.se>
parents: 1578
diff changeset
   250
	response.headers.content_type = "text/html; charset=utf-8";
3896
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   251
	local room_obj = get_room(room);
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   252
	return render(template, {
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   253
		static = "../@static";
3896
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   254
		room = room_obj._data;
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   255
		jid = room_obj.jid;
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   256
		jid_node = jid_split(room_obj.jid);
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   257
		hide_presence = hide_presence(request);
3601
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   258
		presence_available = presence_logged;
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   259
		dates = date_list;
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   260
		links = {
2844
683a2f25223d mod_http_muc_log: Reword "back" links
Kim Alvefur <zash@zash.se>
parents: 2843
diff changeset
   261
			{ href = "../", rel = "up", text = "Room list" },
3722
cc6f7e2e4a59 mod_http_muc_log: Add arrow to 'latest' link like on other navigation
Kim Alvefur <zash@zash.se>
parents: 3719
diff changeset
   262
			{ href = "latest", rel = "last", text = "Latest" },
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   263
		};
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   264
	});
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   265
end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   266
2594
63dd3e525f13 mod_http_muc_log: Add some comments
Kim Alvefur <zash@zash.se>
parents: 2240
diff changeset
   267
-- Produce the chat log view
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   268
local function logs_page(event, path)
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   269
	local request, response = event.request, event.response;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   270
3595
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   271
	local room, date = path:match("^([^/]+)/([^/]*)/?$");
4934
13070c6a7ce8 mod_http_muc_log: Fix exception on lack of trailing slash in room path
Kim Alvefur <zash@zash.se>
parents: 4785
diff changeset
   272
	if not room then
13070c6a7ce8 mod_http_muc_log: Fix exception on lack of trailing slash in room path
Kim Alvefur <zash@zash.se>
parents: 4785
diff changeset
   273
		response.headers.location = url.build({ path = path .. "/" });
13070c6a7ce8 mod_http_muc_log: Fix exception on lack of trailing slash in room path
Kim Alvefur <zash@zash.se>
parents: 4785
diff changeset
   274
		return 303;
13070c6a7ce8 mod_http_muc_log: Fix exception on lack of trailing slash in room path
Kim Alvefur <zash@zash.se>
parents: 4785
diff changeset
   275
	end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   276
	room = nodeprep(room);
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   277
	if not room then
3595
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   278
		return 400;
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   279
	elseif date == "" then
1610
2c8b985ebde5 mod_http_muc_log: Switch to a calendar view for selecting dates
Kim Alvefur <zash@zash.se>
parents: 1609
diff changeset
   280
		return years_page(event, path);
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   281
	end
3063
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   282
	local is_open = open_room(room);
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   283
	if is_open == nil then
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   284
		return -- implicit 404
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   285
	elseif is_open == false then
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   286
		return 403;
14d8f2a9d5f4 mod_http_muc_log: Base read-access on whether anyone would be able to join (like MUC)
Kim Alvefur <zash@zash.se>
parents: 3062
diff changeset
   287
	end
3596
61a9c087730a mod_http_muc_log: Provide a redirect to 'latest' day with logs (fixes #1360)
Kim Alvefur <zash@zash.se>
parents: 3595
diff changeset
   288
	if date == "latest" then
61a9c087730a mod_http_muc_log: Provide a redirect to 'latest' day with logs (fixes #1360)
Kim Alvefur <zash@zash.se>
parents: 3595
diff changeset
   289
		local last_day = find_once(room, { reverse = true }, 3);
3599
00a848ede42d mod_http_muc_log: Preserve ?query part in redirect
Kim Alvefur <zash@zash.se>
parents: 3598
diff changeset
   290
		response.headers.location = url.build({ path = datetime.date(last_day), query = request.url.query });
3596
61a9c087730a mod_http_muc_log: Provide a redirect to 'latest' day with logs (fixes #1360)
Kim Alvefur <zash@zash.se>
parents: 3595
diff changeset
   291
		return 303;
61a9c087730a mod_http_muc_log: Provide a redirect to 'latest' day with logs (fixes #1360)
Kim Alvefur <zash@zash.se>
parents: 3595
diff changeset
   292
	end
2845
462dece0a3c2 mod_http_muc_log: Parse date out of path once
Kim Alvefur <zash@zash.se>
parents: 2844
diff changeset
   293
	local day_start = datetime.parse(date.."T00:00:00Z");
3595
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   294
	if not day_start then
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   295
		module:log("debug", "Invalid date format: %q", date);
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   296
		return 400;
3f8383c5a045 mod_http_muc_log: Fix Y10k bug
Kim Alvefur <zash@zash.se>
parents: 3587
diff changeset
   297
	end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   298
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
	local logs, i = {}, 1;
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   300
	local iter, err = archive:find(room, {
2845
462dece0a3c2 mod_http_muc_log: Parse date out of path once
Kim Alvefur <zash@zash.se>
parents: 2844
diff changeset
   301
		["start"] = day_start;
462dece0a3c2 mod_http_muc_log: Parse date out of path once
Kim Alvefur <zash@zash.se>
parents: 2844
diff changeset
   302
		["end"]   = day_start + 86399;
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   303
		["with"]  = hide_presence(request) and "message<groupchat" or nil;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   304
	});
1658
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   305
	if not iter then
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   306
		module:log("warn", "Could not search archive: %s", err or "no error");
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   307
		return 500;
1a6d6221c5f6 mod_http_muc_log: Cleanup [luacheck]
Kim Alvefur <zash@zash.se>
parents: 1629
diff changeset
   308
	end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   309
1577
0a6974f2cb55 mod_http_muc_log: Use archive IDs to find next and previous dates that contain messages
Kim Alvefur <zash@zash.se>
parents: 1576
diff changeset
   310
	local first, last;
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   311
	for archive_id, item, when in iter do
3707
7244ff1d62a8 mod_http_muc_log: Expose xml:lang from each message/body #a11y
Kim Alvefur <zash@zash.se>
parents: 3706
diff changeset
   312
		local body_tag = item:get_child("body");
7244ff1d62a8 mod_http_muc_log: Expose xml:lang from each message/body #a11y
Kim Alvefur <zash@zash.se>
parents: 3706
diff changeset
   313
		local body = body_tag and body_tag:get_text();
2595
3e1a85c5194c mod_http_muc_log: Move scope of variables into loop
Kim Alvefur <zash@zash.se>
parents: 2594
diff changeset
   314
		local subject = item:get_child_text("subject");
3e1a85c5194c mod_http_muc_log: Move scope of variables into loop
Kim Alvefur <zash@zash.se>
parents: 2594
diff changeset
   315
		local verb = nil;
3707
7244ff1d62a8 mod_http_muc_log: Expose xml:lang from each message/body #a11y
Kim Alvefur <zash@zash.se>
parents: 3706
diff changeset
   316
		local lang = body_tag and body_tag.attr["xml:lang"] or item.attr["xml:lang"];
4593
45ab9152a51c mod_http_muc_log: Add some spacing around code for readability
Kim Alvefur <zash@zash.se>
parents: 4186
diff changeset
   317
4995
b17d63ef5bdf mod_http_muc_log: Use XEP-0359 ID if available
Kim Alvefur <zash@zash.se>
parents: 4994
diff changeset
   318
		-- XEP-0359: Unique and Stable Stanza IDs
b17d63ef5bdf mod_http_muc_log: Use XEP-0359 ID if available
Kim Alvefur <zash@zash.se>
parents: 4994
diff changeset
   319
		local message_id = item:find("{urn:xmpp:sid:0}origin-id@id") or item.attr.id;
b17d63ef5bdf mod_http_muc_log: Use XEP-0359 ID if available
Kim Alvefur <zash@zash.se>
parents: 4994
diff changeset
   320
1555
2e51f70cd7ea mod_http_muc_log: Make pretty
Kim Alvefur <zash@zash.se>
parents: 1554
diff changeset
   321
		if subject then
1578
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   322
			verb, body = "set the topic to", subject;
1555
2e51f70cd7ea mod_http_muc_log: Make pretty
Kim Alvefur <zash@zash.se>
parents: 1554
diff changeset
   323
		elseif body and body:sub(1,4) == "/me " then
2e51f70cd7ea mod_http_muc_log: Make pretty
Kim Alvefur <zash@zash.se>
parents: 1554
diff changeset
   324
			verb, body = body:sub(5), nil;
2e51f70cd7ea mod_http_muc_log: Make pretty
Kim Alvefur <zash@zash.se>
parents: 1554
diff changeset
   325
		elseif item.name == "presence" then
3064
982668000163 mod_http_muc_log: Add a note about changing how presence is treated
Kim Alvefur <zash@zash.se>
parents: 3063
diff changeset
   326
			-- TODO Distinguish between join and presence update
1555
2e51f70cd7ea mod_http_muc_log: Make pretty
Kim Alvefur <zash@zash.se>
parents: 1554
diff changeset
   327
			verb = item.attr.type == "unavailable" and "has left" or "has joined";
3707
7244ff1d62a8 mod_http_muc_log: Expose xml:lang from each message/body #a11y
Kim Alvefur <zash@zash.se>
parents: 3706
diff changeset
   328
			lang = "en";
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   329
		end
4593
45ab9152a51c mod_http_muc_log: Add some spacing around code for readability
Kim Alvefur <zash@zash.se>
parents: 4186
diff changeset
   330
4594
3145823992cb mod_http_muc_log: Move out nickname into a variable for future reuse
Kim Alvefur <zash@zash.se>
parents: 4593
diff changeset
   331
		local nick = select(3, jid_split(item.attr.from));
4996
ed5abb8b8fa8 mod_http_muc_log: Use XEP-0421 ID over nickname for XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4995
diff changeset
   332
		local occupant_id = item:find("{urn:xmpp:occupant-id:0}occupant-id@id") or nick;
4990
3bcefa9cf1ca mod_http_muc_log: Mention relevant XEPs in comments
Kim Alvefur <zash@zash.se>
parents: 4974
diff changeset
   333
3bcefa9cf1ca mod_http_muc_log: Mention relevant XEPs in comments
Kim Alvefur <zash@zash.se>
parents: 4974
diff changeset
   334
		-- XEP-0066: Out of Band Data
3586
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   335
		local oob = use_oob and item:get_child("x", "jabber:x:oob");
4593
45ab9152a51c mod_http_muc_log: Add some spacing around code for readability
Kim Alvefur <zash@zash.se>
parents: 4186
diff changeset
   336
4990
3bcefa9cf1ca mod_http_muc_log: Mention relevant XEPs in comments
Kim Alvefur <zash@zash.se>
parents: 4974
diff changeset
   337
		-- XEP-0425: Message Moderation
4785
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   338
		local moderated = item:get_child("moderated", "urn:xmpp:message-moderate:0");
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   339
		if moderated then
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   340
			local actor = moderated.attr.by;
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   341
			if actor then actor = select(3, jid_split(actor)); end
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   342
			verb = "removed by " .. (actor or "moderator");
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   343
			body = moderated:get_child_text("reason") or "";
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   344
		end
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   345
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   346
		local moderation = item:find("{urn:xmpp:fasten:0}apply-to/{urn:xmpp:message-moderate:0}moderated");
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   347
		if moderation then
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   348
			nick = nick or "a moderator";
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   349
			verb = "removed a message";
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   350
			body = moderation:get_child_text("reason") or "";
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   351
		end
306066898e5f mod_http_muc_log: Show messages moderated using XEP-0425
Kim Alvefur <zash@zash.se>
parents: 4681
diff changeset
   352
4990
3bcefa9cf1ca mod_http_muc_log: Mention relevant XEPs in comments
Kim Alvefur <zash@zash.se>
parents: 4974
diff changeset
   353
		-- XEP-0308: Last Message Correction
4596
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   354
		local edit = item:find("{urn:xmpp:message-correct:0}replace/@id");
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   355
		if edit then
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   356
			local found = false;
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   357
			for n = i-1, 1, -1 do
4996
ed5abb8b8fa8 mod_http_muc_log: Use XEP-0421 ID over nickname for XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4995
diff changeset
   358
				if logs[n].message_id == edit and occupant_id == logs[n].occupant_id then
4596
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   359
					found = true;
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   360
					logs[n].edited = archive_id;
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   361
					edit = logs[n].archive_id;
4596
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   362
					break;
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   363
				end
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   364
			end
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   365
			if not found then
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   366
				-- Ignore unresolved edit.
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   367
				edit = nil;
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   368
			end
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   369
		end
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   370
4990
3bcefa9cf1ca mod_http_muc_log: Mention relevant XEPs in comments
Kim Alvefur <zash@zash.se>
parents: 4974
diff changeset
   371
		-- XEP-0444: Message Reactions
4967
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   372
		local reactions = item:get_child("reactions", "urn:xmpp:reactions:0");
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   373
		if reactions then
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   374
			-- COMPAT Movim uses an @to attribute instead of the correct @id
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   375
			local target_id = reactions.attr.id or reactions.attr.to;
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   376
			for n = i - 1, 1, -1 do
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   377
				if logs[n].archive_id == target_id then
4967
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   378
					local react_map = logs[n].reactions; -- { string : integer }
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   379
					if not react_map then
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   380
						react_map = {};
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   381
						logs[n].reactions = react_map;
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   382
					end
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   383
					for reaction_tag in reactions:childtags("reaction") do
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   384
						-- FIXME This doesn't replace previous reactions by the same user
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   385
						-- on the same message.
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   386
						local reaction_text = reaction_tag:get_text() or "�";
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   387
						react_map[reaction_text] = (react_map[reaction_text] or 0) + 1;
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   388
					end
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   389
					break
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   390
				end
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   391
			end
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   392
		end
479d618c9e6d mod_http_muc_log: Show XEP-0444 reactions
Kim Alvefur <zash@zash.se>
parents: 4934
diff changeset
   393
4991
8a8ec909ac20 mod_http_muc_log: Link to replied-to message using XEP-0461: Message Replies
Kim Alvefur <zash@zash.se>
parents: 4990
diff changeset
   394
		-- XEP-0461: Message Replies
4997
f36d15107c15 mod_http_muc_log: Use stanza:find to save a few bytes
Kim Alvefur <zash@zash.se>
parents: 4996
diff changeset
   395
		local reply = item:find("{urn:xmpp:reply:0}reply@id");
4991
8a8ec909ac20 mod_http_muc_log: Link to replied-to message using XEP-0461: Message Replies
Kim Alvefur <zash@zash.se>
parents: 4990
diff changeset
   396
3586
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   397
		if body or verb or oob then
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   398
			local line = {
4995
b17d63ef5bdf mod_http_muc_log: Use XEP-0359 ID if available
Kim Alvefur <zash@zash.se>
parents: 4994
diff changeset
   399
				message_id = message_id;
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   400
				archive_id = archive_id;
4996
ed5abb8b8fa8 mod_http_muc_log: Use XEP-0421 ID over nickname for XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4995
diff changeset
   401
				occupant_id = occupant_id;
1578
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   402
				datetime = datetime.datetime(when);
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   403
				time = datetime.time(when);
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   404
				verb = verb;
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   405
				body = body;
3707
7244ff1d62a8 mod_http_muc_log: Expose xml:lang from each message/body #a11y
Kim Alvefur <zash@zash.se>
parents: 3706
diff changeset
   406
				lang = lang;
4594
3145823992cb mod_http_muc_log: Move out nickname into a variable for future reuse
Kim Alvefur <zash@zash.se>
parents: 4593
diff changeset
   407
				nick = nick;
1578
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   408
				st_name = item.name;
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   409
				st_type = item.attr.type;
4596
38f501dca618 mod_http_muc_log: Find edit relations using XEP-0308
Kim Alvefur <zash@zash.se>
parents: 4594
diff changeset
   410
				edit = edit;
4997
f36d15107c15 mod_http_muc_log: Use stanza:find to save a few bytes
Kim Alvefur <zash@zash.se>
parents: 4996
diff changeset
   411
				reply = reply;
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   412
				-- COMPAT
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   413
				key = archive_id;
3586
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   414
			};
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   415
			if oob then
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   416
				line.oob = {
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   417
					url = oob:get_child_text("url");
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   418
					desc = oob:get_child_text("desc");
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   419
				}
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   420
			end
444e2306c99a mod_http_muc_log: Add option to show OOB images
Kim Alvefur <zash@zash.se>
parents: 3582
diff changeset
   421
			logs[i], i = line, i + 1;
1578
a68ec7a2dc02 mod_http_muc_log: Show only messages with presentable content
Kim Alvefur <zash@zash.se>
parents: 1577
diff changeset
   422
		end
4593
45ab9152a51c mod_http_muc_log: Add some spacing around code for readability
Kim Alvefur <zash@zash.se>
parents: 4186
diff changeset
   423
4994
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   424
		first = first or archive_id;
d55b10878e43 mod_http_muc_log: Rename variable for improved clarity
Kim Alvefur <zash@zash.se>
parents: 4993
diff changeset
   425
		last = archive_id;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   426
	end
2850
7eb23a4e7fde mod_http_muc_log: Generate empty pages in lazy mode, so that one can navigate past quiet days
Kim Alvefur <zash@zash.se>
parents: 2849
diff changeset
   427
	if i == 1 and not lazy then return end -- No items
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   428
2240
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   429
	local next_when, prev_when = "", "";
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   430
	local date_list = archive.dates and archive:dates(room);
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   431
	if date_list then
2596
fb1987d4ac62 mod_http_muc_log: Rename loop variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2595
diff changeset
   432
		for j = 1, #date_list do
fb1987d4ac62 mod_http_muc_log: Rename loop variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2595
diff changeset
   433
			if date_list[j] == date then
fb1987d4ac62 mod_http_muc_log: Rename loop variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2595
diff changeset
   434
				next_when = date_list[j+1] or "";
fb1987d4ac62 mod_http_muc_log: Rename loop variable to avoid name clash
Kim Alvefur <zash@zash.se>
parents: 2595
diff changeset
   435
				prev_when = date_list[j-1] or "";
2240
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   436
				break;
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   437
			end
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   438
		end
2848
9fac07bba402 mod_http_muc_log: Lazy nex/prev link generation
Kim Alvefur <zash@zash.se>
parents: 2847
diff changeset
   439
	elseif lazy then
9fac07bba402 mod_http_muc_log: Lazy nex/prev link generation
Kim Alvefur <zash@zash.se>
parents: 2847
diff changeset
   440
		next_when = datetime.date(day_start + 86400);
9fac07bba402 mod_http_muc_log: Lazy nex/prev link generation
Kim Alvefur <zash@zash.se>
parents: 2847
diff changeset
   441
		prev_when = datetime.date(day_start - 86400);
2849
0de6ed2ae9bd mod_http_muc_log: Check that there are timestamps to work with
Kim Alvefur <zash@zash.se>
parents: 2848
diff changeset
   442
	elseif first and last then
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   443
2240
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   444
		module:log("debug", "Find next date with messages");
2597
b61b0ff1c0f9 mod_http_muc_log: Fix prev/next date finding
Kim Alvefur <zash@zash.se>
parents: 2596
diff changeset
   445
		next_when = find_once(room, { after = last }, 3);
2240
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   446
		if next_when then
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   447
			next_when = datetime.date(next_when);
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   448
			module:log("debug", "Next message: %s", next_when);
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   449
		end
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   450
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   451
		module:log("debug", "Find prev date with messages");
2597
b61b0ff1c0f9 mod_http_muc_log: Fix prev/next date finding
Kim Alvefur <zash@zash.se>
parents: 2596
diff changeset
   452
		prev_when = find_once(room, { before = first, reverse = true }, 3);
2240
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   453
		if prev_when then
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   454
			prev_when = datetime.date(prev_when);
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   455
			module:log("debug", "Previous message: %s", prev_when);
86bc6e1d9d4d mod_http_muc_log: Find next and previous date with date index if this is supported by the storage driver
Kim Alvefur <zash@zash.se>
parents: 2239
diff changeset
   456
		end
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   457
	end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   458
3694
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   459
	local links = {
4038
a359972d246e mod_http_muc_log: Add link to room list from logs page
Kim Alvefur <zash@zash.se>
parents: 3897
diff changeset
   460
		{ href = "../", rel = "up", text = "Room list" },
3694
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   461
		{ href = "./", rel = "up", text = "Calendar" },
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   462
	};
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   463
	if prev_when ~= "" then
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   464
		table.insert(links, { href = prev_when, rel = "prev", text = prev_when});
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   465
	end
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   466
	if next_when ~= "" then
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   467
		table.insert(links, { href = next_when, rel = "next", text = next_when});
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   468
	end
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   469
1579
9e784ddac236 mod_http_muc_log: Include charset in Content-Type header
Kim Alvefur <zash@zash.se>
parents: 1578
diff changeset
   470
	response.headers.content_type = "text/html; charset=utf-8";
3896
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   471
	local room_obj = get_room(room);
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   472
	return render(template, {
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   473
		static = "../@static";
3718
04ff0de40ba9 mod_http_muc_log: Add date metadata to log pages
Kim Alvefur <zash@zash.se>
parents: 3707
diff changeset
   474
		date = date;
3896
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   475
		room = room_obj._data;
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   476
		jid = room_obj.jid;
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   477
		jid_node = jid_split(room_obj.jid);
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   478
		hide_presence = hide_presence(request);
3601
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   479
		presence_available = presence_logged;
3896
96a2e5097fc4 mod_http_muc_log: Reduce hashtable lookups
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3761
diff changeset
   480
		lang = room_obj.get_language and room_obj:get_language();
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   481
		lines = logs;
3694
8c0a6d4541d5 mod_http_muc_log: Wrap navigation in unorderded lists (thanks jonas’)
Kim Alvefur <zash@zash.se>
parents: 3601
diff changeset
   482
		links = links;
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   483
		dates = {}; -- COMPAT util.interpolation {nil|func#...} bug
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   484
	});
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   485
end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   486
4680
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   487
local room_weights = setmetatable(module:get_option_array(module.name.."_list_order", {}):reverse(), nil);
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   488
for i = #room_weights, 1, -1 do
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   489
	local room_jid = room_weights[i];
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   490
	room_weights[i] = nil;
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   491
	room_weights[room_jid] = i;
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   492
end
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   493
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   494
local function list_rooms(event)
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   495
	local request, response = event.request, event.response;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   496
	local room_list, i = {}, 1;
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   497
	for room in each_room() do
3066
37a78e365b46 mod_http_muc_log: Fix inverted logic
Kim Alvefur <zash@zash.se>
parents: 3065
diff changeset
   498
		if not (room.get_hidden or room.is_hidden)(room) then
3897
3f20b7c88afb mod_http_muc_log: Expose JID localpart to the template
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3896
diff changeset
   499
			local localpart = jid_split(room.jid);
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   500
			room_list[i], i = {
3582
ea63dc0cc824 mod_http_muc_log: Sort room listing by jid for stable order
Kim Alvefur <zash@zash.se>
parents: 3564
diff changeset
   501
				jid = room.jid;
3897
3f20b7c88afb mod_http_muc_log: Expose JID localpart to the template
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3896
diff changeset
   502
				localpart = localpart;
3f20b7c88afb mod_http_muc_log: Expose JID localpart to the template
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 3896
diff changeset
   503
				href = get_link(localpart, default_view);
4186
1890115b2773 mod_http_muc_log: Move template into a directory to ease packaging
Kim Alvefur <zash@zash.se>
parents: 4038
diff changeset
   504
				name = room:get_name() or localpart;
3706
caf27826c7b2 mod_http_muc_log: Use configured room language in room title/desc #a11y
Kim Alvefur <zash@zash.se>
parents: 3696
diff changeset
   505
				lang = room.get_language and room:get_language();
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   506
				description = room:get_description();
4680
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   507
				priority = room_weights[ room.jid ] or 0;
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   508
			}, i + 1;
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   509
		end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   510
	end
1576
91b91052e0e8 mod_http_muc_log: Send a HTML mime type with responses
Kim Alvefur <zash@zash.se>
parents: 1575
diff changeset
   511
3582
ea63dc0cc824 mod_http_muc_log: Sort room listing by jid for stable order
Kim Alvefur <zash@zash.se>
parents: 3564
diff changeset
   512
	table.sort(room_list, function (a, b)
4680
a2cf3b69a3d6 mod_http_muc_log: Add way to list certain rooms in a specified order
Kim Alvefur <zash@zash.se>
parents: 4596
diff changeset
   513
		if a.priority ~= b.priority then return a.priority > b.priority; end
4681
823370bc2e4c mod_http_muc_log: Sort rooms with a description before those without
Kim Alvefur <zash@zash.se>
parents: 4680
diff changeset
   514
		if a.description ~= nil and b.description == nil then
823370bc2e4c mod_http_muc_log: Sort rooms with a description before those without
Kim Alvefur <zash@zash.se>
parents: 4680
diff changeset
   515
			return true;
823370bc2e4c mod_http_muc_log: Sort rooms with a description before those without
Kim Alvefur <zash@zash.se>
parents: 4680
diff changeset
   516
		elseif a.description == nil and b.description ~= nil then
823370bc2e4c mod_http_muc_log: Sort rooms with a description before those without
Kim Alvefur <zash@zash.se>
parents: 4680
diff changeset
   517
			return false;
823370bc2e4c mod_http_muc_log: Sort rooms with a description before those without
Kim Alvefur <zash@zash.se>
parents: 4680
diff changeset
   518
		end
3587
a36412d4fafd mod_http_muc_log: Trim trailing whitespace [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3586
diff changeset
   519
		return a.jid < b.jid;
3582
ea63dc0cc824 mod_http_muc_log: Sort room listing by jid for stable order
Kim Alvefur <zash@zash.se>
parents: 3564
diff changeset
   520
	end);
ea63dc0cc824 mod_http_muc_log: Sort room listing by jid for stable order
Kim Alvefur <zash@zash.se>
parents: 3564
diff changeset
   521
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   522
	response.headers.content_type = "text/html; charset=utf-8";
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   523
	return render(template, {
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   524
		static = "./@static";
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   525
		title = module:get_option_string("name", "Prosody Chatrooms");
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   526
		jid = module.host;
3489
181561d0aae5 mod_http_muc_log: Add functionality for hiding joins and parts
Kim Alvefur <zash@zash.se>
parents: 3287
diff changeset
   527
		hide_presence = hide_presence(request);
3601
da7ec4ed6ddf mod_http_muc_log: Hide join/part controls if they are not stored by mod_muc_mam
Kim Alvefur <zash@zash.se>
parents: 3600
diff changeset
   528
		presence_available = presence_logged;
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   529
		rooms = room_list;
3754
9002c8a2165f mod_http_muc_log: Refactor calendarization of date list into a template filter BC
Kim Alvefur <zash@zash.se>
parents: 3753
diff changeset
   530
		dates = {}; -- COMPAT util.interpolation {nil|func#...} bug
1581
9f6cd252d233 mod_http_muc_log: Revamp template system
Kim Alvefur <zash@zash.se>
parents: 1580
diff changeset
   531
	});
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   532
end
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   533
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   534
local serve_static
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   535
do
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   536
	if prosody.process_type == "prosody" then
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   537
		-- Prosody >= 0.12
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   538
		local http_files = require "net.http.files";
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   539
		serve = http_files.serve;
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   540
	else
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   541
		-- Prosody <= 0.11
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   542
		serve = module:depends "http_files".serve;
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   543
	end
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   544
	local mime_map = module:shared("/*/http_files/mime").types or { css = "text/css"; js = "application/javascript" };
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   545
	serve_static = serve({ path = resources; mime_map = mime_map });
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   546
end
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   547
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   548
module:provides("http", {
3761
971417eedfee mod_http_muc_log: Set a http app title
Kim Alvefur <zash@zash.se>
parents: 3754
diff changeset
   549
	title = module:get_option_string("name", "Chatroom logs");
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   550
	route = {
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   551
		["GET /"] = list_rooms;
2689
cd5781ca782d mod_http_muc_log: Remove caching
Kim Alvefur <zash@zash.se>
parents: 2597
diff changeset
   552
		["GET /*"] = logs_page;
3726
bdbbf11eac0c mod_http_muc_log: Add comment about the routing of years and logs pages
Kim Alvefur <zash@zash.se>
parents: 3722
diff changeset
   553
		-- mod_http only supports one wildcard so logs_page will dispatch to years_page if the path contains no date
bdbbf11eac0c mod_http_muc_log: Add comment about the routing of years and logs pages
Kim Alvefur <zash@zash.se>
parents: 3722
diff changeset
   554
		-- thus:
bdbbf11eac0c mod_http_muc_log: Add comment about the routing of years and logs pages
Kim Alvefur <zash@zash.se>
parents: 3722
diff changeset
   555
		-- GET /room --> years_page (via logs_page)
bdbbf11eac0c mod_http_muc_log: Add comment about the routing of years and logs pages
Kim Alvefur <zash@zash.se>
parents: 3722
diff changeset
   556
		-- GET /room/yyyy-mm-dd --> logs_page (for real)
5108
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   557
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   558
		["GET /@static/*"] = serve_static;
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   559
		-- There are not many ASCII characters that are safe to use in URLs but not
d4b0a995e5e3 mod_http_muc_log: Move CSS and JS out of template
Kim Alvefur <zash@zash.se>
parents: 4997
diff changeset
   560
		-- valid in JID localparts, '@' seemed the only option.
1549
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   561
	};
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   562
});
f9f8bf82ece7 mod_http_muc_log: MUC log module using new archive API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   563