#!/usr/bin/perl -w

use strict;

use POE;
use POE::Component::Server::XMLRPC;
use XMLRPC::Lite;

use constant ping_urls => qw(http://rpc.weblogs.com/RPC2
			     http://ping.blo.gs/
			     http://rpc.blogrolling.com/pinger/);
my $setup = sub {
  my $kernel = $_[KERNEL];
  $kernel->alias_set("service");
  $kernel->post( xmlrpc => publish => service => "weblogUpdates.ping" );
  openlog("ping-server", qw(pid nowait), "local1");
  $SIG{__WARN__} = sub {syslog("warning", join("", @_))};
};

my $shutdown = sub {
  $_[KERNEL]->post( xmlrpc => rescind => service => "weblogUpdates.ping" );
  closelog();
};

my $ping = sub {
  my $transaction = $_[ARG0];
  my $params = $transaction->params();
  $transaction->return("Pinging commenced.");

  if(!fork) {
    use Sys::Syslog;
    use XMLRPC::Lite
      on_fault =>
	sub {
	  my $rpc = shift;
	  my $res = shift;

	  ref $res ? warn "Fault on $_: ".$res->faultstring :
	    warn "Transport error on $_: ".$rpc->transport->status};

    for(ping_urls) {
      my $result = XMLRPC::Lite->proxy($_)->call('weblogUpdates.ping',
						 @{$params});

      syslog("info", "%s: %s", "Ping response from $_", 
	     $result->result->{message})
	if ref $result;
    }
  }

};

POE::Component::Server::XMLRPC->new(alias => "xmlrpc",
					    port  => 42042 );

POE::Session->create
  ( inline_states =>
    { _start => $setup,
      _stop  => $shutdown,
      'weblogUpdates.ping'   => $ping,
    }
  );

$poe_kernel->run;

