4bb82f59f169139b7486e4f9fe4d35843db09596
[facebook-dancer.git] / arcusarte / app.pl
1 use lib '../Dancer/lib';
2 use lib '../Facebook-Graph/lib';
3 use lib '../perl-uri-encode/lib';
4
5 use Dancer;
6 use Facebook::Graph;
7 use XML::FeedPP;
8 use Data::ICal;
9 use DateTime::Format::ICal;
10 use LWP::UserAgent;
11
12 before sub {
13     if (request->path_info !~ m{^/facebook}) {
14         if (session->{access_token} eq '') {
15             request->path_info('/facebook/login')
16         }
17     }
18 };
19
20 get '/facebook/login' => sub {
21     my $fb = Facebook::Graph->new( config->{facebook} );
22     redirect $fb
23         ->authorize
24         ->extend_permissions( qw(email offline_access publish_stream create_event rsvp_event) )
25         ->uri_as_string;
26 };
27
28 get '/facebook/postback/' => sub {
29     my $params = request->params;
30     my $fb = Facebook::Graph->new( config->{facebook} );
31     $fb->request_access_token($params->{code});
32     session access_token => $fb->access_token;
33     redirect '/';
34 };
35
36 get '/' => sub {
37     my $fb = Facebook::Graph->new( config->{facebook} );
38     $fb->access_token(session->{access_token});
39     my $response = $fb->query->find('me')->request;
40     my $user = $response->as_hashref;
41     template 'home.tt', { name => $user->{name}, response => $response->as_string }
42 };
43
44 get '/friends' => sub {
45     my $fb = Facebook::Graph->new( config->{facebook} );
46     $fb->access_token(session->{access_token});
47     my $response = $fb->query->find('me/friends')->request;
48     template 'friends.tt', { friends => $response->as_hashref->{data}, response => $response->as_string }
49 };
50
51 get '/rss-importer' => sub {
52     template 'rss-importer.tt';
53 };
54
55 post '/rss-importer' => sub {
56     my $fb = Facebook::Graph->new( config->{facebook} );
57     $fb->access_token(session->{access_token});
58     my $feed = XML::FeedPP->new(request->params->{rss_uri});
59     foreach my $item ($feed->get_item) {
60         $fb->add_post
61             ->set_message('Created by RSS Feed Importer')
62             ->set_link_uri($item->link)
63             ->set_link_name($item->title)
64             ->set_link_description($item->description)
65             ->publish;
66     }
67     template 'rss-importer-post.tt';
68 };
69
70 get '/ical-importer' => sub {
71     template 'ical-importer.tt';
72 };
73
74 post '/ical-importer' => sub {
75     my $fb = Facebook::Graph->new( config->{facebook} );
76     $fb->access_token(session->{access_token});
77
78     # download ical feed
79     my $ical = LWP::UserAgent->new
80         ->get(request->params->{ical_uri})
81         ->content;
82
83     # process ical into calendar
84     my $calendar = Data::ICal->new( data => $ical );
85
86     # post events
87     foreach my $entry (@{$calendar->entries}) {
88        $fb->add_event
89            ->set_name($entry->properties->{summary}[0]->value)
90            ->set_location($entry->properties->{location}[0]->value)
91            ->set_description($entry->properties->{description}[0]->value)
92            ->set_start_time(DateTime::Format::ICal->parse_datetime($entry->properties->{dtstart}[0]->value))
93            ->set_end_time(DateTime::Format::ICal->parse_datetime($entry->properties->{dtend}[0]->value))
94            ->publish;
95     }
96
97     template 'ical-importer-post.tt';
98 };
99
100 dance;
101