Description: |
Prints out the subject and sender of the most recent
articles in a newsgroup.
To configure the script's behaviour, set the
NUMBER_OF_ARTICLES, GROUP_NAME and
SERVER_NAME constants at the top of the script.
I've tried to make this script as resource-friendly as
possible for both the client and server. If there's a
better way, let me know!
|
#!/usr/bin/perl -Tw
use strict;
use Net::NNTP ();
use constant NUMBER_OF_ARTICLES => 10;
use constant GROUP_NAME => 'comp.lang.perl.moderated';
use constant SERVER_NAME => 'my.nntp.server';
use constant NNTP_DEBUG => 0;
my $nntp = Net::NNTP->new(SERVER_NAME, 'Debug' => NNTP_DEBUG) or die;
my($article_count, $first_article, $last_article) = $nntp->group(GROUP
+_NAME) or die;
# Which XOVER fields contain Subject: and From:?
my $count = 0;
my %xover_fmt = map( ($_, $count++), @{ $nntp->overview_fmt or die} );
die unless exists $xover_fmt{'Subject:'};
my $subject_offset = $xover_fmt{'Subject:'};
my $from_offset = $xover_fmt{'From:'};
my(@xover, $start_article);
RETRIEVE: while ($#xover+1 < NUMBER_OF_ARTICLES and $last_article >= $
+first_article) {
# How many articles do we need? Stop retrieving if we have enough
my $articles_required = NUMBER_OF_ARTICLES - ($#xover+1) or last R
+ETRIEVE;
# Fetch overview information for the articles
$start_article = $last_article - ($articles_required-1);
$start_article = $start_article > $first_article ? $start_article
+: $first_article;
my $xover_query = $start_article == $last_article ?
$start_article :
[$start_article, $last_article];
my $xover_ref = $nntp->xover($xover_query) or die;
# Store headers for the articles we've retrieved
foreach (sort {$b <=> $a} keys %$xover_ref) {
push @xover, $xover_ref->{$_};
}
} continue {
# Move the pointer forward to fetch previous articles
$last_article = $start_article - 1;
}
# Disconnect from the NNTP server
$nntp->quit;
print join("\n", map ($_->[$subject_offset].' from '.$_->[$from_offset
+], @xover)),"\n";
|