package ballet; use 5.010; use Dancer ':syntax'; use Dancer::Plugin::WebSocket; use Dancer::Plugin::FlashMessage; use Dancer::Plugin::Auth::Twitter; use ballet::Git; our $VERSION = '0.1'; auth_twitter_init(); my $git = ballet::Git->new( wiki_path => setting('wiki_path') ); before sub { return if request->path =~ m{/auth/twitter/callback}; if (not session('twitter_user')) { redirect auth_twitter_authenticate_url; } }; # ws_on_new_listener sub { # my $user_name = session('twitter_user')->{'screen_name'}; # ws_send { # type => 'notification', # message => "user $user_name has joined the party" # }; # }; get '/' => sub { wiki_page('Home'); }; get '/history/*' => sub { my ($page_name) = splat; debug("looking history for $page_name"); my $versions = $git->find_history( $page_name, 'master' ); template 'history', {versions => $versions, title => 'Home'}; }; get '/edit/*' => sub { my ($page_name) = splat; debug("looking for page $page_name"); my $content = $git->find_page($page_name, 'master'); template 'edit', {content => $content, title => 'Home'}; }; get '/*' => sub { my ($page_name) = splat; debug("looking for page $page_name"); wiki_page($page_name); }; post '/edit/*' => sub { my ($page_name) = splat; my $content = params->{content}; update_wiki_page( $page_name, $content ); ws_send { type => 'notification', message => "user " . session('twitter_user')->{screen_name} . " has update a page: $page_name", }; redirect uri_for('/'); }; sub wiki_page { my $page_name = shift; my $content = $git->find_page( $page_name, 'master' ); $content = $git->convert( 'textile', $content ); template 'page', { title => $page_name, author => 'franck', date => '10/10/10', content => $content, user => session('twitter_user')->{'screen_name'}, }; } sub update_wiki_page { my ( $page_name, $content ) = @_; my $env = { env => { GIT_COMMITTER_NAME => session('twitter_user')->{screen_name}, GIT_COMMITER_EMAIL => 'franck@cpan.org'} }; $git->update_page( $page_name, $content, $env ); } true; =head1 NAME ballet =head1 DESCRIPTION L is a wiki powered by L and git. =head1 CONFIGURATION edit config.yaml and set: =head2 wiki_path Path to the git repository that will hold the pages =head2 twitter The authentication is done via twitter. (see the documentation from L). plugins: "Auth::Twitter": consumer_key: "aaa" consumer_secret: "bbbb" callback_url: "http://localhost:5000/auth/twitter/callback"