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');