diff --git a/PBot/ChanOps.pm b/PBot/ChanOps.pm index 0bb9ea76..d7ee08f8 100644 --- a/PBot/ChanOps.pm +++ b/PBot/ChanOps.pm @@ -37,6 +37,7 @@ sub initialize { $self->{op_commands} = {}; $self->{is_opped} = {}; + $self->{op_requested} = {}; $self->{commands} = PBot::ChanOpCommands->new(pbot => $self->{pbot}); @@ -50,9 +51,12 @@ sub gain_ops { my $self = shift; my $channel = shift; + return if exists $self->{op_requested}->{$channel}; + return if not exists $self->{pbot}->{channels}->{channels}->hash->{$channel} or not $self->{pbot}->{channels}->{channels}->hash->{$channel}{chanop}; + if(not exists $self->{is_opped}->{$channel}) { $self->{pbot}->{conn}->privmsg("chanserv", "op $channel"); - $self->{is_opped}->{$channel}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('general', 'deop_timeout'); # assume we're going to be opped + $self->{op_requested}->{$channel} = scalar gettimeofday; } else { $self->perform_op_commands($channel); } @@ -78,7 +82,7 @@ sub perform_op_commands { while(my $command = shift @{ $self->{op_commands}->{$channel} }) { if($command =~ /^mode (.*?) (.*)/i) { $self->{pbot}->{conn}->mode($1, $2); - $self->{pbot}->{logger}->log(" executing mode $1 $2\n"); + $self->{pbot}->{logger}->log(" executing mode [$1] [$2]\n"); } elsif($command =~ /^kick (.*?) (.*?) (.*)/i) { $self->{pbot}->{conn}->kick($1, $2, $3) unless $1 =~ /\Q$botnick\E/i; $self->{pbot}->{logger}->log(" executing kick on $1 $2 $3\n"); @@ -145,6 +149,14 @@ sub check_opped_timeouts { # $self->{pbot}->{logger}->log("deop $channel in $timediff seconds\n"); } } + + foreach my $channel (keys %{ $self->{op_requested} }) { + if ($now - $self->{op_requested}->{$channel} > 60 * 5) { + $self->{pbot}->{logger}->log("5 minutes since OP request for $channel and no OP yet; trying again ...\n"); + delete $self->{op_requested}->{$channel}; + $self->gain_ops($channel); + } + } } 1; diff --git a/PBot/IRCHandlers.pm b/PBot/IRCHandlers.pm index 2cb73e3e..f3cd057e 100644 --- a/PBot/IRCHandlers.pm +++ b/PBot/IRCHandlers.pm @@ -10,6 +10,7 @@ use strict; use Carp(); use Time::HiRes qw(gettimeofday); +use Data::Dumper; sub new { if(ref($_[1]) eq 'HASH') { @@ -32,8 +33,14 @@ sub initialize { $self->{pbot} = $pbot; } -# IRC related subroutines -################################################# +sub default_handler { + my ($self, $conn, $event) = @_; + + if ($self->{pbot}->{registry}->get_value('irc', 'log_default_handler')) { + my $dump = Dumper $event; + $self->{pbot}->{logger}->log($dump); + } +} sub on_connect { my ($self, $conn) = @_; @@ -58,6 +65,16 @@ sub on_init { $self->{pbot}->{logger}->log("*** @args\n"); } +sub on_motd { + my ($self, $conn, $event) = @_; + + if ($self->{pbot}->{registry}->get_value('irc', 'show_motd')) { + my $server = $event->{from}; + my $msg = $event->{args}[1]; + $self->{pbot}->{logger}->log("MOTD from $server :: $msg\n"); + } +} + sub on_public { my ($self, $conn, $event) = @_; @@ -145,6 +162,7 @@ sub on_mode { if($mode eq "+o") { $self->{pbot}->{logger}->log("$nick opped me in $channel\n"); $self->{pbot}->{chanops}->{is_opped}->{$channel}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('general', 'deop_timeout');; + delete $self->{pbot}->{chanops}->{op_requested}->{$channel}; $self->{pbot}->{chanops}->perform_op_commands($channel); } elsif($mode eq "-o") { @@ -159,8 +177,10 @@ sub on_mode { else { # bot not targeted if($mode eq "+b") { if($nick eq "ChanServ") { - $self->{pbot}->{chanops}->{unban_timeout}->hash->{$channel}->{$target}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('bantracker', 'chanserv_ban_timeout'); - $self->{pbot}->{chanops}->{unban_timeout}->save; + if (exists $self->{pbot}->{channels}->{channels}->hash->{$channel} and $self->{pbot}->{channels}->{channels}->hash->{$channel}{chanop}) { + $self->{pbot}->{chanops}->{unban_timeout}->hash->{$channel}->{$target}{timeout} = gettimeofday + $self->{pbot}->{registry}->get_value('bantracker', 'chanserv_ban_timeout'); + $self->{pbot}->{chanops}->{unban_timeout}->save; + } } } elsif($mode eq "+e" && $channel eq $self->{pbot}->{registry}->get_value('irc', 'botnick')) { diff --git a/PBot/PBot.pm b/PBot/PBot.pm index 69cf36fe..11701d91 100644 --- a/PBot/PBot.pm +++ b/PBot/PBot.pm @@ -78,6 +78,7 @@ sub initialize { $self->{registry}->add_default('text', 'general', 'trigger', delete $conf{trigger} // '!'); $self->{registry}->add_default('text', 'irc', 'debug', delete $conf{irc_debug} // 0); + $self->{registry}->add_default('text', 'irc', 'show_motd', delete $conf{show_motd} // 1); $self->{registry}->add_default('text', 'irc', 'max_msg_len', delete $conf{max_msg_len} // 425); $self->{registry}->add_default('text', 'irc', 'ircserver', delete $conf{ircserver} // "irc.freenode.net"); $self->{registry}->add_default('text', 'irc', 'port', delete $conf{port} // 6667); @@ -88,6 +89,7 @@ sub initialize { $self->{registry}->add_default('text', 'irc', 'username', delete $conf{username} // "pbot3"); $self->{registry}->add_default('text', 'irc', 'ircname', delete $conf{ircname} // "http://code.google.com/p/pbot2-pl/"); $self->{registry}->add_default('text', 'irc', 'identify_password', delete $conf{identify_password} // 'none'); + $self->{registry}->add_default('text', 'irc', 'log_default_handler', 1); $self->{registry}->set('irc', 'SSL_ca_file', 'private', 1); $self->{registry}->set('irc', 'SSL_ca_path', 'private', 1); @@ -167,10 +169,13 @@ sub connect { $self->{connected} = 1; - #set up default handlers for the IRC engine + #set up handlers for the IRC engine + $self->{conn}->add_default_handler(sub { $self->{irchandlers}->default_handler(@_) }, 1); + $self->{conn}->add_handler([ 251,252,253,254,302,255 ], sub { $self->{irchandlers}->on_init(@_) }); $self->{conn}->add_handler(376 , sub { $self->{irchandlers}->on_connect(@_) }); $self->{conn}->add_handler('disconnect' , sub { $self->{irchandlers}->on_disconnect(@_) }); + $self->{conn}->add_handler('motd' , sub { $self->{irchandlers}->on_motd(@_) }); $self->{conn}->add_handler('notice' , sub { $self->{irchandlers}->on_notice(@_) }); $self->{conn}->add_handler('caction' , sub { $self->{irchandlers}->on_action(@_) }); $self->{conn}->add_handler('public' , sub { $self->{irchandlers}->on_public(@_) }); @@ -188,6 +193,17 @@ sub connect { $self->{conn}->add_handler(728 , sub { $self->{bantracker}->on_quietlist_entry(@_) }); $self->{conn}->add_handler('bannickchange' , sub { $self->{irchandlers}->on_bannickchange(@_) }); $self->{conn}->add_handler('notregistered' , sub { $self->{irchandlers}->on_notregistered(@_) }); + + # ignore these events + $self->{conn}->add_handler(['whoisuser', + 'whoisserver', + 'whoiscountry', + 'whoischannels', + 'whoisidle', + 'endofwhois', + 'motdstart', + 'away', + 'endofbanlist'], sub {}); } #main loop diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index 7629e68d..b39db095 100644 --- a/PBot/VERSION.pm +++ b/PBot/VERSION.pm @@ -13,7 +13,7 @@ use warnings; # These are set automatically by the build/commit script use constant { BUILD_NAME => "PBot", - BUILD_REVISION => 774, + BUILD_REVISION => 775, BUILD_DATE => "2014-08-11", };