#!/usr/bin/perl -w

# Skrypt do dekompresji artykuw i przesyania ich do inn'a
# przez IHAVE (innxmit nie nadaje si do tego w inn >= 2.3)
#
# Andrzej Radecki <radecki@wpk.p.lodz.pl>
# GoTaR <gotar@priv0.onet.pl>
# Jakub Bogusz <qboosh@pld.org.pl>
#
# Ostatnie zmiany: 13.08.2001r.

use strict;
use Feeder::feeder;
use IO::Socket;


#my ($MAINDIR, $archive, $INNXMIT, $NNTPSERVER, $ODP2RE, $QP28bit, $CP2ISO, $paczka, $uncompr);

my $TMP		= "$Feeder::feeder::MAINDIR/tmp";
my $ARTICLES	= "$TMP/articles";
my $LIST	= "$TMP/list";

mkdirhier("$ARTICLES");

my $n = 0;
my $okcount = 0;
my $dupcount = 0;
my $fullreply;

open LIST, ">$LIST" or die "Can't create file $LIST: $!\n";
my $headers;
print "Decompressing file $Feeder::feeder::paczka\n";
open PACZKA, "$Feeder::feeder::uncompr" or die "Can't open file $Feeder::feeder::paczka: $!\n";
my $innsock=IO::Socket::INET->new(PeerAddr => "$Feeder::feeder::NNTPSERVER", PeerPort => 119,
	Proto => "tcp") or die "Can't connect $Feeder::feeder::NNTPSERVER!\n";
my $innret=inn_reply();
die "Invalid inn status: $fullreply" if $innret!=200;
local $/="\r\n\r\n";
while (<PACZKA>) {
	$n++;
	s/\r//g;
	$headers=$_;
	my $quoted = parse_headers(\$headers);
	/^Xref: (.+)$/m || do { warn "Can't find \"Xref\" header in article $n\n"; goto skip; };
	count_xref($1);
	/^Message-ID:\s*(<.+>)/mi || do { warn "Can't find Message-ID in article $n\n";goto skip;};
	$innret=inn_offer($1);
	if($innret==435) {
		$dupcount++;
		goto skip;
	}
	die "Inn error: $fullreply" if $innret!=335;
	$headers =~ s/\r?\n/\r\n/g;
	$innsock->print("$headers");
	local $/="\r\n\.\r\n";
	$_=(<PACZKA>);
	s/\.\r\n$//;
	s/\r//g;
	parse_contents(\$_, $quoted);
	s/\r?\n/\r\n/g;
	s/$/\n.\r/;
	$innsock->print("$_");
	$innret=inn_reply();
	if($innret==235) {
		$okcount++;
	} else {
		print "Error while posting article $n: $fullreply";
	}
	print LIST "$ARTICLES/$n\n";
	local $/="\r\n\r\n";
	next;
skip:
	local $/="\r\n.\r\n";
	$_=(<PACZKA>);
	local $/="\r\n\r\n";
}
close $innsock or warn "Can't close inn socket\n";
close PACZKA or warn "Can't close file $Feeder::feeder::paczka: $!\n";
print "Sent $n articles: $okcount accepted, $dupcount duplicates.\n";

close LIST or warn "Can't write to file $LIST: $!\n";
unlink <$ARTICLES/*>;
unlink "$LIST";

movepack();
updategroups();

sub count_xref { # $xref
	my @xref = split(' ', $_[0]);
	shift (@xref);
	foreach my $xref (@xref) {
		my ($gr, $nr) = split (':', $xref);
		$Feeder::feeder::numery{$gr}=$nr if (defined($Feeder::feeder::numery{$gr}) && $Feeder::feeder::numery{$gr} < $nr);
	}
}

sub inn_reply {
	local $/="\n";
	my $reply=<$innsock>;
	$fullreply=$reply;
	$fullreply =~ s/\r//g;
	$reply =~ s/^([0-9]{3}).*/$1/;
	return $reply;
}

sub inn_offer {
	$innsock->print("IHAVE $_[0]\r\n");
	return inn_reply();
}
