Added SILC Thread Queue API
[runtime.git] / apps / irssi / scripts / 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');