# Connects to NNTP Server, selects a group, then downloads all current articles.
use strict;
use POE;
use POE::Component::Client::NNTP;
use Mail::Internet;
use FileHandle;
$|=1;
POE::Component::Client::NNTP->spawn ( 'NNTP-Client', { NNTPServer => 'news.host' } );
POE::Session->create(
package_states => [
'main' => { nntp_disconnected => '_shutdown',
nntp_socketerr => '_shutdown',
nntp_421 => '_shutdown',
nntp_200 => '_connected',
nntp_201 => '_connected',
},
'main' => [ qw(_start nntp_211 nntp_220 nntp_223)
],
],
);
$poe_kernel->run();
exit 0;
sub _start {
my ($kernel,$heap) = @_[KERNEL,HEAP];
# Our session starts, register to receive all events from poco-client-nntp
$kernel->post ( 'NNTP-Client' => register => 'all' );
# Okay, ask it to connect to the server
$kernel->post ( 'NNTP-Client' => 'connect' );
undef;
}
sub _connected {
my ($kernel,$heap,$text) = @_[KERNEL,HEAP,ARG0];
print "$text\n";
# Select a group to download from.
$kernel->post( 'NNTP-Client' => group => 'random.group' );
undef;
}
sub nntp_211 {
my ($kernel,$heap,$text) = @_[KERNEL,HEAP,ARG0];
print "$text\n";
# The NNTP server sets 'current article pointer' to first article in the group.
# Retrieve the first article
$kernel->post( 'NNTP-Client' => 'article' );
}
sub nntp_220 {
my ($kernel,$heap,$text,$article) = @_[KERNEL,HEAP,ARG0,ARG1];
print "$text\n";
my $message = Mail::Internet->new( $article );
my $filename = $message->head->get( 'Message-ID' );
my $fh = new FileHandle "> articles/$filename";
$message->print( $fh );
$fh->close;
# Set 'current article pointer' to the 'next' article in the group.
$kernel->post( 'NNTP-Client' => 'next' );
undef;
}
sub nntp_223 {
my ($kernel,$heap,$text) = @_[KERNEL,HEAP,ARG0];
print "$text\n";
# Server has moved to 'next' article. Retrieve it.
# If there isn't a 'next' article an 'nntp_421' is generated
# which will call '_shutdown'
$kernel->post( 'NNTP-Client' => 'article' );
undef;
}
sub _shutdown {
my ($kernel,$heap) = @_[KERNEL,HEAP];
# We got disconnected or a socketerr unregister and terminate the component.
$kernel->post ( 'NNTP-Client' => unregister => 'all' );
$kernel->post ( 'NNTP-Client' => 'shutdown' );
undef;
}