Begin rewriting rss.cgi in perl using Blerg::Database
[blerg.git] / rss.cgi
diff --git a/rss.cgi b/rss.cgi
new file mode 100755 (executable)
index 0000000..b207874
--- /dev/null
+++ b/rss.cgi
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+use CGI::Fast qw/:cgi/;
+use Blerg::Database;
+use URI::Escape;
+use POSIX qw/strftime/;
+use strict;
+
+my $baseurl = Blerg::Database::constant('BASEURL');
+
+sub xml_escape {
+    local $_ = shift;
+    s/&/&/g;
+    s/</&lt;/g;
+    s/>/&gt;/g;
+    return $_;
+}
+
+sub print_404 {
+    print header(-type => 'text/html',
+                 -status => '404 Not Found');
+    print <<DOC;
+<!DOCTYPE html>
+<h1>404 Not Found</h1>
+Not Found
+DOC
+}
+
+sub print_rss {
+    my ($name, @items) = @_;
+
+    print <<HEADER;
+<?xml version="1.0" encoding="utf-8" ?>
+<rss version="2.0">
+  <channel>
+    <title>${name}'s blĂ«rg</title>
+    <link>${baseurl}#$name</link>
+    <description>Textual vomit</description>
+HEADER
+
+    for my $i (@items) {
+        my $data = xml_escape($i->{data});
+        my $post_time = strftime("%a, %d %b %Y %H:%M:%S %Z", gmtime($i->{timestamp}));
+        print <<ITEM;
+    <item>
+      <pubDate>$post_time</pubDate>
+      <guid>${baseurl}get/$name/$i->{record}</guid>
+      <description>$data</description>
+    </item>
+ITEM
+    }
+
+    print <<'FOOTER'
+  </channel>
+</rss>
+FOOTER
+}
+
+REQUEST:
+while (my $q = new CGI::Fast) {
+    my @path = split('/', $ENV{PATH_INFO});
+    shift @path;
+
+    if (@path == 1) {
+        # Assume this is a username; redirect to /user/<username>
+        my $username = $path[0];
+        my $b = Blerg::Database->open_existing($username);
+        if (!defined $b) {
+            print_404;
+            next REQUEST;
+        }
+        print header(-type => 'application/rss+xml',
+                     -charset => 'utf8',
+                     -status => '301 Moved Permanently',
+                     -location => "${baseurl}rss/user/$username");
+        # And present the content in case their client is broken
+        my $n = $b->record_count - 1;
+        my @list = reverse map {
+            {
+                record    => $_,
+                data      => $b->fetch($_),
+                timestamp => $b->timestamp($_),
+            }
+        } ($n > 50 ? $n - 50 : 0)..$n;
+        $b->close;
+        print_rss($username, @list);
+    } elsif ($path[0] eq 'user') {
+        my $username = $path[1];
+        my $b = Blerg::Database->open_existing($username);
+        if (!defined $b) {
+            print_404;
+            next REQUEST;
+        }
+        print header(-type => 'application/rss+xml');
+        my $n = $b->record_count - 1;
+        my @list = reverse map {
+            {
+                record    => $_,
+                data      => $b->fetch($_),
+                timestamp => $b->timestamp($_),
+            }
+        } ($n > 50 ? $n - 50 : 0)..$n;
+        $b->close;
+        print_rss($username, @list);
+    } elsif ($path[0] eq 'tag') {
+    } elsif ($path[0] eq 'ref') {
+    } elsif ($path[0] eq 'feed') {
+    }
+}