Begin rewriting rss.cgi in perl using Blerg::Database
[blerg.git] / rss.cgi
1 #!/usr/bin/perl
2 use CGI::Fast qw/:cgi/;
3 use Blerg::Database;
4 use URI::Escape;
5 use POSIX qw/strftime/;
6 use strict;
7
8 my $baseurl = Blerg::Database::constant('BASEURL');
9
10 sub xml_escape {
11     local $_ = shift;
12     s/&/&/g;
13     s/</&lt;/g;
14     s/>/&gt;/g;
15     return $_;
16 }
17
18 sub print_404 {
19     print header(-type => 'text/html',
20                  -status => '404 Not Found');
21     print <<DOC;
22 <!DOCTYPE html>
23 <h1>404 Not Found</h1>
24 Not Found
25 DOC
26 }
27
28 sub print_rss {
29     my ($name, @items) = @_;
30
31     print <<HEADER;
32 <?xml version="1.0" encoding="utf-8" ?>
33 <rss version="2.0">
34   <channel>
35     <title>${name}'s blĂ«rg</title>
36     <link>${baseurl}#$name</link>
37     <description>Textual vomit</description>
38 HEADER
39
40     for my $i (@items) {
41         my $data = xml_escape($i->{data});
42         my $post_time = strftime("%a, %d %b %Y %H:%M:%S %Z", gmtime($i->{timestamp}));
43         print <<ITEM;
44     <item>
45       <pubDate>$post_time</pubDate>
46       <guid>${baseurl}get/$name/$i->{record}</guid>
47       <description>$data</description>
48     </item>
49 ITEM
50     }
51
52     print <<'FOOTER'
53   </channel>
54 </rss>
55 FOOTER
56 }
57
58 REQUEST:
59 while (my $q = new CGI::Fast) {
60     my @path = split('/', $ENV{PATH_INFO});
61     shift @path;
62
63     if (@path == 1) {
64         # Assume this is a username; redirect to /user/<username>
65         my $username = $path[0];
66         my $b = Blerg::Database->open_existing($username);
67         if (!defined $b) {
68             print_404;
69             next REQUEST;
70         }
71         print header(-type => 'application/rss+xml',
72                      -charset => 'utf8',
73                      -status => '301 Moved Permanently',
74                      -location => "${baseurl}rss/user/$username");
75         # And present the content in case their client is broken
76         my $n = $b->record_count - 1;
77         my @list = reverse map {
78             {
79                 record    => $_,
80                 data      => $b->fetch($_),
81                 timestamp => $b->timestamp($_),
82             }
83         } ($n > 50 ? $n - 50 : 0)..$n;
84         $b->close;
85         print_rss($username, @list);
86     } elsif ($path[0] eq 'user') {
87         my $username = $path[1];
88         my $b = Blerg::Database->open_existing($username);
89         if (!defined $b) {
90             print_404;
91             next REQUEST;
92         }
93         print header(-type => 'application/rss+xml');
94         my $n = $b->record_count - 1;
95         my @list = reverse map {
96             {
97                 record    => $_,
98                 data      => $b->fetch($_),
99                 timestamp => $b->timestamp($_),
100             }
101         } ($n > 50 ? $n - 50 : 0)..$n;
102         $b->close;
103         print_rss($username, @list);
104     } elsif ($path[0] eq 'tag') {
105     } elsif ($path[0] eq 'ref') {
106     } elsif ($path[0] eq 'feed') {
107     }
108 }