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 Tatsumaki::Error;
use Tatsumaki::Application;
use Tatsumaki::HTTPClient;
use JSON;

package XMPPHandler;
use base qw(Tatsumaki::Handler::XMPP);
__PACKAGE__->asynchronous(1);

use JSON;
use URI;

sub post {
    my $self = shift;

    my $message = $self->xmpp_message;

    my $uri = URI->new("http://ajax.googleapis.com/ajax/services/language/translate");
    $uri->query_form(v => "1.0", langpair => "en|ja", q => $message->body);

    my $client = Tatsumaki::HTTPClient->new;
    $client->get($uri, $self->async_cb(sub { $self->on_response($message, @_) }));
}

sub on_response {
    my($self, $message, $res) = @_;
    my $result = JSON::decode_json($res->content);
    my $text   = $result->{responseData}{translatedText};

    $message->reply($text);
    $self->finish;
}

package main;
use Tatsumaki::Service::XMPP;

my $svc = Tatsumaki::Service::XMPP->new(
    $ENV{XMPP_JID}, $ENV{XMPP_PASSWORD},
);

my $app = Tatsumaki::Application->new([
    '/_services/xmpp/chat' => 'XMPPHandler',
]);

$app->add_service($svc);
$app;