X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FThingy%2FPing.pm;h=ce64181231f146401fae09827efda789ca789c87;hb=5fc468a5ca08ec51a9b6994605db183b273b9184;hp=09d0e59225c542020f1511d9e8e4114e4c11ab16;hpb=57740a288c82793988be72c9b5666087d636344f;p=spider.git diff --git a/perl/Thingy/Ping.pm b/perl/Thingy/Ping.pm index 09d0e592..ce641812 100644 --- a/perl/Thingy/Ping.pm +++ b/perl/Thingy/Ping.pm @@ -19,8 +19,10 @@ use DXDebug; use DXUtil; use Thingy; use Spot; +use Time::HiRes qw(gettimeofday tv_interval); -use vars qw(@ISA @ping); + +use vars qw(@ISA %ping); @ISA = qw(Thingy); my $id; @@ -29,7 +31,7 @@ sub gen_Aranea { my $thing = shift; unless ($thing->{Aranea}) { - $thing->{Aranea} = Aranea::genmsg($thing); + $thing->{Aranea} = Aranea::genmsg($thing, qw(id out)); } return $thing->{Aranea}; } @@ -45,6 +47,19 @@ sub gen_DXProt { my $thing = shift; my $dxchan = shift; + unless ($thing->{DXProt}) { + # we need to tease out the nodes out of all of this. + # bear in mind that a proxied PC prot node could be in + # {user} as well as a true user and also it may not + # have originated here. + + my $from = $thing->{user} if Route::Node::get($thing->{user}); + $from ||= $thing->{origin}; + my $to = $thing->{touser} if Route::Node::get($thing->{touser}); + $to ||= $thing->{group}; + + $thing->{DXProt} = DXProt::pc51($to, $from, $thing->{out}); + } return $thing->{DXProt}; } @@ -59,7 +74,7 @@ sub gen_DXCommandmode sub from_DXProt { - my $thing = ref $_[0] ? shift : $thing->SUPER::new(); + my $thing = ref $_[0] ? shift : $_[0]->SUPER::new(); while (@_) { my $k = shift; @@ -76,37 +91,27 @@ sub handle # is it for us? if ($thing->{group} eq $main::mycall) { if ($thing->{out} == 1) { - my $repthing; - if ($thing->{touser}) { - if (my $dxchan = DXChannel::get($thing->{touser})) { - if ($dxchan->is_node) { - $thing->send($dxchan); - } else { - $repthing = Thingy::Ping->new_reply($thing); - } - } - } else { - $repthing = Thingy::Ping->new_reply($thing); - } + my $repthing = $thing->new_reply; + $repthing->{out} = 0; + $repthing->{id} = $thing->{id}; $repthing->send($dxchan) if $repthing; } else { # it's a reply, look in the ping list for this one - my $ref = $pings{$from}; + my $ref = $ping{$thing->{id}} || $thing->find; if ($ref) { - my $tochan = DXChannel::get($from); - while (@$ref) { - my $r = shift @$ref; - my $dxchan = DXChannel::get($r->{call}); - next unless $dxchan; - my $t = tv_interval($r->{t}, [ gettimeofday ]); - if ($dxchan->is_user) { + my $t = tv_interval($thing->{t}, [ gettimeofday ]); + if (my $dxc = DXChannel::get($thing->{user} || $thing->{origin})) { + + my $tochan = DXChannel::get($thing->{touser} || $thing->{group}); + + if ($dxc->is_user) { my $s = sprintf "%.2f", $t; my $ave = sprintf "%.2f", $tochan ? ($tochan->{pingave} || $t) : $t; - $dxchan->send($dxchan->msg('pingi', $from, $s, $ave)) - } elsif ($dxchan->is_node) { - if ($tochan) { - my $nopings = $tochan->user->nopings || $obscount; + $dxc->send($dxc->msg('pingi', ($thing->{touser} || $thing->{group}), $s, $ave)) + } elsif ($dxc->is_node) { + if ($tochan ) { + my $nopings = $tochan->user->nopings || $DXProt::obscount; push @{$tochan->{pingtime}}, $t; shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6; @@ -122,13 +127,6 @@ sub handle $tochan->{pingave} = $tochan->{pingave} + (($t - $tochan->{pingave}) / 6); } $tochan->{nopings} = $nopings; # pump up the timer - if (my $ivp = Investigate::get($from, $origin)) { - $ivp->handle_ping; - } - } elsif (my $rref = Route::Node::get($r->{call})) { - if (my $ivp = Investigate::get($from, $origin)) { - $ivp->handle_ping; - } } } } @@ -156,10 +154,10 @@ sub remember $thing->{id} = ++$id; my $u = DXUser->get_current($thing->{to}); if ($u) { - $u->lastping(($thing->{group} || $thing->{user}), $main::systime); + $u->lastping(($thing->{user} || $thing->{group}), $main::systime); $u->put; } - push @ping, $thing; + $ping{$id} = $thing; } # remove any pings outstanding that we have remembered for this @@ -169,30 +167,21 @@ sub forget my $call = shift; my $count = 0; my @out; - for (@ping) { - if ($thing->{user} eq $call) { + foreach my $thing (values %ping) { + if (($thing->{user} || $thing->{group}) eq $call) { $count++; - } else { - push @out, $_; + delete $ping{$thing->{id}}; } } - @ping = @out; return $count; } sub find { - my $from = shift; - my $to = shift; - my $via = shift; - - for (@ping) { - if ($_->{user} eq $from && $_->{to} eq $to) { - if ($via) { - return $_ if $_->{group} eq $via; - } else { - return $_; - } + my $call = shift; + foreach my $thing (values %ping) { + if (($thing->{user} || $thing->{origin}) eq $call) { + return $thing; } } return undef;