Skip to content

Instantly share code, notes, and snippets.

@hiratara
Created November 12, 2009 08:00
Show Gist options
  • Save hiratara/232710 to your computer and use it in GitHub Desktop.
Save hiratara/232710 to your computer and use it in GitHub Desktop.
package TweetHandler;
use Moose;
use Config::Pit;
use AnyEvent::Twitter::Stream;
use Tatsumaki::MessageQueue;
use Tatsumaki::Error;
extends 'Tatsumaki::Handler';
__PACKAGE__->asynchronous(1);
my ($username, $password) = do {
@{ Config::Pit::get( 'twitter.com', require => {
'username' => 'your username on twitter',
'password' => 'your password on twitter'
} ) }{ qw/username password/ };
};
my %streams;
sub create_stream {
my $self = shift;
my ( $uid ) = @_;
my $mq = Tatsumaki::MessageQueue->instance( $uid );
$streams{ $uid } ||= AnyEvent::Twitter::Stream->new(
username => $username,
password => $password,
method => 'filter',
follow => $uid,
on_tweet => sub {
my $tweet = shift;
$mq->publish( { type => 'tweet', tweet => $tweet, } );
},
on_error => sub {
my $error = join ',', @_;
$mq->publish( { type => 'message', text => $error, } );
delete $streams{ $uid };
},
on_eof => sub {
$mq->publish( { type => 'message', text => 'disconnected', } );
delete $streams{ $uid };
},
);
}
sub get {
my $self = shift;
my ( $uid ) = @_;
my $session = $self->request->param('session')
or Tatsumaki::Error::HTTP->throw(500, "'session' needed");
$streams{ $uid } or $self->create_stream( $uid );
my $mq = Tatsumaki::MessageQueue->instance( $uid );
$mq->poll_once( $session, sub {
my @events_published = @_;
$self->write( \@events_published );
$self->finish;
} );
}
no Moose;
package HtmlHandler;
use Moose;
extends 'Tatsumaki::Handler';
sub get {
my $self = shift;
my ( $uid ) = @_;
$self->render( 'index.html' );
}
no Moose;
package main;
use Tatsumaki::Application;
my $app = Tatsumaki::Application->new([
qr'/(\d+)' => 'HtmlHandler',
qr'/poll/(\d+)' => 'TweetHandler',
]);
$app->template_path( "template" );
$app->static_path( "static" );
return $app;
% my $uid = $_[0]->{handler}->args->[0];
<html>
<head>
<title>Tweets of <%= $uid %></title>
<script type="text/javascript" src="static/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="static/jquery.ev.js"></script>
<script type="text/javascript">
jQuery( function ($) {
$.ev.loop('/poll/' + <%= $uid %> + '?session=' + Math.random(), {
tweet : function(ev) {
if(! ev.tweet.user || ! ev.tweet.text) return;
$( "#tweets" ).prepend(
ev.tweet.user.screen_name + ": " +
ev.tweet.text + "<br>"
);
},
message : function(ev) {
$( "#tweets" ).prepend(
'<span style="color: #F00;">' + ev.text + "</span><br>"
);
}
});
} );
</script>
</head>
<body>
<h1>Tweets of <%= $uid %></h1>
<div id="tweets"></div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment