/usr/local/CPAN/POE-Component-PluginManager/SomeIrcBot/Plugins/megaHAL.pm


package SomeIrcBot::Plugins::megaHAL;
use strict;
use warnings;
use POE;
use POE::Component::AI::MegaHAL;
our $name     = "SomeIrcBot::Plugins::megaHAL";
our $longname = "megaHAL plugin for jamesd";
our $license  = "GPL";
our $VERSION  = "0.1";
our $author   = 'whoppix <elektronenvolt@quantentunnel.de>';

my $pluginmanager;
my $shutdown_reason;
my $spam_channel = "#orakel"; # in this channel we will answer on every message.
my $irc; # the PoCo::IRC object, that the application gave us as plugin_data
sub new {
    my $type = shift;
    $pluginmanager = shift;
    $irc = shift;
    POE::Session->create(
        'inline_states' => {
            '_start'     => \&start,
            '_stop'      => \&stop,
            'sig_DIE'    => \&handle_die,
            'shutdown'   => \&plugin_shutdown,
            'irc_public' => \&irc_public,
            '_got_reply' => \&got_reply,
        },
    ) or die '[$name] Failed to spawn a new session.';
}

sub start {
    $_[KERNEL]->sig( DIE => 'sig_DIE' );
    $_[KERNEL]->alias_set($name);
    $irc->yield( register => 'public' );
    my $poco = POE::Component::AI::MegaHAL->spawn(
        autosave => 1,
        debug    => 0,
        path     => '.',
        alias    => 'megaHAL',
        options  => { trace => 0 }
    );

    return [ $name, $longname, $license, $VERSION, $author ];
}

sub stop {
    print "[$name] is unloaded.\n";
    return $shutdown_reason;
}

sub handle_die {
    print "[$name] plugin died\n";
    my ( $sig, $ex ) = @_[ ARG0, ARG1 ];
    $pluginmanager->error($ex);
    $_[KERNEL]->sig_handled();
}

sub plugin_shutdown {
    my $timing  = $_[ARG0];
    my $message = $_[ARG1];
    print "[$name] received shutdown signal: $timing because of: $message\n";
    $shutdown_reason = $message;
    $_[KERNEL]->alias_remove($name);
    $_[KERNEL]->post( 'megaHAL' => 'shutdown' );
    $irc->yield( unregister => 'public' );
}

sub irc_public {
    my ( $kernel, $sender, $who, $where, $what ) = @_[ KERNEL, SENDER, ARG0, ARG1, ARG2 ];
    my $nick = ( split( /!/, $who ) )[0];
    my $channel = $where->[0];
    if ( $what =~ m/^!orakel/ || $channel eq $spam_channel ) {
        my @tokens = split( / /, $what );
        shift @tokens;    #removing command
        my $request = join( " ", @tokens );
        $_[KERNEL]->post(
            'megaHAL' => do_reply => {
                text    => $request,
                event   => '_got_reply',
                nick    => $nick,
                channel => $channel,
            }
        );
    }
    else {                # feed the bot channel input
        $_[KERNEL]->post(
            'megaHAL' => do_reply => {
                text  => $what,
                event => 'no_reply',
            }
        );
    }

}

sub got_reply {
    my $reply   = $_[ARG0];
    my $answer  = $reply->{reply};
    my $who     = $reply->{nick};
    my $channel = $reply->{channel};
    $irc->yield( 'privmsg' => $channel => $who . ": " . $answer );

}
return 1;