rs.pl
use strict;
use vars qw($VERSION %IRSSI);
$VERSION = '1.0';
%IRSSI = (
authors => 'Valentin Batz',
contact => 'vb@g-23.org',
name => 'Random slapper based on random kick',
description => '/RS slaps random nick from all on channel',
license => 'GPLv2',
url => 'http://www.oberkommando.org/~senneth/irssi/scripts/',
revision => '$LastChangedRevision: 440 $',
changed => '$LastChangedDate: 2006-09-18 15:29:24 +0200 (Mo, 18 Sep 2006) $',
version => $VERSION,
);
my @slappers;
my $slapfile=glob '~/.irssi/slaps.txt';
sub expand {
my ($string, %format) = @_;
my ($exp, $repl);
$string =~ s/%$exp/$repl/g while (($exp, $repl) = each(%format));
return $string;
}
sub cmd_rs {
my ($args, $server, $chan) = @_;
my @nicks;
for my $hash ($chan->nicks()) {
push @nicks, $hash;
}
my $nnum = scalar(@nicks);
return if ($nnum == 1);
my $victim;
do {
$victim = $nicks[rand($nnum)]->{nick};
} while ($victim eq $server->{nick});
$nnum=scalar(@slappers);
my $slapmsg= @slappers[rand($nnum)];
if ($slapmsg=~//) {
$slapmsg=@slappers[rand($nnum)];
}
$slapmsg=~s/[\r|\n]//ig;
$slapmsg=~s/<nick>/$victim/g;
my $rnd=sprintf("%d",rand(990)+10);
$slapmsg=expand($slapmsg,
"R",$rnd);
Irssi::active_win()->command("me $slapmsg");
}
sub cmd_slap {
my ($data, $server, $chan) = @_;
if ( $data =~ m/^-yes/i ) {
Irssi::command_runsub ('slap', $data, $server, $chan);
return;
}
my ($victims, $slapper) = split (/ /, $data, 2);
unless ($chan && $chan->{type} eq "CHANNEL") {
Irssi::print("Not a channel window");
return;
}
return unless $victims;
return if ( $victims eq '*');
my $slapmsg;
foreach my $victim (split(/\,/,$victims)) {
my $nnum=scalar(@slappers);
$slapmsg = 'slaps <nick> around with '.$slapper if $slapper;
if (!$slapmsg) {
$slapmsg=@slappers[rand($nnum)];
}
$slapmsg=~s/[\r|\n]//ig;
$slapmsg=~s/<nick>/$victim/g;
my $rnd=sprintf("%d",rand(990)+10);
$slapmsg=expand($slapmsg,"R",$rnd);
$chan->command("me $slapmsg");
$slapmsg = undef;
}
}
sub cmd_slap_all {
my ($data, $server, $chan) = @_;
my ($victims, $slapper) = split (/ /, $data, 2);
if ($victims eq '*') {
my @victimlist;
foreach my $nick ( sort ( $chan->nicks() ) ) {
next if ( $nick->{'nick'} eq $server->{'nick'} );
push ( @victimlist, $nick->{'nick'} );
}
$victims = join(',', @victimlist);
} else {
return;
}
my $slapmsg;
foreach my $victim (split(/\,/,$victims)) {
my $nnum=scalar(@slappers);
$slapmsg = 'slaps <nick> around with '.$slapper if $slapper;
if (!$slapmsg) {
$slapmsg=@slappers[rand($nnum)];
}
$slapmsg=~s/[\r|\n]//ig;
$slapmsg=~s/<nick>/$victim/g;
my $rnd=sprintf("%d",rand(990)+10);
$slapmsg=expand($slapmsg,"R",$rnd);
$chan->command("me $slapmsg");
$slapmsg = undef;
}
}
Irssi::command_bind('rs', 'cmd_rs');
Irssi::command_bind('slap', 'cmd_slap');
Irssi::command_bind('slap -yes', 'cmd_slap_all');
open(f,$slapfile) || die("reading slapfile $slapfile failed");
@slappers=<f>;
close(f);