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
13use strict;
14use Irssi;
15use vars qw($VERSION %IRSSI);
16
17$VERSION = "1.00";
18%IRSSI = (
19    authors	=> 'Timo Sirainen',
20    name	=> 'kills',
21    description	=> 'Displays kills with more understandable messages',
22    license	=> 'Public Domain',
23    changed	=> 'Sun Mar 10 23:18 EET 2002'
24);
25
26Irssi::theme_register([
27  'kill_public', '{channick $0} {chanhost $1} killed by {nick $2}$3 {reason $4}'
28]);
29
30sub msg_quit {
31  my ($server, $nick, $addr, $data) = @_;
32
33  my $localkill;
34  if ($data =~ /^Killed \(([^ ]*) \((.*)\)\)$/) {
35    # remote kill
36    $localkill = 0;
37  } elsif ($data =~ /^Local Kill by ([^ ]*) \((.*)\)/) {
38    # local kill
39    $localkill = 1;
40  } else {
41    return;
42  }
43
44  my $killer = $1;
45  my $killmsg = $2;
46  my $msg = "\002Nick collision\002: ";
47
48  my @printargs = ();
49  if ($killmsg =~ /([^ ]*) != (.*)/) {
50    # 1 != 2
51    my $server1 = $1, my $server2 = $2;
52
53    $server1 =~ s/([^\[]*)\[([^\]]*)\]/\1/;
54    $msg .= "$2 != $server2";
55  } elsif ($killmsg =~ /([^ ]*) <- (.*)/) {
56    # 1 <- 2
57    my $server1 = $1, my $server2 = $2;
58
59    if ($server1 =~ /^\(/) {
60      # (addr1)server1 <- (add2)server2
61      $server1 =~ s/^\(([^\)]*)\)//;
62      my $nick1 = $1;
63      $server2 =~ s/^\(([^\)]*)\)//;
64      my $nick2 = $1;
65
66      $msg .= "server $server1";
67      $msg .= " (nick from $nick1)" if $nick1;
68      $msg .= " <- ";
69      $msg .= "\002$server2\002";
70      $msg .= " (nick from \002$nick2\002)" if $nick2;
71    } elsif ($server1 =~ /\)$/ || $server2 =~ /\)$/) {
72      # server1(nick) <- server2
73      # server1 <- server2(nick)
74      $server1 =~ s/\(([^\)]*)\)$//;
75      my $oldnick = $1;
76      $server2 =~ s/\(([^\)]*)\)$//;
77      $oldnick = $1 if $1;
78      $msg = "\002Nick change collision\002: $server1 <- \002$server2\002 (old nick \002$oldnick\002)";
79    } else {
80      # server1 <- server2
81      $msg = "\002Nick/server collision\002: $server1 <- \002$server2\002";
82    }
83  } else {
84    # something else, just show it as-is
85    $msg = $killmsg;
86  }
87
88  my @list = $server->nicks_get_same($nick);
89  while (@list) {
90    my $channel = $list[0];
91    shift @list;
92    # skip nick record
93    shift @list;
94
95    $channel->printformat(MSGLEVEL_QUITS, 'kill_public',
96                          $nick, $addr, $killer,
97			  $localkill ? " (local)" : "", $msg);
98  }
99
100  Irssi::signal_stop();
101}
102
103Irssi::signal_add('message quit', 'msg_quit');
104