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