rendered paste body#!/usr/bin/perl
use Irssi::Irc;
use strict;
use warnings;
# global initialisations:
{
our $VERSION = "0.02";
our %IRSSI = (
authors => "ferret",
contact => "ferret tA xelam teNtoD",
name => "opwar",
description => "opwar!",
license => "Public Domain",
url => "http://ferret.xelam.net/",
);
}
# when I become an op, check modes, then set modes if needed, check bans, set ban if necessary
# when modes get changed, check modes, then if needed, ( check ops, then if needed get opped, then ) set modes
# when bans are changed, check/set ban
sub sig_nick_mode_changed {
my( $chanrec, $nickrec, $setby, $mode, $type ) = @_;
return unless lc $nickrec->{nick} eq "ferret" and $mode eq '@' and $type eq '+';
my $server = $chanrec->{server};
our %kicklist;
my $tmpnick;
for ( keys( %kicklist ) ) {
$tmpnick = $chanrec->nick_find( $_ );
defined $tmpnick and $tmpnick->{op} and $server->send_raw( "CS deop #opwar $_" );
}
%kicklist = ();
checkmodes( @_ ) or setmodes( @_ );
checkban( @_ ) or setban( @_ );
$chanrec->{synced} and $server->send_raw( "CS deop #opwar" );
}
sub sig_chanmode {
checkmodes( @_ ) or setmodes( @_ );
}
sub sig_channel_sync {
my ( $chanrec ) = @_;
checkmodes( @_ ) or setmodes( @_ );
checkban( @_ ) or setban( @_ );
$chanrec->{server}->send_raw( "CS deop #opwar" );
}
sub sig_ban_remove {
checkban( @_ ) or setban( @_ );
}
sub checkmodes {
my ( $chanrec ) = @_;
return 1 unless $chanrec->{synced};
if( index( $chanrec->{mode}, '[1t#b]:999 1:999' ) == -1 ) {
return 0;
}
return 1;
}
sub checkban {
my ( $chanrec ) = @_;
foreach my $banrec ( $chanrec->bans() ) {
if ( $banrec->{ban} eq '*!*ferret@cel.leonerd.org.uk' ) {
return 1;
}
}
return 0;
}
sub setmodes {
my ( $chanrec ) = @_;
my $server = $chanrec->{server};
defined $chanrec or Irssi::print "eeek, chanrec undefined?";
defined $server or Irssi::print "eeek, server undefined?";
if ( not $chanrec->nick_find($server->{nick})->{op} ) {
$server->send_raw( "CS op #opwar" );
return;
}
$server->command( "MODE #opwar +fj [1t#b]:999 1:999" );
}
sub setban {
my ( $chanrec ) = @_;
my $server = $chanrec->{server};
if ( not $chanrec->nick_find($server->{nick})->{op} ) {
$server->send_raw( "CS op #opwar" );
return;
}
$server->command( 'MODE #opwar +b *!*ferret@cel.leonerd.org.uk' );
}
sub sig_message_kick {
my ( $server, $channel, $nick, $kicker, $address, $reason ) = @_;
our %kicklist;
our %kicked;
if( index( $kicker, '.' ) != -1 ) {
# only servers have dots
return;
}
if( $kicker eq "ChanServ" ) {
$reason =~ /by (.*?)/ and lc $1 ne "ferret" and $kicker = $1;
$kicklist{$1} = 'do your own dirty work!';
} else {
$kicklist{$kicker} = 'that was rude ;.;';
}
$server->send_raw( "CS invite #opwar" );
if( ++$kicked{kicker} % 2 ) {
$server->send_raw( "CS kick #opwar $kicker $kicklist{$kicker}" );
} else {
$server->send_raw( "CS deop #opwar $kicker" );
}
}
{
my $signals = {
'nick mode changed' => \&sig_nick_mode_changed,
'channel mode changed' => \&sig_chanmode,
'channel sync' => \&sig_channel_sync,
'ban remove' => \&sig_ban_remove,
};
map {
my $r = $_;
$_ = sub {
defined $_[0] and lc $_[0]->{name} eq "#opwar" and $r->( @_ );
};
} values( %$signals );
Irssi::signal_add_last( $signals );
}
Irssi::signal_add_last( 'message kick' => sub {
lc $_[1] eq "#opwar" and $_[2] eq "ferret" and sig_message_kick( @_ );
} );