]>
jfr.im git - irc/SurrealServices/srsv.git/blob - branches/erry-devel/modules/logserv.pm
1 # This file is part of SurrealServices.
3 # SurrealServices is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 # SurrealServices is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with SurrealServices; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 use SrSv
::Process
::InParent
qw(chanlog addchan delchan ev_sjoin ev_join ev_part
23 ev_kick ev_mode ev_nickconn ev_nickchange ev_quit ev_message ev_notice
24 ev_chghost ev_kill ev_topic ev_connect saveconf loadconf join_chans);
26 use SrSv
::Conf2Consts
qw(main);
27 use SrSv
::IRCd
::Event
'addhandler';
28 use SrSv
::IRCd
::State
'initial_synced';
30 use SrSv
::User
::Notice
;
31 use SrSv
::Log
qw( :all );
36 our $lsnick = 'LogServ';
37 my $chanopmode = '+v';
40 agent_connect
($lsnick, 'services', undef, '+pqzBHSD', 'Log Service');
41 agent_join
($lsnick, main_conf_diag
);
42 ircd
::setmode
($lsnick, main_conf_diag
, '+o', $lsnick);
46 my ($cn, @payload) = @_;
47 write_log
("logserv:$cn", '', @payload)
48 # This if allows us to be lazy
49 if defined($chanlist{lc $cn});
54 unless(defined($chanlist{lc $cn})) {
55 open_log
("logserv:$cn", lc($cn).'.log');
56 $chanlist{lc $cn} = 1;
57 agent_join
($lsnick, $cn);
58 ircd
::setmode
($lsnick, $cn, $chanopmode, $lsnick);
59 notice
($user, "Channel $cn will now be logged");
63 notice
($user, "Channel $cn is already being logged");
70 if(defined($chanlist{lc $cn})) {
71 close_log
("logserv:$cn");
72 delete($chanlist{lc $cn});
73 agent_part
($lsnick, $cn, "Channel has been deleted by ".$user->{NICK
});
74 notice
($user, "Channel $cn will not be logged");
78 notice
($user, "Channel $cn is not being logged");
85 addhandler
('SJOIN', undef, undef, 'logserv::ev_sjoin');
87 # ($server, $cn, $ts, $chmodes, $chmodeparms, \@users, \@bans, \@excepts, \@invex);
88 my (undef, $cn, undef, undef, undef, $users, undef, undef, undef) = @_;
89 foreach my $user (@$users) {
90 ev_join
($user->{NICK
}, $cn);
94 addhandler
('JOIN', undef, undef, 'logserv::ev_join');
97 return if is_agent
($nick); # Ignore agent joins.
98 return unless defined($userlist{lc $nick}); # Sometimes we get JOINs after a KILL or QUIT
100 $userlist{lc $nick}{CHANS
}{$cn} = 1;
102 if(initial_synced
()) {
104 foreach my $cn (keys(%{$userlist{lc $nick}{CHANS
}})) {
105 ev_part
($nick, $cn, 'Left all channels');
108 my ($ident, $vhost) = @{$userlist{lc $nick}{INFO
}};
109 chanlog
($cn, "-!- $nick [$ident\@$vhost] has joined $cn");
114 addhandler
('PART', undef, undef, 'logserv::ev_part');
116 my ($nick, $cn, $reason) = @_;
117 return if is_agent
($nick); # Ignore agent parts.
118 return unless defined($userlist{lc $nick}); # Sometimes we get JOINs after a KILL or QUIT
120 delete($userlist{lc $nick}{CHANS
}{$cn});
122 my ($ident, $vhost) = @{$userlist{lc $nick}{INFO
}};
123 chanlog
("$cn", "-!- $nick [$ident\@$vhost] has left $cn [$reason]");
126 addhandler
('KICK', undef, undef, 'logserv::ev_kick');
128 my ($src, $cn, $target, $reason) = @_;
129 return unless defined($userlist{lc $target}); # Sometimes we get JOINs after a KILL or QUIT
130 if(lc $target eq lc $lsnick) {
131 agent_join
($lsnick, $cn);
132 ircd
::setmode
($lsnick, $cn, '+o', $lsnick);
136 delete($userlist{lc $target}{CHANS
}{$cn});
138 chanlog
("$cn", "-!- $target was kicked by $src [$reason]");
141 addhandler
('MODE', undef, undef, 'logserv::ev_mode');
143 my ($src, $cn, $modes, $parms) = @_;
144 return unless initial_synced
();
145 chanlog
("$cn", "-!- mode/$cn [$modes".($parms ? " $parms" : '')."] by $src");
148 addhandler
('NICKCONN', undef, undef, 'logserv::ev_nickconn');
150 my ($nick, $ident, $host, $modes, $vhost, $cloakhost) = @_[0,3,4,7,8,11];
152 if ({modes
::splitumodes
($modes)}->{x
} eq '+') {
153 if(defined($cloakhost)) {
157 # Since we have no desire to do ircd::userhost checks
158 # This makes us dependent on VHP or CLK.
159 # Do we care? Not at the moment.
160 # This should NEVER happen with VHP or CLK.
167 $userlist{lc $nick} = {
168 INFO
=> [$ident, $vhost],
173 addhandler
('NICKCHANGE', undef, undef, 'logserv::ev_nickchange');
175 my ($old, $new) = @_;
176 return unless defined($userlist{lc $old}); # Sometimes we get JOINs after a KILL or QUIT
177 unless (lc($old) eq lc($new)) {
178 $userlist{lc $new} = $userlist{lc $old};
179 delete($userlist{lc $old});
181 foreach my $cn (keys(%{$userlist{lc $new}{CHANS
}})) {
182 chanlog
($cn, "-!- $old is now known as $new");
186 addhandler
('QUIT', undef, undef, 'logserv::ev_quit');
188 my ($nick, $reason) = @_;
189 my ($ident, $vhost) = @{$userlist{lc $nick}{INFO
}};
190 if (initial_synced
()) {
191 foreach my $cn (keys(%{$userlist{lc $nick}{CHANS
}})) {
192 chanlog
($cn, "$nick [$ident\@$vhost] has quit [$reason]");
195 delete($userlist{lc $nick});
198 addhandler
('LOOP_PRIVMSG', undef, qr/^#/, 'logserv::ev_loop_message');
199 sub ev_loop_message
{
200 my ($nick, $cn, $messages) = @_;
202 $channel =~ s/^[+%@&~]+//;
203 return unless defined($chanlist{lc $channel});
204 foreach my $message (@$messages) {
205 if ($message =~ /^\001(\w+)(?: (.*))\001$/i) {
206 my ($ctcp, $payload) = ($1, $2);
207 if($ctcp eq 'ACTION') {
208 $message = "* $nick $payload";
211 $message = "$nick requested CTCP $1 from $cn: $2";
214 $message = "<$nick> $message";
217 chanlog
($channel, @$messages);
219 addhandler
('LOOP_NOTICE', undef, qr/^#/, 'logserv::ev_loop_notice');
221 my ($nick, $cn, $messages) = @_;
223 $channel =~ s/^[+%@&~]+//;
224 return unless defined($chanlist{lc $channel});
225 foreach my $message (@$messages) {
226 $message = "-$nick:$cn- $message";
228 chanlog
($channel, @$messages);
231 addhandler
('PRIVMSG', undef, qr/^#/, 'logserv::ev_message');
233 my ($nick, $cn, $message) = @_;
235 $channel =~ s/^[+%@&~]+//;
236 return unless defined($chanlist{lc $channel});
237 if ($message =~ /^\001(\w+)(?: (.*))\001$/i) {
238 my ($ctcp, $payload) = ($1, $2);
239 if($ctcp eq 'ACTION') {
240 chanlog
($channel, "* $nick $payload");
243 chanlog
($channel, "$nick requested CTCP $1 from $cn: $2");
246 chanlog
($channel, "<$nick> $message");
250 addhandler
('NOTICE', undef, qr/^#/, 'logserv::ev_notice');
252 my ($nick, $cn, $message) = @_;
254 $channel =~ s/^[+%@&~]+//;
255 return unless defined($chanlist{lc $channel});
256 chanlog
($channel, "-$nick:$cn- $message");
259 addhandler
('CHGHOST', undef, undef, 'logserv::ev_chghost');
261 my (undef, $nick, $vhost) = @_;
262 return unless defined($userlist{lc $nick}); # Sometimes we get JOINs after a KILL or QUIT
264 my ($ident, undef) = @{$userlist{lc $nick}{INFO
}};
265 $userlist{lc $nick}{INFO
} = [$ident, $vhost];
270 addhandler
('KILL', undef, undef, 'logserv::ev_kill');
272 my ($src, $target, $reason) = @_;
273 return if is_agent
($target) or !defined($userlist{lc $target}); # Ignore agent kills.
274 my ($ident, $vhost) = @{$userlist{lc $target}{INFO
}};
275 if (initial_synced
()) {
276 foreach my $cn (keys(%{$userlist{lc $target}{CHANS
}})) {
277 chanlog
($cn, "$target [$ident\@$vhost] has quit [Killed ($src ($reason))]");
280 delete($userlist{lc $target});
283 addhandler
('TOPIC', undef, undef, 'logserv::ev_topic');
285 my ($src, $cn, $setter, undef, $topic) = @_;
286 # We don't care about the timestamp
287 return unless initial_synced
();
288 chanlog
($cn, "$src changed the topic of $cn to: $topic".($setter ne $src ? " ($setter)" : ''));
291 # Internal Only functions.
294 my @channels = keys(%chanlist);
295 Storable
::nstore
(\
@channels, "config/logserv/chans.conf");
299 (-d
"config/logserv") or mkdir "config/logserv";
300 return unless(-f
"config/logserv/chans.conf");
301 my @channels = @{Storable
::retrieve
("config/logserv/chans.conf")};
302 foreach my $cn (@channels) {
303 $chanlist{lc $cn} = 1;
308 foreach my $cn (keys(%chanlist)) {
309 open_log
("logserv:$cn", lc($cn).'.log');
310 agent_join
($lsnick, $cn);
311 ircd
::setmode
($lsnick, $cn, $chanopmode, $lsnick);
318 sub unload
{ saveconf
(); }