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