Created
November 12, 2009 08:00
-
-
Save hiratara/232710 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% 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