All pastes #811763 Raw Edit

opwar.pl

public text v1 · immutable
·published 2007-12-11 06:06 UTC
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( @_ );
} );