天然パーマです。

ATNDの参加状況をIRCのチャンネルに投稿するbotをAnyEvent::*で作ってみた

めんどくさいの箇条書き。

  1. YAPC::Asia 2009 前夜祭 出張 Yokohama.pm の参加希望者がもうすぐ100人!
  2. ATND で募集してるので、そのページを再読み込みしまくり
  3. それ AnyEvent::Feed と AnyEvent::IRC::Client でほぼリアルタイムに #yokohama.pm に流せばいいんじゃね?
  4. 作り始める
  5. 楽しくなってくる
  6. できたー
  7. #yokohama.pm に投入
  8. 既に100人定員に達している
  9. いまさらすぐるw

というネタ。

ソース。某 typostar さんによれば Superfeedr 使うと polling しなくていいらしいお!

 #!/usr/bin/perl
use strict;
use warnings;
use AnyEvent::Feed;
use AnyEvent::IRC::Client;
use AnyEvent;
use Encode;
 
my $channel = "#yokohama.pm";
my $cv = AnyEvent->condvar;
 
my $pc = AnyEvent::IRC::Client->new;
$pc->reg_cb(
    connect => sub {
        my ( $pc, $err ) = @_;
        if ( defined $err ) {
            print "Couldn't connect to server: $err\n";
        }
    },
    registered => sub {
        my ($self) = @_;
        print "registered!\n";
        $pc->enable_ping(60);
    },
    disconnect => sub {
        print "disconnected: $_[1]!\n";
    }
);
$pc->send_srv( "JOIN", $channel );
$pc->send_chan( $channel, "NOTICE", $channel, "hi" );
$pc->connect( "irc.freenode.net", 6667,
    { nick => 'atnd_bot', user => 'atnd_bot', real => 'ATND bot' } );
 
my $feed = AnyEvent::Feed->new(
    url => "http://atnd.org/events/show/1304.rss",
    interval => 60 * 1,
    on_fetch => sub {
        my ( $fee, $ent, $feed, $er ) = @_;
        if ( defined $er ) {
            warn "ERROR: $er\n";
            $cv->send;
            return;
        }
        my @msg;
        for (@$ent) {
            my $str = $_->[1]->content->body;
            $str =~ s/\n//gm;
            $str =~ s/\s+/ /gm;
            $str = encode( 'utf8', $_->[1]->title . $str );
            print "$str\n";
            $pc->send_chan( $channel, "NOTICE", $channel, $str );
        }
    }
);
 
$cv->recv;