読者です 読者をやめる 読者になる 読者になる

AnyEvent::IRCを試す

最近、IRCチャットを始めたので、スクリプトからなにかできるようになればいいな、と思いました。
で、モジュールを探したら「AnyEvent::IRC」を発見しました。


ということで、投稿された英語コメントを日本語に翻訳して表示するスクリプトを書いてみました。

use strict;
use warnings;
use AnyEvent;
use AnyEvent::IRC;
use AnyEvent::IRC::Connection;
use AnyEvent::IRC::Client;
use JSON;
use Encode;
use LWP::Simple;
use URI::Escape;

my $irc_server = 'irc.freenode.net';
my $chan = shift @ARGV or die "Usage: $0 #chan";

my $c = AnyEvent->condvar;

my $con;

warn 'start connection';
$con = AnyEvent::IRC::Client->new;
$con->reg_cb(
    'connect' => sub {
        my ( $con, $err ) = @_;
        if ( defined $err ) {
            warn "Connect ERROR! => $err\n";
            $c->broadcast;
        }
        else {
            warn "Connected! Yay!\n";
        }
    },
    registered => sub {
        my ($self) = @_;
        warn "registered!\n";
        $con->enable_ping(60);
        $con->send_srv("JOIN", '#'.$chan);
    },
    irc_privmsg => sub {
        my ( $self, $msg ) = @_;
        my $comment = $msg->{params}->[-1];
        my $trans_url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=' . uri_escape($comment).'&langpair=en%7Cja';
        my $json = get($trans_url);
        my $result = from_json($json);
        print
            "\n" .
            Encode::encode('utf8',$result->{responseData}->{translatedText}) . "\n" .
            '('.Encode::encode('utf8',$comment).')' . "\n";
    },
    disconnect => sub {
        die "Oh, got a disconnect: $_[1], exiting...\n";
    }
    );
$con->connect( $irc_server, 6667,
               { nick => 'bot', 'user' => 'bot', real => 'the bot' } );

$c->recv;


実行は「perl irc.pl {チャンネル名}」で行ないます。

perl irc.pl perl


IRCの仕組みがよく分からないせいか、モジュールの仕様がいまいち掴みきれていません^^;