# HG changeset patch # User Thilo Cestonaro # Date 1255983357 -7200 # Node ID e9de45beaf5e8ffac360c4a7555b602db4b15d75 # Parent d9749ed44f6e5152b788aa29d07681b7943c6636 mod_muc_log: templify the html stuff diff -r d9749ed44f6e -r e9de45beaf5e mod_muc_log/mod_muc_log.lua --- a/mod_muc_log/mod_muc_log.lua Mon Oct 19 16:06:48 2009 +0200 +++ b/mod_muc_log/mod_muc_log.lua Mon Oct 19 22:15:57 2009 +0200 @@ -8,9 +8,10 @@ local bareJid = require "util.jid".bare; local config_get = require "core.configmanager".get; local httpserver = require "net.httpserver"; --- local dump = require "util.logger".dump; +local serialize = require "util.serialization".serialize; local config = {}; + --[[ LuaFileSystem * URL: http://www.keplerproject.org/luafilesystem/index.html * Install: luarocks install luafilesystem @@ -19,6 +20,72 @@ local lom = require "lxp.lom"; + +--[[ +* Default templates for the html output. +]]-- +local html = {}; +html.doc = [[ + + muc_log + + + +###BODY_STUFF### + +]]; + +html.hosts = {}; +html.hosts.bit = [[###JID###
]] +html.hosts.body = [[

Rooms hosted on this server:


+###HOSTS_STUFF### +


]]; + +html.days = {}; +html.days.bit = [[20###YEAR###/###MONTH###/###DAY###
]]; +html.days.body = [[

available logged days of room: ###JID###


+###DAYS_STUFF### +


]]; + +html.day = {}; +html.day.time = [[[###TIME###] ]]; -- the one ####TIME### need to stay! it will evaluate to e.g. #09:10:56 which is an anker then +html.day.presence = {}; +html.day.presence.join = [[###TIME_STUFF### *** ###NICK### joins the room
]]; +html.day.presence.leave = [[###TIME_STUFF### *** ###NICK### leaves the room
]]; +html.day.presence.statusChange = [[###TIME_STUFF### *** ###NICK### changed his/her status to: ###STATUS###
]]; +html.day.message = [[###TIME_STUFF###<###NICK###> ###MSG###
]]; +html.day.titleChange = [[###TIME_STUFF### *** ###NICK### change title to: ###MSG###
]]; +html.day.kick = [[###TIME_STUFF### *** ###NICK### kicked ###VICTIM###
]]; +html.day.bann = [[###TIME_STUFF### *** ###NICK### banned ###VICTIM###
]]; +html.day.body = [[

room ###JID### logging of 20###YEAR###/###MONTH###/###DAY###


+###DAY_STUFF### +


]]; + +html.help = [[ +MUC logging is not configured correctly.
+Here is a example config:
+Component "rooms.example.com" "muc"
+  modules_enabled = {
+    "muc_log";
+  }
+  muc_log = {
+    folder = "/opt/local/var/log/prosody/rooms";
+    http_port = "/opt/local/var/log/prosody/rooms";
+  }
+]]; + function validateLogFolder() if config.folder == nil then module:log("warn", "muc_log folder isn't configured. configure it please!"); @@ -86,24 +153,13 @@ end function createDoc(body) - return [[ - - muc_log - - - - ]] .. tostring(body) .. [[ - - ]]; + return html.doc:gsub("###BODY_STUFF###", body); +end + +local function htmlEscape(t) + t = t:gsub("\n", "
"); + -- TODO link text into klickable link and such stuff + return t; end function splitQuery(query) @@ -141,30 +197,38 @@ end local function generateRoomListSiteContent() - local ret = "

Rooms hosted on this server:


"; + local rooms = ""; for host, config in pairs(prosody.hosts) do if prosody.hosts[host].muc ~= nil then for jid, room in pairs(prosody.hosts[host].muc.rooms) do - ret = ret .. "" .. jid .."
\n"; + rooms = rooms .. html.hosts.bit:gsub("###JID###", jid); end end end - return ret .. "


"; + + return html.hosts.body:gsub("###HOSTS_STUFF###", rooms); end local function generateDayListSiteContentByRoom(bareRoomJid) - local ret = ""; + local days = ""; + local tmp; for file in lfs.dir(config.folder) do local year, month, day = file:match("^(%d%d)(%d%d)(%d%d)_" .. bareRoomJid .. ".log"); if year ~= nil and month ~= nil and day ~= nil and year ~= "" and month ~= "" and day ~= "" then - ret = "20" .. year .. "/" .. month .. "/" .. day .. "
\n" .. ret; + tmp = html.days.bit; + tmp = tmp:gsub("###JID###", bareRoomJid); + tmp = tmp:gsub("###YEAR###", year); + tmp = tmp:gsub("###MONTH###", month); + tmp = tmp:gsub("###DAY###", day); + days = tmp .. days; end end - if ret ~= "" then - return "

available logged days of room: " .. bareRoomJid .. "


" .. ret .. "


"; + if days ~= "" then + tmp = html.days.body:gsub("###DAYS_STUFF###", days); + return tmp:gsub("###JID###", bareRoomJid); else return generateRoomListSiteContent(); -- fallback end @@ -175,6 +239,7 @@ local year; local month; local day; + local tmp; for _,str in ipairs(query) do local name, value; @@ -199,25 +264,33 @@ if parsed ~= nil then for _,stanza in ipairs(parsed) do if stanza.attr ~= nil and stanza.attr.time ~= nil then - local tmp = "[" .. stanza.attr.time .. "] "; + local timeStuff = html.day.time:gsub("###TIME###", stanza.attr.time); if stanza[1] ~= nil then local nick; + + -- grep nick from "from" resource if stanza[1].attr.from ~= nil then nick = stanza[1].attr.from:match("/(.+)$"); - end + end + if stanza[1].tag == "presence" and nick ~= nil then + if stanza[1].attr.type == nil then - ret = ret .. tmp .. " *** " .. nick .. " joins the room
\n"; + tmp = html.day.presence.join:gsub("###TIME_STUFF###", timeStuff); + ret = ret .. tmp:gsub("###NICK###", nick); elseif stanza[1].attr.type ~= nil and stanza[1].attr.type == "unavailable" then - ret = ret .. tmp .. " *** " .. nick .. " leaves the room
\n"; + tmp = html.day.presence.leave:gsub("###TIME_STUFF###", timeStuff); + ret = ret .. tmp:gsub("###NICK###", nick); else - ret = ret .. tmp .. " *** " .. nick .. " changed his/her status to: " .. stanza[1].attr.type .. "
\n"; + tmp = html.day.presence.leave:gsub("###TIME_STUFF###", timeStuff); + tmp = tmp:gsub("###STATUS###", stanza[1].attr.type); + ret = ret .. tmp:gsub("###NICK###", nick); end elseif stanza[1].tag == "message" then local body; for _,tag in ipairs(stanza[1]) do if tag.tag == "body" then - body = tag[1]:gsub("\n", "
\n"); + body = htmlEscape(tag[1]); if nick ~= nil then break; end @@ -229,7 +302,9 @@ end end if nick ~= nil and body ~= nil then - ret = ret .. tmp .. "<" .. nick .. "> " .. body .. "
\n"; + tmp = html.day.message:gsub("###TIME_STUFF###", timeStuff); + tmp = tmp:gsub("###NICK###", nick); + ret = ret .. tmp:gsub("###MSG###", body); end else module:log("info", "unknown stanza subtag in log found. room: %s; day: %s", bareRoomJid, year .. "/" .. month .. "/" .. day); @@ -244,26 +319,24 @@ else ret = err; end - return "

room " .. bareRoomJid .. " logging of 20" .. year .. "/" .. month .. "/" .. day .. "


" .. ret .. "


"; + tmp = html.day.body:gsub("###DAY_STUFF###", ret); + tmp = tmp:gsub("###JID###", bareRoomJid); + tmp = tmp:gsub("###YEAR###", year); + tmp = tmp:gsub("###MONTH###", month); + tmp = tmp:gsub("###DAY###", day); + return tmp; else return generateDayListSiteContentByRoom(bareRoomJid); -- fallback end end function handle_request(method, body, request) + module:log("debug", "got a request ...") local query = splitQuery(request.url.query); local node, host = grepRoomJid(request.url.path); if validateLogFolder() == false then - return createDoc([[ - MUC logging is not configured correctly. Add a section to Host * "muc_log" and configure the value for the logging "folder".
- Like:
- Host "*"
- ....
-     muc_log = {
-         folder = "/opt/local/var/log/prosody/rooms";
-     }
- ]]); + return createDoc(html.help); end if node ~= nil and host ~= nil then local bare = node .. "@" .. host; @@ -284,6 +357,7 @@ end config = config_get(module:get_host(), "core", "muc_log"); +module:log("debug", serialize(config)); httpserver.new_from_config({ config.http_port or true }, handle_request, { base = "muc_log" });