package Chat; use Squatting; # This is a port of eg/chat-ajax-push.pl from the Continuity distribution. # We're using the exact same JavaScript, but we've switched the server side # with a Squatting implementation. Let's see if they can taste the difference. package Chat::Controllers; use selfvars; our @messages; our $got_message; our @C = ( C( Home => [ '/' ], get => sub { $self->render('home'); }, ), C( PushStream => [ '/pushstream/' ], get => sub { my $cr = $self->cr; my $w = Coro::Event->var(var => \$got_message, poll => 'w'); while (1) { print STDERR "**** GOT MESSAGE, SENDING ****\n"; my $log = join("
", @messages); $cr->print($log); $cr->next; print STDERR "**** Waiting for got_message indicator ****\n"; $w->next; } }, continuity => 1, ), C( SendMessage => [ '/sendmessage/' ], post => sub { my $input = $self->input; my $msg = $input->{message}; my $name = $input->{username}; if ($msg) { unshift @messages, "$name: $msg"; pop @messages if $#messages > 15; } $got_message = 1; "Got it!"; }, ), ); package Chat::Views; use selfvars; use HTML::AsSubs; our @V = ( V( 'html', home => sub { my ($v) = @args; html( head( title('Chat'), script({ src => 'jquery.js' }), script({ src => 'chat-ajax-push.js' }), ), body( form({ id=> 'f', method => 'get', action => R('SendMessage') }, div( input({ type => 'text', id => 'username', name => 'username', size => 10 }), input({ type => 'text', id => 'message', name => 'message', size => 50 }), input({ type => 'submit', id => 'sendbutton', name => 'sendbutton', value => 'Send', }), b({ id => 'status' }, "?") ), div({ id => 'log' }, '-- no messages yet --') ) ) )->as_HTML; } ) ); 1;