#!/usr/bin/perl
#$Id: pinger.pl 990 2012-12-28 20:35:04Z pro $ $URL: svn://svn.setun.net/dcppp/trunk/examples/pinger.pl $

=head1 NAME

get info about hubs

=head1 SYNOPSIS

 ./pinger.pl hub hub ...

 ./pinger.pl adc://dc.hub.com:412  dc.hub.com 

=head1 CONFIGURE 

 create config.pl:
 $config{dc}{host} = 'myhub.net';

=cut
use 5.10.0;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = $Data::Dumper::Useqq = $Data::Dumper::Indent = 1;
use Time::HiRes qw(time sleep);
#use Encode;
use lib::abs '../lib';
#use lib '../TigerHash/lib';
#use lib './stat/pslib';
our (%config);
use Net::DirectConnect::pslib::psmisc;
psmisc->import qw(:log);
#use psmisc;
#use pssql;
use Net::DirectConnect;
$config{disconnect_after}     //= 10;
$config{disconnect_after_inf} //= 0;
$config{ 'log_' . $_ } //= 0 for qw (dmp dcdmp dcdbg);
psmisc::configure();    #psmisc::lib_init();
printlog("usage: $1 [adc|dchub://]host[:port] [hub..]\n"), exit if !$ARGV[0] and !$config{dc}{host} and !$config{dc}{hosts};
printlog( 'info', 'started:', $^X, $0, join ' ', @ARGV );
#$SIG{INT} = $SIG{KILL} = sub { printlog 'exiting', exit; };
#use Net::DirectConnect::adc;
#my $dc =
Net::DirectConnect->new(
  #modules  => ['filelist'],
  SUPAD => { H => { PING => 1 } },
  #botinfo      => 'devperlpinger',
  auto_GetINFO => 1,
  auto_connect => 1,
  auto_say     => 1,
  dev_http     => 1,
  'log'        => sub (@) {
    my $dc = ref $_[0] ? shift : {};
    psmisc::printlog shift(), "[$dc->{'number'}]", @_,;
  },
  'handler' => {
    INF => sub {
      my $dc  = shift;
      my $dst = shift @{ $_[0] };
      return if $dst ne 'I';
      my $info = pop;
      printlog( "getted adc info: $info->{UC} $info->{SS} $info->{SF}, full=", Dumper $info);
      $dc->destroy() if $config{disconnect_after_inf};    #no manual calc, disconnect
    },
  },
  auto_work => sub {
    my $dc = shift;
    #our $starttime ||= time if $dc->{status} eq 'connected';
    #$BotINFO <bot description>|
    if ( time - $dc->{time_start} > $config{disconnect_after} ) {    # works only 10 seconds (for users inf getting)
      my $info = $dc->stat_hub();
      printlog( "calced info: $info->{UC} $info->{SS} $info->{SF}, full=", Dumper($info) );
      $dc->destroy();
    }
    psmisc::schedule(
      [ 20, 100 ],
      our $dump_sub__ ||= sub {
        printlog("Writing dump");
        psmisc::file_rewrite( $0 . '.dump', Dumper $dc);
      }
    ) if $config{debug};
  },
  %{ $config{dc} || {} },
  ( $_ ? ( 'host' => $_ ) : () ),
) for ( @ARGV, @{ $config{dc}{hosts} || [] } );