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::Guess;
use
POE;
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
=>
to_utf8(
$text
),
{
channel
=>
$channel
,
nick
=>
$nick
,
}
);
return
;
}
# Some IRC users use CP1252, some use UTF-8. Let's decode it properly.
sub
to_utf8 {
my
(
$line
) =
@_
;
my
$utf8
= guess_encoding(
$line
,
'utf8'
);
return
ref
$utf8
? decode(
'utf8'
,
$line
) : decode(
'cp1252'
,
$line
);
}
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