# HG changeset patch
# User Thilo Cestonaro
# Date 1257889992 -3600
# Node ID d6521ebea967c130d30dc3fca20c7e65abcd5e72
# Parent 24c734c09982e6515249c9c0c2874b9561800722
mod_muc_log: specified day is now part of the url not a query. days are sorted, newest top.
diff -r 24c734c09982 -r d6521ebea967 mod_muc_log/mod_muc_log.lua
--- a/mod_muc_log/mod_muc_log.lua Tue Nov 10 13:19:27 2009 +0500
+++ b/mod_muc_log/mod_muc_log.lua Tue Nov 10 22:53:12 2009 +0100
@@ -4,6 +4,7 @@
-- COPYING file in the source package for more information.
--
local prosody = prosody;
+local tabSort = table.sort;
local splitJid = require "util.jid".split;
local bareJid = require "util.jid".bare;
local config_get = require "core.configmanager".get;
@@ -74,7 +75,7 @@
]];
html.days = {};
-html.days.bit = [[20###YEAR###/###MONTH###/###DAY###
]];
+html.days.bit = [[20###YEAR###/###MONTH###/###DAY###
]];
html.days.body = [[available logged days of room: ###JID###
###DAYS_STUFF###
]];
@@ -100,7 +101,8 @@
###DAY_STUFF###
]];
html.help = [[
@@ -221,7 +223,7 @@
end
function createDoc(body)
- return html.doc:gsub("###BODY_STUFF###", body);
+ return html.doc:gsub("###BODY_STUFF###", body or "");
end
local function htmlEscape(t)
@@ -233,25 +235,9 @@
return t;
end
-function splitQuery(query)
- local ret = {};
- local name, value = nil, nil;
- if query == nil then return ret; end
- local last = 1;
- local idx = query:find("&", last);
- while idx ~= nil do
- name, value = query:sub(last, idx - 1):match("^(%a+)=(%d+)$");
- ret[name] = value;
- last = idx + 1;
- idx = query:find("&", last);
- end
- name, value = query:sub(last):match("^(%a+)=(%d+)$");
- ret[name] = value;
- return ret;
-end
-
-function grepRoomJid(url)
+function splitUrl(url)
local tmp = url:sub(string.len("/muc_log/") + 1);
+ local day = nil;
local room = nil;
local component = nil;
local at = nil;
@@ -259,20 +245,26 @@
local slash2 = nil;
slash = tmp:find("/");
- if slash ~= nil then
+ if slash then
component = tmp:sub(1, slash - 1);
if tmp:len() > slash then
room = tmp:sub(slash + 1);
slash = room:find("/");
if slash then
- room = room:sub(1, slash - 1);
+ tmp = room;
+ room = tmp:sub(1, slash - 1);
+ if tmp:len() > slash then
+ day = tmp:sub(slash + 1);
+ slash = day:find("/");
+ if slash then
+ day = day:sub(1, slash - 1);
+ end
+ end
end
- module:log("debug", "", room);
end
end
- module:log("debug", "component: %s; room: %s", tostring(component), tostring(room));
- return room, component;
+ return room, component, day;
end
local function generateComponentListSiteContent()
@@ -286,22 +278,21 @@
local function generateRoomListSiteContent(component)
local rooms = "";
- for host, config in pairs(prosody.hosts) do
- if host == component and prosody.hosts[host].muc ~= nil then
- for jid, room in pairs(prosody.hosts[host].muc.rooms) do
- local node = splitJid(jid);
- if not room._data.hidden and node then
- rooms = rooms .. html.rooms.bit:gsub("###ROOM###", node):gsub("###COMPONENT###", host);
- end
+ if prosody.hosts[component] and prosody.hosts[component].muc ~= nil then
+ for jid, room in pairs(prosody.hosts[component].muc.rooms) do
+ local node = splitJid(jid);
+ if not room._data.hidden and node then
+ rooms = rooms .. html.rooms.bit:gsub("###ROOM###", node):gsub("###COMPONENT###", component);
end
end
+ return html.rooms.body:gsub("###ROOMS_STUFF###", rooms):gsub("###COMPONENT###", component);
end
-
- return html.rooms.body:gsub("###ROOMS_STUFF###", rooms):gsub("###COMPONENT###", component);
+ return generateComponentListSiteContent(); -- fallback
end
local function generateDayListSiteContentByRoom(bareRoomJid)
local days = "";
+ local arrDays = {};
local tmp;
local node, host, resource = splitJid(bareRoomJid);
local path = data_getpath(node, host, datastore);
@@ -322,13 +313,21 @@
if year ~= nil and month ~= nil and day ~= nil and
year ~= "" and month ~= "" and day ~= ""
then
- tmp = html.days.bit;
- tmp = tmp:gsub("###ROOM###", node):gsub("###COMPONENT###", host);
- tmp = tmp:gsub("###YEAR###", year):gsub("###MONTH###", month):gsub("###DAY###", day);
- days = tmp .. days;
+ arrDays[#arrDays + 1] = {bare=file, year=year, month=month, day=day};
end
end
+ tabSort(arrDays, function(a,b)
+ return a.bare < b.bare;
+ end);
+ for _, date in pairs(arrDays) do
+ tmp = html.days.bit;
+ tmp = tmp:gsub("###ROOM###", node):gsub("###COMPONENT###", host);
+ tmp = tmp:gsub("###BARE_DAY###", date.bare);
+ tmp = tmp:gsub("###YEAR###", date.year):gsub("###MONTH###", date.month):gsub("###DAY###", date.day);
+ days = tmp .. days;
+ end
end
+
if days ~= "" then
tmp = html.days.body:gsub("###DAYS_STUFF###", days);
return tmp:gsub("###JID###", bareRoomJid);
@@ -444,16 +443,17 @@
return ret;
end
-local function parseDay(bareRoomJid, roomSubject, query)
+local function parseDay(bareRoomJid, roomSubject, bare_day)
local ret = "";
local year;
local month;
local day;
local tmp;
local node, host, resource = splitJid(bareRoomJid);
+ local year, month, day = bare_day:match("^(%d%d)(%d%d)(%d%d)");
- if query.year ~= nil and query.month ~= nil and query.day ~= nil then
- local data = data_load(node, host, datastore .. "/" .. query.year .. query.month .. query.day);
+ if bare_day ~= nil then
+ local data = data_load(node, host, datastore .. "/" .. bare_day);
if data ~= nil then
for i=1, #data, 1 do
local stanza = lom.parse(data[i]);
@@ -477,7 +477,7 @@
elseif stanza[1].tag == "iq" then
tmp = parseIqStanza(stanza[1], timeStuff, nick);
else
- module:log("info", "unknown stanza subtag in log found. room: %s; day: %s", bareRoomJid, query.year .. "/" .. query.month .. "/" .. query.day);
+ module:log("info", "unknown stanza subtag in log found. room: %s; day: %s", bareRoomJid, year .. "/" .. month .. "/" .. day);
end
if tmp ~= nil then
ret = ret .. tmp
@@ -490,7 +490,7 @@
return generateDayListSiteContentByRoom(bareRoomJid); -- fallback
end
tmp = html.day.body:gsub("###DAY_STUFF###", ret):gsub("###JID###", bareRoomJid);
- tmp = tmp:gsub("###YEAR###", query.year):gsub("###MONTH###", query.month):gsub("###DAY###", query.day);
+ tmp = tmp:gsub("###YEAR###", year):gsub("###MONTH###", month):gsub("###DAY###", day);
tmp = tmp:gsub("###TITLE_STUFF###", html.day.title:gsub("###TITLE###", roomSubject));
tmp = tmp:gsub("###STATUS_CHECKED###", config.showStatus and "checked='checked'" or "");
tmp = tmp:gsub("###JOIN_CHECKED###", config.showJoin and "checked='checked'" or "");
@@ -500,28 +500,50 @@
end
end
+--[[
+local function loggingMucComponents()
+ local n = 0;
+ for component,_ in pairs(muc_hosts) do
+ n = n + 1;
+ end
+ return n;
+end
+]]--
+
function handle_request(method, body, request)
- local query = splitQuery(request.url.query);
- local node, host = grepRoomJid(request.url.path);
+ -- local query = splitQuery(request.url.query);
+ local node, host, day = splitUrl(request.url.path);
+ --[[if host == nil and loggingMucComponents() == 1 then
+ for component,_ in pairs(muc_hosts) do
+ host = component;
+ break;
+ end
+ module:log("debug", "host: %s", tostring(host));
+ end]]--
if node ~= nil and host ~= nil then
local bare = node .. "@" .. host;
- if prosody.hosts[host] ~= nil and prosody.hosts[host].muc ~= nil and prosody.hosts[host].muc.rooms[bare] ~= nil then
- local room = prosody.hosts[host].muc.rooms[bare];
- if request.url.query == nil then
- return createDoc(generateDayListSiteContentByRoom(bare));
+ if prosody.hosts[host] ~= nil and prosody.hosts[host].muc ~= nil then
+ if prosody.hosts[host].muc.rooms[bare] ~= nil then
+ local room = prosody.hosts[host].muc.rooms[bare];
+ if day == nil then
+ return createDoc(generateDayListSiteContentByRoom(bare));
+ else
+ local subject = ""
+ if room._data ~= nil and room._data.subject ~= nil then
+ subject = room._data.subject;
+ end
+ return createDoc(parseDay(bare, subject, day));
+ end
else
- local subject = ""
- if room._data ~= nil and room._data.subject ~= nil then
- subject = room._data.subject;
- end
- return createDoc(parseDay(bare, subject, query));
+ return createDoc(generateRoomListSiteContent(host));
end
+ else
+ return createDoc(generateComponentListSiteContent());
end
elseif host ~= nil then
return createDoc(generateRoomListSiteContent(host));
else
- module:log("debug", "build component list site content")
return createDoc(generateComponentListSiteContent());
end
return;
@@ -529,15 +551,19 @@
function module.load()
config = config_get("*", "core", "muc_log") or {};
- config.showStatus = config.showStatus or true;
- config.showJoin = config.showJoin or true;
+ if config.showStatus == nil then
+ config.showStatus = true;
+ end
+ if config.showJoin == nil then
+ config.showJoin = true;
+ end
httpserver.new_from_config({ config.http_port or true }, handle_request, { base = "muc_log" });
for jid, host in pairs(prosody.hosts) do
if host.muc then
local logging = config_get(jid, "core", "logging");
if logging then
- module:log("debug", "Component enabled: %s", jid);
+ module:log("debug", "component: %s", tostring(jid));
muc_hosts[jid] = true;
end
end
@@ -550,7 +576,7 @@
module:add_event_hook("component-activated", function(component, config)
if config.core.logging == true then
- module:log("debug", "Component enabled: %s", component);
+ module:log("debug", "component: %s", tostring(component));
muc_hosts[component] = true;
end
end);