The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use FindBin qw($RealBin);
use lib "$RealBin/../lib";
use POE qw(Component::IRC Component::IRC::Plugin::Blowfish);

my $nickname  = 'BlowFish' . $$;
my $ircname   = 'Blowing fish';
my $ircserver = 'irc.perl.org';
my $port      = 6667;
my $channel   = '#POE-Component-IRC-Plugin-Blowfish';
my $bfkey     = 'secret';

my $irc = POE::Component::IRC->spawn(
    nick         => $nickname,
    server       => $ircserver,
    port         => $port,
    ircname      => $ircname,
    debug        => 0,
    plugin_debug => 1,
    options      => { trace => 0 },
) or die "Oh noooo! $!";

POE::Session->create(
    package_states => [ 'main' => [qw(_start irc_public irc_001 irc_join)], ],
);

$poe_kernel->run();
exit 0;

sub _start {

    # Create and load our plugin
    $irc->plugin_add( 'BlowFish' =>
          POE::Component::IRC::Plugin::Blowfish->new( $channel => $bfkey ) );

    $irc->yield( register => 'all' );
    $irc->yield( connect  => {} );
    undef;
}

sub irc_001 {
    $irc->yield( join => $channel );
    undef;
}

sub irc_join {
    my ( $kernel, $sender, $channel ) = @_[ KERNEL, SENDER, ARG1 ];
    $kernel->post(
        $irc => privmsg => $channel => 'hello this is an encrypted message' );
    undef;
}

sub irc_public {
    my ( $kernel, $sender, $who, $where, $msg ) =
      @_[ KERNEL, SENDER, ARG0, ARG1, ARG2 ];
    my $nick = ( split /!/, $who )[0];
    my $chan = $where->[0];

    my @args = split /\s+/, $msg;
    my $cmd = shift @args;

    if ( $cmd eq '!setkey' ) {
        $kernel->yield( set_blowfish_key => (@args)[ 0, 1 ] );
    }

    elsif ( $cmd eq '!delkey' ) {
        $kernel->yield( del_blowfish_key => $args[0] );
    }

    elsif ( $cmd eq '!test' ) {
        $kernel->post(
            $irc => privmsg => $chan => 'this is a test message...' );
    }
}