Security Advisories (1)
CVE-2010-3438 (2019-11-12)

libpoe-component-irc-perl before v6.32 does not remove carriage returns and line feeds. This can be used to execute arbitrary IRC commands by passing an argument such as \"some text\\rQUIT\" to the 'privmsg' handler, which would cause the client to disconnect from the server.

NAME

POE::Component::IRC::Cookbook::BasicBot - A basic IRC bot

SYNOPSIS

This a very basic bot that connects to IRC, joins a few channels, and announces its arrival.

DESCRIPTION

We start off quite simply:

#!/usr/bin/env perl

use strict;
use warnings;

Then we use the stuff we're going to...well, use. ::State is a subclass which keeps track of state information related to channels and nicknames. It is needed by the AutoJoin plugin which takes care of keeping us on our channels.

use POE;
use POE::Component::IRC::State;
use POE::Component::IRC::Plugin::AutoJoin;

Next up is our POE session. We create it and list our event handlers. We then start the POE kernel.

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

$poe_kernel->run();

Now all we have to do is write the handlers for _start and irc_join. In _start, we create our IRC component, add an AutoJoin plugin, register for the irc_join event, and connect to the IRC server.

sub _start {
    my $irc = POE::Component::IRC::State->spawn(
        Nick   => 'basic_bot',
        Server => 'irc.freenode.net',
    );

    $irc->plugin_add('AutoJoin', POE::Component::IRC::Plugin::AutoJoin->new(
       Channels => [ '#test_channel1', '#test_channel2' ]
    ));

    $irc->yield(register => 'join');
    $irc->yield('connect');
}

Now comes our irc_join event handler. We send a message to the channel once we've joined it.

sub irc_join {
    my $nick = (split /!/, $_[ARG0])[0];
    my $channel = $_[ARG1];
    my $irc = $_[SENDER]->get_heap();

    # only send the message if we were the one joining
    if ($nick eq $irc->nick_name()) {
        $irc->yield(privmsg => $channel, 'Hi everybody!');
    }
}

That's it!

AUTHOR

Hinrik Örn Sigurðsson, hinrik.sig@gmail.com