#!/usr/bin/perl -Tws
#
# Convert nntp:ucam.comp-serv.announce
# into an Atom document.
#
# $Cambridge: hermes/src/atom/ucsann.cgi,v 1.4 2005/12/15 10:22:04 fanf2 Exp $
use strict;
use Carp;
use Net::NNTP;
use vars qw( $d $o );
my $HOST = "nntp-serv.cam.ac.uk";
my $GROUP = "ucam.comp-serv.announce";
# in CGI mode?
if (defined $ENV{GATEWAY_INTERFACE}) {
# output HTTP headers
print "Content-type: text/xml\r\n";
print "\r\n";
$o = 1 if defined $ENV{QUERY_STRING}
and $ENV{QUERY_STRING} eq "ver=0.3";
}
my $nntp = new Net::NNTP ($HOST,
Debug => $d)
or die "NNTP connect: $@\n";
my @group = $nntp->group($GROUP)
or die "NNTP group: ", $nntp->message;
# convert nntp timestamp into iso 8601
sub timestamp ($) {
my $entry = shift;
$entry =~ /^Date: ([0-9]+) ([A-Z][a-z][a-z]) (\d\d\d\d) (\d\d:\d\d:\d\d) (GMT|BST|([-+]\d\d)(\d\d))$/m
or confess "bad timestamp (1): $entry";
my ($date,$mon,$year,$time,$z) = ($1,$2,$3,$4,$5);
my %zone = ( GMT => "+00:00", BST => "+01:00" );
my %mon = ( Jan => "01", Feb => "02", Mar => "03", Apr => "04",
May => "05", Jun => "06", Jul => "07", Aug => "08",
Sep => "09", Oct => "10", Nov => "11", Dec => "12" );
exists $mon{$mon} or confess "bad timestamp (2): $entry";
my $zone = $zone{$z} || "$6:$7";
return sprintf "%s-%s-%02dT%s%s", $year, $mon{$mon}, $date, $time, $zone;
}
# for compatibility with old atom
my $indent = " ";
sub updated ($) {
my $timestamp = shift;
my $val;
if ($o) {
$val = "$indent$timestamp";
$val .= "\n$indent$timestamp" if $indent eq " ";
} else {
$val = "$indent$timestamp";
}
$val .= "\n" if $indent eq " ";
$indent = " ";
return $val;
}
my %article;
for my $number ($group[1] .. $group[2]) {
print ".$number" if $d;
my $article = $nntp->article($number);
if (defined $article) {
$article{$number} = join "", @$article;
} elsif ($d) {
warn "NNTP article $number: ", $nntp->message;
}
}
print "\n" if $d;
$nntp->quit
or die "NNTP quit: ", $nntp->message;
print "\n";
print $o
? "\n"
: "\n";
print <UCS announcements
University of Cambridge Computing Service
tag:fanf2\@cam.ac.uk,2005:ucsann
END
print updated timestamp $article{$group[2]};
for my $number (sort { $b <=> $a } keys %article) {
my $entry = $article{$number};
my $timestamp = timestamp $entry;
my $updated = updated $timestamp;
$entry =~ /^Subject: (.*)$/m;
my $title = "UCS announcement: $1";
$entry =~ /\n\n+(.*?)\n*$/s;
my $content = $1;
$content =~ s/&/&/g;
$content =~ s/</g;
$content =~ s/>/>/g;
$content =~ s/Â?£/£/g;
print <
$title
University of Cambridge Computing Service
tag:fanf2\@cam.ac.uk,2005:ucsann/$number
$updated
END
}
print "\n";
exit 0;