The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

POE::Component::IRC::Cookbook::Translator - A bot that can translate text

SYNOPSIS

This bot uses POE::Component::Lingua::Translate to translate text for channel members. It makes use of the BotCommand plugin to handle the translate command.

DESCRIPTION

#!/usr/bin/env perl

use strict;
use warnings;
use Encode qw(decode);
use Encode::Guess;
use IRC::Utils qw(decode_irc parse_user);
use POE;
use POE::Component::IRC::State;
use POE::Component::IRC::Plugin::AutoJoin;
use POE::Component::IRC::Plugin::BotCommand;
use POE::Component::Lingua::Translate;

POE::Session->create(
    package_states => [
        main => [ qw(_start irc_botcmd_trans translated) ]
    ],
    heap => {
       translators => { },
    }
);

$poe_kernel->run();

sub _start {
    my $heap = $_[HEAP];
    my $irc = POE::Component::IRC::State->spawn(
        Nick   => 'translator_bot',
        Server => 'irc.freenode.net',
    );
    $heap->{irc} = $irc;

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

    $irc->plugin_add('BotCommand', POE::Component::IRC::Plugin::BotCommand->new(
        Commands => {
           trans => 'Usage: trans <from>,<to> <text>'
        }
    ));

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

sub irc_botcmd_trans {
    my $heap = $_[HEAP];
    my $irc = $heap->{irc};
    my $nick = parse_user( $_[ARG0] );
    my $channel = $_[ARG1];
    my ($from, $to, $text) = split /,|\s+/, $_[ARG2], 3;

    if (!exists $heap->{translators}->{$from . $to}) {
        eval {
            $heap->{translators}->{$from . $to} = POE::Component::Lingua::Translate->new(
                alias     => $from . $to,
                back_end  => 'Babelfish',
                src       => $from,
                dest      => $to,
            );
        };

        if ($@) {
            $irc->yield(privmsg => $channel, "$nick: There was an error: $@");
            return;
        }
    }

    $poe_kernel->post($from . $to => translate =>
        decode_irc($text),
        {
            channel => $channel,
            nick    => $nick,
        }
    );
    return;
}

sub translated {
    my $irc = $_[HEAP]->{irc};
    my ($text, $context, $error) = @_[ARG0, ARG1, ARG2];

    if ($error) {
        $irc->yield(
            'privmsg',
            $context->{channel},
            $context->{nick} . ": There was an error: $error",
        );
        return;
    }

    $irc->yield(
        'privmsg',
        $context->{channel},
        $context->{nick} . ': ' . $text,
    );
    return;
}

AUTHOR

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