Mercurial > prosody-modules
comparison mod_message_logging/mod_message_logging.lua @ 1500:045720a5fccd
mod_message_logging: Improve logging when loaded onto a MUC host
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 07 Sep 2014 08:08:09 +0100 |
| parents | 92f3b4d81b52 |
| children | 4b55110b0aa8 |
comparison
equal
deleted
inserted
replaced
| 1499:698686dca982 | 1500:045720a5fccd |
|---|---|
| 48 open_files[jid] = nil; | 48 open_files[jid] = nil; |
| 49 end | 49 end |
| 50 end | 50 end |
| 51 module:hook_global("logging-reloaded", close_open_files); | 51 module:hook_global("logging-reloaded", close_open_files); |
| 52 | 52 |
| 53 local function write_to_log(log_jid, jid, prefix, body) | |
| 54 if not body then return; end | |
| 55 local f = open_files[log_jid]; | |
| 56 if not f then return; end | |
| 57 body = body:gsub("\n", "\n "); -- Indent newlines | |
| 58 f:write(prefix or "", prefix and ": " or "", jid, ": ", body, "\n"); | |
| 59 f:flush(); | |
| 60 end | |
| 61 | |
| 53 local function handle_incoming_message(event) | 62 local function handle_incoming_message(event) |
| 54 local origin, stanza = event.origin, event.stanza; | 63 local origin, stanza = event.origin, event.stanza; |
| 55 local message_type = stanza.attr.type; | 64 local message_type = stanza.attr.type; |
| 56 | 65 |
| 57 if message_type == "error" then return; end | 66 if message_type == "error" then return; end |
| 58 | 67 |
| 59 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to or stanza.attr.from); | 68 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to or stanza.attr.from); |
| 60 local body = stanza:get_child("body"); | |
| 61 if not body then return; end | |
| 62 body = body:get_text(); | |
| 63 | |
| 64 local f = open_files[to]; | |
| 65 if not f then return; end | |
| 66 if message_type == "groupchat" then | 69 if message_type == "groupchat" then |
| 67 -- Add the nickname | 70 from = from.." <"..select(3, jid_split(stanza.attr.from))..">"; |
| 68 from = from.." <"..(select(3, jid_split(stanza.attr.from)) or "")..">"; | |
| 69 end | 71 end |
| 70 body = body:gsub("\n", "\n "); -- Indent newlines | 72 write_to_log(to, from, "RECV", stanza:get_child_text("body")); |
| 71 f:write("RECV: ", from, ": ", body, "\n"); | |
| 72 f:flush(); | |
| 73 end | 73 end |
| 74 | 74 |
| 75 local function handle_outgoing_message(event) | 75 local function handle_outgoing_message(event) |
| 76 local origin, stanza = event.origin, event.stanza; | 76 local origin, stanza = event.origin, event.stanza; |
| 77 local message_type = stanza.attr.type; | 77 local message_type = stanza.attr.type; |
| 78 | 78 |
| 79 if message_type == "error" or message_type == "groupchat" then return; end | 79 if message_type == "error" then return; end |
| 80 | 80 |
| 81 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to or origin.full_jid); | 81 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to or origin.full_jid); |
| 82 local body = stanza:get_child("body"); | 82 write_to_log(from, to, "SEND", stanza:get_child_text("body")); |
| 83 if not body then return; end | |
| 84 body = body:get_text(); | |
| 85 | |
| 86 local f = open_files[from]; | |
| 87 if not f then return; end | |
| 88 body = body:gsub("\n", "\n "); -- Indent newlines | |
| 89 f:write("SEND: ", to, ": ", body, "\n"); | |
| 90 f:flush(); | |
| 91 end | 83 end |
| 92 | 84 |
| 93 | 85 local function handle_muc_message(event) |
| 86 local stanza = event.stanza; | |
| 87 if stanza.attr.type ~= "groupchat" then return; end | |
| 88 local room = event.room or hosts[select(2, jid_split(stanza.attr.to))].modules.muc.rooms[stanza.attr.to]; | |
| 89 if not room then return; end | |
| 90 local nick = select(3, jid_split(room._jid_nick[stanza.attr.from])); | |
| 91 if not nick then return; end | |
| 92 write_to_log(room.jid, jid_bare(stanza.attr.from).." <"..nick..">", "MESG", stanza:get_child_text("body")); | |
| 93 end | |
| 94 | 94 |
| 95 function module.add_host(module) | 95 function module.add_host(module) |
| 96 local host_base_path = get_host_path(module.host); | 96 local host_base_path = get_host_path(module.host); |
| 97 if not stat(host_base_path) then | 97 if not stat(host_base_path) then |
| 98 mkdir(host_base_path); | 98 mkdir(host_base_path); |
| 99 end | 99 end |
| 100 | 100 |
| 101 module:hook("message/bare", handle_incoming_message, 1); | 101 if hosts[module.host].modules.muc then |
| 102 module:hook("message/full", handle_incoming_message, 1); | 102 module:hook("message/bare", handle_muc_message, 1); |
| 103 | 103 else |
| 104 module:hook("pre-message/bare", handle_outgoing_message, 1); | 104 module:hook("message/bare", handle_incoming_message, 1); |
| 105 module:hook("pre-message/full", handle_outgoing_message, 1); | 105 module:hook("message/full", handle_incoming_message, 1); |
| 106 module:hook("pre-message/host", handle_outgoing_message, 1); | 106 |
| 107 module:hook("pre-message/bare", handle_outgoing_message, 1); | |
| 108 module:hook("pre-message/full", handle_outgoing_message, 1); | |
| 109 module:hook("pre-message/host", handle_outgoing_message, 1); | |
| 110 end | |
| 107 | 111 |
| 108 end | 112 end |
| 109 | 113 |
| 110 function module.command(arg) | 114 function module.command(arg) |
| 111 local command = table.remove(arg, 1); | 115 local command = table.remove(arg, 1); |
