X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=5c6ca1fb928abd18426cce68525fedbcb3e20cf6;hb=4c60d18d0d58ece2406680d4afd4ff016532c11c;hp=2bf621e1a1883d61776c0b689bb2c3b5961e917b;hpb=bcf099764f49e68ef016964e420b906e7900623e;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 2bf621e1..5c6ca1fb 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -27,7 +27,6 @@ use DXDb; use AnnTalk; use Geomag; use WCY; -use Time::HiRes qw(gettimeofday tv_interval); use BadWords; use DXHash; use Route; @@ -35,32 +34,28 @@ use Route::Node; use Script; use Investigate; use RouteDB; -use Thingy; -use Thingy::Dx; -use Thingy::Rt; -use Thingy::Ping; -use Thingy::T; -use Thingy::Hello; -use Thingy::Bye; + use strict; use vars qw($VERSION $BRANCH); - -main::mkver($VERSION = q$Revision$); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0)); +$main::build += $VERSION; +$main::branch += $BRANCH; use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restime $eph_pc34_restime $last_hour $last10 %eph %pings %rcmds $ann_to_talk $pingint $obscount %pc19list $chatdupeage $chatimportfn $investigation_int $pc19_version $myprot_version %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck - $allowzero $decode_dk0wcy $send_opernam @checklist); + $allowzero $decode_dk0wcy $send_opernam @checklist + $handle_xml); $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 $pc23_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc23 $last_hour = time; # last time I did an hourly periodic update -%pings = (); # outstanding ping requests outbound %rcmds = (); # outstanding rcmd requests outbound %nodehops = (); # node specific hop control %pc19list = (); # list of outstanding PC19s that haven't had PC16s on them @@ -82,6 +77,7 @@ $chatdupeage = 20 * 60 * 60; $chatimportfn = "$main::root/chat_import"; $investigation_int = 12*60*60; # time between checks to see if we can see this node $pc19_version = 5466; # the visible version no for outgoing PC19s generated from pc59 +$handle_xml = 0; # handle XML sentences @checklist = ( @@ -223,7 +219,7 @@ sub init $main::me->{metric} = 0; $main::me->{pingave} = 0; $main::me->{registered} = 1; - $main::me->{version} = 5252 + $main::version; + $main::me->{version} = $main::version; $main::me->{build} = $main::build; } @@ -239,11 +235,7 @@ sub new my $pkg = shift; my $call = shift; $main::routeroot->add($call, '5000', Route::here(1)) if $call ne $main::mycall; - if ($self->{call} ne $main::mycall) { - my $thing = Thingy::Hello->new(user=>$call); - $thing->broadcast($self); - } - + return $self; } @@ -257,7 +249,10 @@ sub start my $user = $self->{user}; # log it - my $host = $self->{conn}->{peerhost} || "unknown"; + my $host = $self->{conn}->{peerhost}; + $host ||= "AGW Port #$self->{conn}->{agwport}" if exists $self->{conn}->{agwport}; + $host ||= "unknown"; + Log('DXProt', "$call connected from $host"); # remember type of connection @@ -304,7 +299,7 @@ sub start $self->{pingave} = 999; $self->{metric} ||= 100; $self->{lastping} = $main::systime; - + # send initialisation string unless ($self->{outbound}) { $self->sendinit; @@ -313,9 +308,6 @@ sub start $self->state('init'); $self->{pc50_t} = $main::systime; - my $thing = Thingy::Hello->new(origin=>$main::mycall, user=>$call); - $thing->broadcast($self); - # send info to all logged in thingies $self->tell_login('loginn'); @@ -334,7 +326,6 @@ sub sendinit $self->send(pc18()); } - # # This is the normal pcxx despatcher # @@ -342,6 +333,11 @@ sub normal { my ($self, $line) = @_; + if ($line =~ '^<\w+\s') { + DXXml::normal($self, $line); + return; + } + my @field = split /\^/, $line; return unless @field; @@ -349,6 +345,7 @@ sub normal # print join(',', @field), "\n"; + # process PC frames, this will fail unless the frame starts PCnn my ($pcno) = $field[0] =~ /^PC(\d\d)/; # just get the number unless (defined $pcno && $pcno >= 10 && $pcno <= 99) { @@ -363,16 +360,6 @@ sub normal return; } - # decrement any hop fields at this point - if ($line =~ /\^H(\d\d?)\^?~?$/) { - my $hops = $1 - 1; - if ($hops < 0) { - dbg("PCPROT: zero hop count, dumped") if isdbg('chanerr'); - return; - } - $line =~ s/\^H\d\d?(\^?~?)$/^H$hops$1/; - } - my $origin = $self->{call}; no strict 'subs'; my $sub = "handle_$pcno"; @@ -437,12 +424,12 @@ sub handle_10 } # remember a route to this node and also the node on which this user is - RouteDB::update($_[6], $origin); + RouteDB::update($_[6], $self->{call}); # RouteDB::update($to, $_[6]); # it is here and logged on - $dxchan = DXChannel->get($main::myalias) if $to eq $main::mycall; - $dxchan = DXChannel->get($to) unless $dxchan; + $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall; + $dxchan = DXChannel::get($to) unless $dxchan; if ($dxchan && $dxchan->is_user) { $_[3] =~ s/\%5E/^/g; $dxchan->talk($from, $to, $via, $_[3]); @@ -490,6 +477,18 @@ sub handle_11 # rsfp check # return if $rspfcheck and !$self->rspfcheck(1, $_[7], $_[6]); + + # is the spotted callsign blank? This should really be trapped earlier but it + # could break other protocol sentences. Also check for lower case characters. + if ($_[2] =~ /^\s*$/) { + dbg("PCPROT: blank callsign, dropped") if isdbg('chanerr'); + return; + } + if ($_[2] =~ /[a-z]/) { + dbg("PCPROT: lowercase characters, dropped") if isdbg('chanerr'); + return; + } + # if this is a 'nodx' node then ignore it if ($badnode->in($_[7])) { @@ -514,7 +513,7 @@ sub handle_11 } # is it 'baddx' - if ($baddx->in($_[2]) || BadWords::check($_[2])) { + if ($baddx->in($_[2]) || BadWords::check($_[2]) || $_[2] =~ /COCK/) { dbg("PCPROT: Bad DX spot, ignored") if isdbg('chanerr'); return; } @@ -538,15 +537,27 @@ sub handle_11 # RouteDB::update($_[7], $self->{call}); # RouteDB::update($_[6], $_[7]); - my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $_[6], $_[7]); - - my $thing = Thingy::Dx->new(origin=>$main::mycall); - $thing->from_DXProt(DXProt=>$line,spotdata=>\@spot); - $thing->process($self); + my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $nossid, $_[7]); + # global spot filtering on INPUT + if ($self->{inspotsfilter}) { + my ($filter, $hops) = $self->{inspotsfilter}->it(@spot); + unless ($filter) { + dbg("PCPROT: Rejected by input spot filter") if isdbg('chanerr'); + return; + } + } # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup # list. This allows it to come in from a "legitimate" source + if (Spot::dup(@spot[0..4,5])) { + dbg("PCPROT: Duplicate Spot ignored\n") if isdbg('chanerr'); + return; + } + + # add it + Spot::add(@spot); + # # @spot at this point contains:- # freq, spotted call, time, text, spotter, spotted cc, spotters cc, orig node @@ -600,6 +611,20 @@ sub handle_11 } } } + + # local processing + my $r; + eval { + $r = Local::spot($self, @spot); + }; + # dbg("Local::spot1 error $@") if isdbg('local') if $@; + return if $r; + + # DON'T be silly and send on PC26s! + return if $pcno == 26; + + # send out the filtered spots + send_dx_spot($self, $line, @spot) if @spot; } # announces @@ -640,7 +665,7 @@ sub handle_12 my $dxchan; - if ((($dxchan = DXChannel->get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){ + if ((($dxchan = DXChannel::get($_[2])) && $dxchan->is_user) || $_[4] =~ /^[\#\w.]+$/){ $self->send_chat($line, @_[1..6]); } elsif ($_[2] eq '*' || $_[2] eq $main::mycall) { @@ -691,7 +716,7 @@ sub handle_16 # dos I want users from this channel? unless ($self->user->wantpc16) { - dbg("PCPROT: don't send users to $origin") if isdbg('chanerr'); + dbg("PCPROT: don't send users to $self->{call}") if isdbg('chanerr'); return; } # is it me? @@ -750,13 +775,13 @@ sub handle_16 dbg("PCPROT: PC19 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); $parent = undef; } - if ($parent) { + if ($parent) { my $r = $parent->add($ncall, $_->[1], $_->[2]); push @nrout, $r unless @nrout; } } $user->wantroutepc19(1) unless defined $wantpc19; # for now we work on the basis that pc16 = real route - $user->lastin($main::systime) unless DXChannel->get($ncall); + $user->lastin($main::systime) unless DXChannel::get($ncall); $user->put; # route the pc19 - this will cause 'stuttering PC19s' for a while @@ -776,7 +801,7 @@ sub handle_16 return; } } else { - + $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { dbg("PCPROT: PC16 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); @@ -786,15 +811,15 @@ sub handle_16 # input filter if required return unless $self->in_filter_route($parent); } - - my $i; + + my $i; my @rout; - for ($i = 2; $i < $#_; $i++) { - my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o; - next unless $call && $conf && defined $here && is_callsign($call); - next if $call eq $main::mycall; - - eph_del_regex("^PC17\\^$call\\^$ncall"); + for ($i = 2; $i < $#_; $i++) { + my ($call, $conf, $here) = $_[$i] =~ /^(\S+) (\S) (\d)/o; + next unless $call && $conf && defined $here && is_callsign($call); + next if $call eq $main::mycall; + + eph_del_regex("^PC17\\^$call\\^$ncall"); $conf = $conf eq '*'; @@ -805,18 +830,18 @@ sub handle_16 dbg("PCPROT: $call is a node") if isdbg('chanerr'); next; } - + $r = Route::User::get($call); my $flags = Route::here($here)|Route::conf($conf); - + if ($r) { my $au = $r->addparent($parent); if ($r->flags != $flags) { $r->flags($flags); $au = $r; - } + } push @rout, $r if $au; - } else { + } else { push @rout, $parent->add_user($call, $flags); } @@ -827,7 +852,7 @@ sub handle_16 $user = DXUser->new($call) if !$user; $user->homenode($parent->call) if !$user->homenode; $user->node($parent->call); - $user->lastin($main::systime) unless DXChannel->get($call); + $user->lastin($main::systime) unless DXChannel::get($call); $user->put; } $self->route_pc16($origin, $line, $parent, @rout) if @rout; @@ -911,8 +936,8 @@ sub handle_18 # record the type and version offered if ($_[1] =~ /DXSpider Version: (\d+\.\d+) Build: (\d+\.\d+)/) { - $self->version(52.51 + $1); - $self->user->version(52.51 + $1); + $self->version(53 + $1); + $self->user->version(53 + $1); $self->build(0 + $2); $self->user->build(0 + $2); unless ($self->is_spider) { @@ -920,6 +945,7 @@ sub handle_18 $self->user->put; $self->sort('S'); } + $self->{handle_xml}++ if $main::do_xml && $_[1] =~ /\bxml\b/; } else { $self->version(50.0); $self->version($_[2] / 100) if $_[2] && $_[2] =~ /^\d+$/; @@ -927,7 +953,7 @@ sub handle_18 } # first clear out any nodes on this dxchannel - my $parent = Route::Node::get($origin); + my $parent = Route::Node::get($self->{call}); my @rout = $parent->del_nodes; $self->route_pc21($origin, $line, @rout, $parent) if @rout; $self->send_local_config(); @@ -949,9 +975,9 @@ sub handle_19 my @rout; # first get the INTERFACE node - my $parent = Route::Node::get($origin); + my $parent = Route::Node::get($self->{call}); unless ($parent) { - dbg("DXPROT: my parent $origin has disappeared"); + dbg("DXPROT: my parent $self->{call} has disappeared"); $self->disconnect; return; } @@ -993,9 +1019,9 @@ sub handle_19 next if $call eq $main::mycall; # check that this PC19 isn't trying to alter the wrong dxchan - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan && $dxchan != $self) { - dbg("PCPROT: PC19 from $origin trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC19 from $self->{call} trying to alter wrong locally connected $call, ignored!") if isdbg('chanerr'); next; } @@ -1010,19 +1036,19 @@ sub handle_19 } $user->sort('A') unless $user->is_node; - RouteDB::update($call, $origin); + RouteDB::update($call, $self->{call}); # do we believe this call? my $genline = "PC19^$here^$call^$conf^$ver^$_[-1]^"; - unless ($call eq $origin || $self->is_believed($call)) { - my $pt = $user->lastping($origin) || 0; - if ($pt+$investigation_int < $main::systime && !Investigate::get($call, $origin)) { - my $ivp = Investigate->new($call, $origin); + unless ($call eq $self->{call} || $self->is_believed($call)) { + my $pt = $user->lastping($self->{call}) || 0; + if ($pt+$investigation_int < $main::systime && !Investigate::get($call, $self->{call})) { + my $ivp = Investigate->new($call, $self->{call}); $ivp->version($ver); $ivp->here($here); $ivp->store_pcxx($pcno,$genline,$origin,'PC19',$here,$call,$conf,$ver,$_[-1]); } else { - dbg("PCPROT: We don't believe $call on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $call on $self->{call}") if isdbg('chanerr'); } $user->put; next; @@ -1055,7 +1081,7 @@ sub handle_19 } else { # if he is directly connected or allowed then add him, otherwise store him up for later - if ($call eq $origin || $user->wantroutepc19) { + if ($call eq $self->{call} || $user->wantroutepc19) { my $new = Route->new($call); # throw away if ($self->in_filter_route($new)) { my $ar = $parent->add($call, $ver, $flags); @@ -1067,7 +1093,7 @@ sub handle_19 } else { $pc19list{$call} = [] unless exists $pc19list{$call}; my $nl = $pc19list{$call}; - push @{$pc19list{$call}}, [$origin, $ver, $flags] unless grep $_->[0] eq $origin, @$nl; + push @{$pc19list{$call}}, [$self->{call}, $ver, $flags] unless grep $_->[0] eq $self->{call}, @$nl; } } @@ -1075,7 +1101,7 @@ sub handle_19 my $mref = DXMsg::get_busy($call); $mref->stop_msg($call) if $mref; - $user->lastin($main::systime) unless DXChannel->get($call); + $user->lastin($main::systime) unless DXChannel::get($call); $user->put; } @@ -1114,14 +1140,14 @@ sub handle_21 return; } - RouteDB::delete($call, $origin); + RouteDB::delete($call, $self->{call}); # check if we believe this - unless ($call eq $origin || $self->is_believed($call)) { - if (my $ivp = Investigate::get($call, $origin)) { + unless ($call eq $self->{call} || $self->is_believed($call)) { + if (my $ivp = Investigate::get($call, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $call on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $call on $self->{call}") if isdbg('chanerr'); } return; } @@ -1130,13 +1156,13 @@ sub handle_21 # this routing table manipulation, just remove it from the list and dump it my @rout; if (my $nl = $pc19list{$call}) { - $pc19list{$call} = [ grep {$_->[0] ne $origin} @$nl ]; + $pc19list{$call} = [ grep {$_->[0] ne $self->{call}} @$nl ]; delete $pc19list{$call} unless @{$pc19list{$call}}; } else { - my $parent = Route::Node::get($origin); + my $parent = Route::Node::get($self->{call}); unless ($parent) { - dbg("DXPROT: my parent $origin has disappeared"); + dbg("DXPROT: my parent $self->{call} has disappeared"); $self->disconnect; return; } @@ -1144,9 +1170,9 @@ sub handle_21 my $node = Route::Node::get($call); if ($node) { - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan && $dxchan != $self) { - dbg("PCPROT: PC21 from $origin trying to alter locally connected $call, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC21 from $self->{call} trying to alter locally connected $call, ignored!") if isdbg('chanerr'); return; } @@ -1208,13 +1234,24 @@ sub handle_23 dbg("PCPROT: WWV Date ($_[1] $_[2]) out of range") if isdbg('chanerr'); return; } - if (Geomag::dup($d,$sfi,$k,$i,$_[6])) { + + # global wwv filtering on INPUT + my @dxcc = ((Prefix::cty_data($_[7]))[0..2], (Prefix::cty_data($_[8]))[0..2]); + if ($self->{inwwvfilter}) { + my ($filter, $hops) = $self->{inwwvfilter}->it(@_[7,8], $origin, @dxcc); + unless ($filter) { + dbg("PCPROT: Rejected by input wwv filter") if isdbg('chanerr'); + return; + } + } + $_[7] =~ s/-\d+$//o; # remove spotter's ssid + if (Geomag::dup($d,$sfi,$k,$i,$_[6],$_[7])) { dbg("PCPROT: Dup WWV Spot ignored\n") if isdbg('chanerr'); return; } - $_[7] =~ s/-\d+$//o; # remove spotter's ssid - my $wwv = Geomag::update($d, $_[2], $sfi, $k, $i, @_[6..8], $r); + # note this only takes the first one it gets + Geomag::update($d, $_[2], $sfi, $k, $i, @_[6..8], $r); my $rep; eval { @@ -1376,7 +1413,7 @@ sub handle_39 my $pcno = shift; my $line = shift; my $origin = shift; - if ($_[1] eq $origin) { + if ($_[1] eq $self->{call}) { $self->disconnect(1); } else { dbg("PCPROT: came in on wrong channel") if isdbg('chanerr'); @@ -1492,11 +1529,11 @@ sub handle_50 my $call = $_[1]; - RouteDB::update($call, $origin); + RouteDB::update($call, $self->{call}); my $node = Route::Node::get($call); if ($node) { - return unless $node->call eq $origin; + return unless $node->call eq $self->{call}; $node->usercount($_[2]); # input filter if required @@ -1523,52 +1560,11 @@ sub handle_51 if ($flag == 1) { $self->send(pc51($from, $to, '0')); } else { - # it's a reply, look in the ping list for this one - my $ref = $pings{$from}; - 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 $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; - push @{$tochan->{pingtime}}, $t; - shift @{$tochan->{pingtime}} if @{$tochan->{pingtime}} > 6; - - # cope with a missed ping, this means you must set the pingint large enough - if ($t > $tochan->{pingint} && $t < 2 * $tochan->{pingint} ) { - $t -= $tochan->{pingint}; - } - - # calc smoothed RTT a la TCP - if (@{$tochan->{pingtime}} == 1) { - $tochan->{pingave} = $t; - } else { - $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; - } - } - } - } - } + DXXml::Ping::handle_ping_reply($self, $from); } } else { - RouteDB::update($from, $origin); + RouteDB::update($from, $self->{call}); if (eph_dup($line)) { dbg("PCPROT: dup PC51 detected") if isdbg('chanerr'); @@ -1677,7 +1673,7 @@ sub handle_default sub process { my $t = time; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $pc50s; @@ -1689,7 +1685,8 @@ sub process } foreach $dxchan (@dxchan) { - next unless $dxchan->is_node(); + next unless $dxchan->is_node; + next if $dxchan->handle_xml; next if $dxchan == $main::me; # send the pc50 @@ -1700,9 +1697,10 @@ sub process if ($dxchan->{nopings} <= 0) { $dxchan->disconnect; } else { - addping($main::mycall, $dxchan->call); + DXXml::Ping::add($main::me, $dxchan->call); $dxchan->{nopings} -= 1; $dxchan->{lastping} = $t; + $dxchan->{lastping} += $dxchan->{pingint} / 2 unless @{$dxchan->{pingtime}}; } } } @@ -1734,6 +1732,36 @@ sub process # +sub send_dx_spot +{ + my $self = shift; + my $line = shift; + my @dxchan = DXChannel::get_all(); + my $dxchan; + + # send it if it isn't the except list and isn't isolated and still has a hop count + # taking into account filtering and so on + foreach $dxchan (@dxchan) { + next if $dxchan == $main::me; + next if $dxchan == $self && $self->is_node; + $dxchan->dx_spot($line, $self->{isolate}, @_, $self->{call}); + } +} + +sub dx_spot +{ + my $self = shift; + my $line = shift; + my $isolate = shift; + my ($filter, $hops); + + if ($self->{spotsfilter}) { + ($filter, $hops) = $self->{spotsfilter}->it(@_); + return unless $filter; + } + send_prot_line($self, $filter, $hops, $isolate, $line); +} + sub send_prot_line { my ($self, $filter, $hops, $isolate, $line) = @_; @@ -1759,7 +1787,7 @@ sub send_wwv_spot { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my @dxcc = ((Prefix::cty_data($_[6]))[0..2], (Prefix::cty_data($_[7]))[0..2]); @@ -1783,7 +1811,7 @@ sub wwv my ($filter, $hops); if ($self->{wwvfilter}) { - ($filter, $hops) = $self->{wwvfilter}->it(@_); + ($filter, $hops) = $self->{wwvfilter}->it(@_[7..$#_]); return unless $filter; } send_prot_line($self, $filter, $hops, $isolate, $line) @@ -1793,7 +1821,7 @@ sub send_wcy_spot { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my @dxcc = ((Prefix::cty_data($_[10]))[0..2], (Prefix::cty_data($_[11]))[0..2]); @@ -1826,7 +1854,7 @@ sub send_announce { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $target; my $to = 'To '; @@ -1891,7 +1919,7 @@ sub send_chat { my $self = shift; my $line = shift; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $target = $_[3]; my $text = unpad($_[2]); @@ -2032,7 +2060,7 @@ sub route } # always send it down the local interface if available - my $dxchan = DXChannel->get($call); + my $dxchan = DXChannel::get($call); if ($dxchan) { dbg("route: $call -> $dxchan->{call} direct" ) if isdbg('route'); } else { @@ -2055,7 +2083,7 @@ sub route dbg("PCPROT: Trying to route back to source, dropped") if isdbg('chanerr'); return; } - $dxchan = DXChannel->get($rcall); + $dxchan = DXChannel::get($rcall); dbg("route: $call -> $rcall using RouteDB" ) if isdbg('route') && $dxchan; } } @@ -2107,7 +2135,7 @@ sub adjust_hops $s =~ s/\^H(\d+)(\^~?)$/\^H$newhops$2/ if $newhops; } else { # simply decrement it -# $hops--; this is done on receipt now + $hops--; return "" if !$hops; $s =~ s/\^H(\d+)(\^~?)$/\^H$hops$2/ if $hops; } @@ -2127,29 +2155,6 @@ sub load_hops return (); } - -# add a ping request to the ping queues -sub addping -{ - my ($from, $to, $via) = @_; - my $ref = $pings{$to} || []; - my $r = {}; - $r->{call} = $from; - $r->{t} = [ gettimeofday ]; - if ($via && (my $dxchan = DXChannel->get($via))) { - $dxchan->send(pc51($to, $main::mycall, 1)); - } else { - route(undef, $to, pc51($to, $main::mycall, 1)); - } - push @$ref, $r; - $pings{$to} = $ref; - my $u = DXUser->get_current($to); - if ($u) { - $u->lastping(($via || $from), $main::systime); - $u->put; - } -} - sub process_rcmd { my ($self, $tonode, $fromnode, $user, $cmd) = @_; @@ -2188,13 +2193,13 @@ sub process_rcmd_reply if ($tonode eq $main::mycall) { my $s = $rcmds{$fromnode}; if ($s) { - my $dxchan = DXChannel->get($s->{call}); - my $ref = $user eq $tonode ? $dxchan : (DXChannel->get($user) || $dxchan); + my $dxchan = DXChannel::get($s->{call}); + my $ref = $user eq $tonode ? $dxchan : (DXChannel::get($user) || $dxchan); $ref->send($line) if $ref; delete $rcmds{$fromnode} if !$dxchan; } else { # send unsolicited ones to the sysop - my $dxchan = DXChannel->get($main::myalias); + my $dxchan = DXChannel::get($main::myalias); $dxchan->send($line) if $dxchan; } } else { @@ -2294,9 +2299,6 @@ sub disconnect # broadcast to all other nodes that all the nodes connected to via me are gone unless ($pc39flag && $pc39flag == 2) { - my $thing = Thingy::Bye->new(user=>$call); - $thing->broadcast($self); - $self->route_pc21($main::mycall, undef, @rout) if @rout; }