-
Notifications
You must be signed in to change notification settings - Fork 0
/
mod_big_brother.lua
127 lines (98 loc) · 4.25 KB
/
mod_big_brother.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
-- mod_big_brother.lua - A big brother logger for Prosody
--
-- Author: Bastian Rieck <bastian@rieck.ru>
-- Licence: FreeBSD
--
-- Copyright (c) 2013, Bastian Rieck
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
-- Redistributions of source code must retain the above copyright notice, this
-- list of conditions and the following disclaimer. Redistributions in binary
-- form must reproduce the above copyright notice, this list of conditions and the
-- following disclaimer in the documentation and/or other materials provided with
-- the distribution.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
local jid_bare = require "util.jid".bare;
local jid_split = require "util.jid".split;
local mkdir = require "util.pposix".mkdir;
local data_manager = require "util.datamanager";
local prosody = _G.prosody;
local function get_or_create_log_path( local_user, remote_user )
-- TODO: This is ugly, but I don't know how to force mkdir to create
-- complete paths.
mkdir( prosody.paths[ "data" ] .. "/logs/" );
mkdir( prosody.paths[ "data" ] .. "/logs/" .. local_user );
mkdir( prosody.paths[ "data" ] .. "/logs/" .. local_user .. "/" .. remote_user );
return( prosody.paths[ "data" ] .. "/logs/" .. local_user .. "/" .. remote_user );
end
local function get_log_filename()
return( os.date( "%Y-%m-%d" ) .. ".txt" );
end
local function handle_incoming_message(event)
local session = event.origin;
local stanza = event.stanza;
local message_type = stanza.attr.type;
if message_type == "error" or message_type == "groupchat" then
return;
end
local from = jid_bare( stanza.attr.from );
local to = jid_bare( stanza.attr.to );
local message_body = stanza:get_child( "body" );
if not message_body then
return;
end
message_body = message_body:get_text();
local username = session.username;
local log_path = get_or_create_log_path( username, from );
local log_name = get_log_filename();
local f = io.open( log_path .. "/" .. log_name, "a+" );
-- Force indent
message_body = message_body:gsub( "\n", "\n" .. (( " " )):rep(#from+4) );
f:write( "IN," .. from .. "," .. message_body .. "\n" );
f:close();
end
local function handle_outgoing_message( event )
local session = event.origin;
local stanza = event.stanza;
local message_type = stanza.attr.type;
if message_type == "error" or message_type == "groupchat" then
return;
end
local from = jid_bare( stanza.attr.from );
local to = jid_bare( stanza.attr.to );
-- If messages are sent to self, they do not necessarily contain a "to"
-- attribute.
if not to then
to = from;
end
local message_body = stanza:get_child( "body" );
if not message_body then
return;
end
message_body = message_body:get_text();
local username = session.username;
local log_path = get_or_create_log_path( username, to );
local log_name = get_log_filename();
local f = io.open( log_path .. "/" .. log_name, "a+" );
-- Force indent
message_body = message_body:gsub( "\n", "\n" .. (( " " )):rep(#to+5) );
f:write( "OUT," .. to .. "," .. message_body .. "\n" );
f:close();
end
module:hook("message/bare", handle_incoming_message, 1);
module:hook("message/full", handle_incoming_message, 1);
module:hook("pre-message/bare", handle_outgoing_message, 1);
module:hook("pre-message/full", handle_outgoing_message, 1);
module:hook("pre-message/host", handle_outgoing_message, 1);