#!/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