Software /
code /
prosody-modules
Annotate
mod_message_logging/mod_message_logging.lua @ 1268:854a3933cfcd
mod_muc_log_http: URL-encode room names. This allows special characters in room names to work. Ideally this escaping shouldn’t be done in the user visible content, but the module’s template system doesn’t currently allow that.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 04 Jan 2014 16:50:57 -0500 |
parent | 1007:ba220790a59c |
child | 1343:7dbde05b48a9 |
rev | line source |
---|---|
1007
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 module:set_global(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local jid_bare = require "util.jid".bare; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 local jid_split = require "util.jid".split; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 local stat, mkdir = require "lfs".attributes, require "lfs".mkdir; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 -- Get a filesystem-safe string |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 local function fsencode_char(c) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 return ("%%%02x"):format(c:byte()); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local function fsencode(s) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 return (s:gsub("[^%w._-@]", fsencode_char):gsub("^%.", "_")); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local log_base_path = module:get_option("message_logging_dir", prosody.paths.data.."/message_logs"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 mkdir(log_base_path); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 local function get_host_path(host) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 return log_base_path.."/"..fsencode(host); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 local function get_user_path(jid) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 local username, host = jid_split(jid); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 local base = get_host_path(host)..os.date("/%Y-%m-%d"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 if not stat(base) then |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 mkdir(base); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 return base.."/"..fsencode(username)..".msglog"; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 local open_files_mt = { __index = function (open_files, jid) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 local f, err = io.open(get_user_path(jid), "a+"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 if not f then |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 module:log("error", "Failed to open message log for writing [%s]: %s", jid, err); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 rawset(open_files, jid, f); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 return f; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 end }; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 -- [user@host] = filehandle |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 local open_files = setmetatable({}, open_files_mt); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 function close_open_files() |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 module:log("debug", "Closing all open files"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 for jid, filehandle in pairs(open_files) do |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 filehandle:close(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 open_files[jid] = nil; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 module:hook_global("logging-reloaded", close_open_files); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 local function handle_incoming_message(event) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 local origin, stanza = event.origin, event.stanza; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 local message_type = stanza.attr.type; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 if message_type == "error" then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 local body = stanza:get_child("body"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 if not body then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 body = body:get_text(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 local f = open_files[to]; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 if not f then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 if message_type == "groupchat" then |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 -- Add the nickname |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 from = from.." <"..(select(3, jid_split(stanza.attr.from)) or "")..">"; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 body = body:gsub("\n", "\n "); -- Indent newlines |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 f:write("RECV: ", from, ": ", body, "\n"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 f:flush(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 local function handle_outgoing_message(event) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 local origin, stanza = event.origin, event.stanza; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 local message_type = stanza.attr.type; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 if message_type == "error" or message_type == "groupchat" then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 local from, to = jid_bare(stanza.attr.from), jid_bare(stanza.attr.to); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 local body = stanza:get_child("body"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 if not body then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 body = body:get_text(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 local f = open_files[from]; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 if not f then return; end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 body = body:gsub("\n", "\n "); -- Indent newlines |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 f:write("SEND: ", to, ": ", body, "\n"); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 f:flush(); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 function module.add_host(module) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 local host_base_path = get_host_path(module.host); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 if not stat(host_base_path) then |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 mkdir(host_base_path); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 module:hook("message/bare", handle_incoming_message, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 module:hook("message/full", handle_incoming_message, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 module:hook("pre-message/bare", handle_outgoing_message, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 module:hook("pre-message/full", handle_outgoing_message, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 module:hook("pre-message/host", handle_outgoing_message, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 function module.command(arg) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 local command = table.remove(arg, 1); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 if command == "path" then |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 print(get_user_path(arg[1])); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 else |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 io.stderr:write("Unrecognised command: ", command); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 return 1; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 return 0; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 function module.save() |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 return { open_files = open_files }; |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 end |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 function module.restore(saved) |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 open_files = setmetatable(saved.open_files or {}, open_files_mt); |
ba220790a59c
mod_message_logging: New module to log user conversations to text files
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 end |