#!/usr/bin/perl # perl qq2.pl ##minimal nntp client use strict; use warnings; use Net::NNTP (); use constant NUMBER_OF_ARTICLES => 2; use constant GROUP_NAME => 'comp.lang.perl.misc'; use constant SERVER_NAME => 'news.individual.net'; use constant NNTP_DEBUG => 0; my $nntp = Net::NNTP->new(SERVER_NAME, 'Debug' => NNTP_DEBUG) or die; my $USER = 'merrilljensen'; my $PASS = 'quoatohngipu'; $nntp->authinfo($USER,$PASS) 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 RETRIEVE; # 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; } print $nntp->body; __END__