Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- use AnyEvent::IRC::Client;
- use AnyEvent::Twitter::Stream;
- use Encode ();
- my $irc_connects = {
- freenode => {
- channels => ['#perl-casual'],
- server => 'irc.freenode.net',
- port => 6667,
- nick => 'twitter_bot',
- },
- freenode2 => {
- channels => ['#perl-casual'],
- server => 'irc.freenode.net',
- port => 6667,
- nick => 'twitter_bot_2',
- }
- };
- my @servers = keys %{$irc_connects};
- my $trac_map = {
- '#perl-casual' => [
- {
- server => 'freenode',
- channel => '#perl-casual',
- },
- {
- server => 'freenode2',
- channel => '#perl-casual',
- },
- ],
- '#perl-casual-jp' => [
- {
- server => 'freenode',
- channel => '#perl-casual',
- },
- {
- server => 'freenode2',
- channel => '#perl-casual',
- },
- ],
- };
- my $twitter_connect = {
- username => 'nihen',
- password => '',
- track => join ',', keys %{$trac_map},
- };
- my $cv = AnyEvent->condvar;
- while ( my ( $name, $irc_connect ) = each %{$irc_connects} ) {
- my $ae = AnyEvent::IRC::Client->new;
- $ae->reg_cb(
- connect => sub {
- my ( $pc, $err ) = @_;
- if ( defined $err ) {
- warn $err;
- return;
- }
- },
- registered => sub {
- my ( $self ) = @_;
- print "registerd!\n";
- $ae->enable_ping(60);
- },
- disconnect => sub {
- print "disconnected: $_[1]!\n";
- }
- );
- $ae->connect($irc_connect->{server}, $irc_connect->{port}, {
- nick => $irc_connect->{nick},
- user => $irc_connect->{nick},
- real => $irc_connect->{nick},
- $irc_connect->{password} ? (
- password => $irc_connect->{password}
- ) : (),
- });
- foreach my $channel ( @{$irc_connect->{channels}} ) {
- $ae->send_srv('JOIN', $channel);
- $ae->send_chan($channel, 'NOTICE', $channel, 'hi');
- print $channel, "\n";
- }
- $irc_connect->{AE} = $ae;
- }
- my $streamer = AnyEvent::Twitter::Stream->new(
- %{$twitter_connect},
- method => 'filter',
- on_tweet => sub {
- my $tweet = shift;
- my %already = map { $_ => +{} } @servers;
- while ( $tweet->{text} =~ /(#[\w\d_-]+)/go ) {
- my $hashtag = $1;
- next if !$trac_map->{$hashtag};
- foreach my $map ( @{$trac_map->{$hashtag}} ) {
- if ( $already{$map->{server}}->{$map->{channel}} ) {
- next;
- }
- else {
- $already{$map->{server}}->{$map->{channel}} = 1;
- }
- my $irc_connect = $irc_connects->{$map->{server}};
- $irc_connect->{AE}->send_chan( $map->{channel}, "NOTICE", $map->{channel},
- Encode::encode( 'utf-8', "$tweet->{user}{screen_name}: $tweet->{text}" ) );
- }
- }
- },
- on_error => sub {
- my $error = shift;
- warn "ERROR: $error";
- $cv->send;
- },
- on_eof => sub {
- $cv->send;
- },
- );
- $cv->recv;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement