mirror of
https://github.com/irssi/irssi.git
synced 2024-10-27 05:20:20 -04:00
103 lines
2.8 KiB
Perl
103 lines
2.8 KiB
Perl
|
# 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');
|