+#!/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/</</g;
+ s/>/>/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') {
+ }
+}