#!/usr/bin/perl -w
######################################################################
# (c) Michael Schilli 1999
######################################################################

use Net::NNTP;                      # News-Kommunikation
use POSIX;                          # Für O_RDWR usw.
use SDBM_File;                      # Persistenter Hash
use News::Newsrc;                   # .newsrc ein- und auslesen
use Set::IntSpan;                   # Zusätzlicher Range-Handler
use strict;

my $newsanswers = "news.answers";        # Newsgroup
my $newshost    = "$ENV{NNTPSERVER}";    # Newsserver aus 
                                         # Env-Variable

my ($subject, %db);                      # Lokale Variablen
my ($stat_new, $stat_archived, $stat_replay) = (0,0,0);

my $newsrc = News::Newsrc->new();        # Neues Newsrc-Objekt

print "Datei .newsrc einlesen ...\n";
$newsrc->load();  

print "NNTP mit $newshost ...\n";
my $na = Net::NNTP->new($newshost); 

   # Persistenten Hash für # subject lines 
   # erzeugen oder öffnen
tie(%db, "SDBM_File", "$ENV{HOME}/.$newsanswers", 
    O_CREAT|O_RDWR, 0644) || die "Persistenz-Fehler";

   # Newsgroup news.answers Artikelnummern via NNTP holen
print "Gruppeninformation $newsanswers ...\n";
my ($total, $first, $last) = $na->group("$newsanswers");

   # Intervalle noch nicht gelesener Artikeln in einem
   # Set::IntSpan-Objekt aufbauen
my $intervals = Set::IntSpan->new(
          join(',', $newsrc->unmarked_articles($newsanswers, 
                                              $first, $last)));
print "Subjects holen ...\n";

   # Intervalle ungelesener Artikel auslesen 
for (split(/,/, $intervals->run_list())) {
    my ($from, $to) = split(/-/, $_);

       # Intervall korrigieren ($to == $from bedeutet  
       # _alle_ verfügbaren Artikel für xhdr())
    $to = $from +1 if(!defined $to || $to == $from);

       # Subjects ungelesener Artikel holen
    my $subjects = $na->xhdr('Subject', $from, $to);

    foreach $subject (keys %{$subjects}) {
        $stat_new++;               # Gesamtzahl Artikel

                                   # Schon archiviert?
        if(defined($db{"$subjects->{$subject}"})) {  
                                   # Als gelesen markieren,
                                   # da bereits archiviert
	    $newsrc->mark($newsanswers, $subject);
	    $stat_replay++;
        } else {                   # Noch nicht archiviert?
            $db{"$subjects->{$subject}"} = 1;
            $stat_archived++;
        }
    }
}

$na->quit();                       # NNTP-Verbindung schließen
print "NNTP Verbindung geschlossen.\n";

print <<"EOT";                     # Statistik ausgeben
$total Artikel verfügbar
davon $stat_new noch nicht gelesene untersucht
      $stat_replay Wiederholungen eliminiert
      $stat_archived neue archiviert
EOT

$newsrc->save();                   # .newsrc zurückschreiben
