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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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