package CelBot::Control; use strict; use POSIX qw( SIGHUP ); use CelBot::Commands; # This needs to be a package (not lexical) variable so it keeps its value when # the code is reloaded our @ON_GLOBAL_RELOAD; sub new { my $class = shift; my ( $core ) = @_; my $self = bless { core => $core, irc => $core->get_plugin( "irc" ), }, $class; return $self; } sub quit { my $self = shift; my ( $message ) = @_; # THIS IS A BOT-GLOBAL ACTION # TODO: Find all the IRC objects, create a MergePoint on them, # only exit(0) when they're all done $self->{irc}->disconnect( message => $message, on_disconnected => sub { exit( 0 ); }, ); } # THIS IS A BOT-GLOBAL ACTION sub global_reload { # Take a copy of it in case it gets modified my @reload_callbacks = @ON_GLOBAL_RELOAD; foreach my $cb ( @reload_callbacks ) { $cb->(); } return 1; # TRUE } ### # Commands ### sub register_commands { my $self = shift; my ( $commands_plugin ) = @_; $commands_plugin->register( plugin => $self, command => "quit", perm => 'owner', args => [ CelBot::Commands::ArgSpec->new( 'message', eatall => 1 ), ], summary => "Disconnect all connections and quit", ); $commands_plugin->register( plugin => $self, command => "reload", perm => 'owner', args => [], summary => "Reload configuration and Perl code", ); } sub command_quit { my $self = shift; my ( $context, $message ) = @_; $context->respond( "OK" ); $self->quit( $message ); } sub command_reload { my $self = shift; my ( $context ) = @_; if( defined eval { global_reload } ) { return ( "OK" ); } else { return ( "Failed: $@" ); } } # Keep perl happy; keep Britain tidy 1;