html/kills.pl
1 # Display kills with more understandable messages.
2 # for irssi 0.7.98 by Timo Sirainen
3
4 # There's one kind of nick collision this script doesn't handle - if the
5 # collision is detected by the server you're connected to, it won't use
6 # kill as quit reason, but "Nick collision(new)" or "..(old)". This is pretty
7 # easy to understand already, happens hardly ever(?) and it can be faked
8 # so I thought better not change it to kill message.
9
10 # There's a pretty good explanation of (ircnet) ircd's server kills in
11 # http://www.irc.org/tech_docs/ircnet/kills.html
12
13 use Irssi;
14 use vars qw($VERSION %IRSSI);
15
16 $VERSION = "1.00";
17 %IRSSI = (
18 authors => 'Timo Sirainen',
19 name => 'kills',
20 description => 'Displays kills with more understandable messages',
21 license => 'Public Domain',
22 changed => 'Sun Mar 10 23:18 EET 2002'
23 );
24
25 Irssi::theme_register([
26 'kill_public', '{channick $0} {chanhost $1} killed by {nick $2}$3 {reason $4}'
27 ]);
28
29 sub msg_quit {
30 my ($server, $nick, $addr, $data) = @_;
31
32 my $localkill;
33 if ($data =~ /^Killed \(([^ ]*) \((.*)\)\)$/) {
34 # remote kill
35 $localkill = 0;
36 } elsif ($data =~ /^Local Kill by ([^ ]*) \((.*)\)/) {
37 # local kill
38 $localkill = 1;
39 } else {
40 return;
41 }
42
43 my $killer = $1;
44 my $killmsg = $2;
45 my $msg = "\002Nick collision\002: ";
46
47 my @printargs = ();
48 if ($killmsg =~ /([^ ]*) != (.*)/) {
49 # 1 != 2
50 my $server1 = $1, $server2 = $2;
51
52 $server1 =~ s/([^\[]*)\[([^\]]*)\]/\1/;
53 $msg .= "$2 != $server2";
54 } elsif ($killmsg =~ /([^ ]*) <- (.*)/) {
55 # 1 <- 2
56 my $server1 = $1, $server2 = $2;
57
58 if ($server1 =~ /^\(/) {
59 # (addr1)server1 <- (add2)server2
60 $server1 =~ s/^\(([^\)]*)\)//;
61 my $nick1 = $1;
62 $server2 =~ s/^\(([^\)]*)\)//;
63 my $nick2 = $1;
64
65 $msg .= "server $server1";
66 $msg .= " (nick from $nick1)" if $nick1;
67 $msg .= " <- ";
68 $msg .= "\002$server2\002";
69 $msg .= " (nick from \002$nick2\002)" if $nick2;
70 } elsif ($server1 =~ /\)$/ || $server2 =~ /\)$/) {
71 # server1(nick) <- server2
72 # server1 <- server2(nick)
73 $server1 =~ s/\(([^\)]*)\)$//;
74 my $oldnick = $1;
75 $server2 =~ s/\(([^\)]*)\)$//;
76 $oldnick = $1 if $1;
77 $msg = "\002Nick change collision\002: $server1 <- \002$server2\002 (old nick \002$oldnick\002)";
78 } else {
79 # server1 <- server2
80 $msg = "\002Nick/server collision\002: $server1 <- \002$server2\002";
81 }
82 } else {
83 # something else, just show it as-is
84 $msg = $killmsg;
85 }
86
87 @list = $server->nicks_get_same($nick);
88 while (@list) {
89 $channel = $list[0];
90 shift @list;
91 # skip nick record
92 shift @list;
93
94 $channel->printformat(MSGLEVEL_QUITS, 'kill_public',
95 $nick, $addr, $killer,
96 $localkill ? " (local)" : "", $msg);
97 }
98
99 Irssi::signal_stop();
100 }
101
102 Irssi::signal_add('message quit', 'msg_quit');