diff options
Diffstat (limited to 'scripts/kills.pl')
| -rw-r--r-- | scripts/kills.pl | 102 | 
1 files changed, 102 insertions, 0 deletions
| diff --git a/scripts/kills.pl b/scripts/kills.pl new file mode 100644 index 0000000..7ed2d53 --- /dev/null +++ b/scripts/kills.pl @@ -0,0 +1,102 @@ +# Display kills with more understandable messages. +# for irssi 0.7.98 by Timo Sirainen + +# There's one kind of nick collision this script doesn't handle - if the +# collision is detected by the server you're connected to, it won't use +# kill as quit reason, but "Nick collision(new)" or "..(old)". This is pretty +# easy to understand already, happens hardly ever(?) and it can be faked +# so I thought better not change it to kill message. + +# There's a pretty good explanation of (ircnet) ircd's server kills in +# http://www.irc.org/tech_docs/ircnet/kills.html + +use Irssi; +use vars qw($VERSION %IRSSI); + +$VERSION = "1.00"; +%IRSSI = ( +    authors	=> 'Timo Sirainen', +    name	=> 'kills', +    description	=> 'Displays kills with more understandable messages', +    license	=> 'Public Domain', +    changed	=> 'Sun Mar 10 23:18 EET 2002' +); + +Irssi::theme_register([ +  'kill_public', '{channick $0} {chanhost $1} killed by {nick $2}$3 {reason $4}' +]); + +sub msg_quit { +  my ($server, $nick, $addr, $data) = @_; + +  my $localkill; +  if ($data =~ /^Killed \(([^ ]*) \((.*)\)\)$/) { +    # remote kill +    $localkill = 0; +  } elsif ($data =~ /^Local Kill by ([^ ]*) \((.*)\)/) { +    # local kill +    $localkill = 1; +  } else { +    return; +  } + +  my $killer = $1; +  my $killmsg = $2; +  my $msg = "\002Nick collision\002: "; + +  my @printargs = (); +  if ($killmsg =~ /([^ ]*) != (.*)/) { +    # 1 != 2 +    my $server1 = $1, $server2 = $2; + +    $server1 =~ s/([^\[]*)\[([^\]]*)\]/\1/; +    $msg .= "$2 != $server2"; +  } elsif ($killmsg =~ /([^ ]*) <- (.*)/) { +    # 1 <- 2 +    my $server1 = $1, $server2 = $2; + +    if ($server1 =~ /^\(/) { +      # (addr1)server1 <- (add2)server2 +      $server1 =~ s/^\(([^\)]*)\)//; +      my $nick1 = $1; +      $server2 =~ s/^\(([^\)]*)\)//; +      my $nick2 = $1; + +      $msg .= "server $server1"; +      $msg .= " (nick from $nick1)" if $nick1; +      $msg .= " <- "; +      $msg .= "\002$server2\002"; +      $msg .= " (nick from \002$nick2\002)" if $nick2; +    } elsif ($server1 =~ /\)$/ || $server2 =~ /\)$/) { +      # server1(nick) <- server2 +      # server1 <- server2(nick) +      $server1 =~ s/\(([^\)]*)\)$//; +      my $oldnick = $1; +      $server2 =~ s/\(([^\)]*)\)$//; +      $oldnick = $1 if $1; +      $msg = "\002Nick change collision\002: $server1 <- \002$server2\002 (old nick \002$oldnick\002)"; +    } else { +      # server1 <- server2 +      $msg = "\002Nick/server collision\002: $server1 <- \002$server2\002"; +    } +  } else { +    # something else, just show it as-is +    $msg = $killmsg; +  } + +  @list = $server->nicks_get_same($nick); +  while (@list) { +    $channel = $list[0]; +    shift @list; +    # skip nick record +    shift @list; + +    $channel->printformat(MSGLEVEL_QUITS, 'kill_public', +                          $nick, $addr, $killer, +			  $localkill ? " (local)" : "", $msg); +  } + +  Irssi::signal_stop(); +} + +Irssi::signal_add('message quit', 'msg_quit'); | 
