#!/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( @_ ); } );