X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=65b666a2fed8a5315e4b641ec1527314bb0e98ef;hb=27b6e9691f9985830388bbb8fc0a04357fa4f11f;hp=712f933e833f29bd8a4508f79be4df614d4d9dec;hpb=7d72afb65bc994c04c208095b66abddee41de7e9;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 712f933e..65b666a2 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -40,14 +40,14 @@ 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); -$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; + +main::mkver($VERSION = q$Revision$); 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 @@ -223,7 +223,7 @@ sub init $main::me->{metric} = 0; $main::me->{pingave} = 0; $main::me->{registered} = 1; - $main::me->{version} = 5251 + $main::version; + $main::me->{version} = 5252 + $main::version; $main::me->{build} = $main::build; } @@ -239,7 +239,11 @@ 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; } @@ -309,6 +313,9 @@ 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'); @@ -434,8 +441,8 @@ sub handle_10 # 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]); @@ -533,9 +540,9 @@ sub handle_11 my @spot = Spot::prepare($_[1], $_[2], $d, $_[5], $_[6], $_[7]); - my $thing = Thingy::Dx->new(origin=>$main::mycall, group=>'DX'); + my $thing = Thingy::Dx->new(origin=>$main::mycall); $thing->from_DXProt(DXProt=>$line,spotdata=>\@spot); - $thing->queue($self); + $thing->process($self); # this goes after the input filtering, but before the add # so that if it is input filtered, it isn't added to the dup @@ -593,20 +600,6 @@ 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 @@ -647,7 +640,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) { @@ -707,14 +700,14 @@ sub handle_16 return; } - RouteDB::update($ncall, $origin); + RouteDB::update($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -754,16 +747,16 @@ sub handle_16 $parent = Route::Node::get($_->[0]); $dxchan = $parent->dxchan if $parent; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC19 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + 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 @@ -783,25 +776,25 @@ sub handle_16 return; } } else { - + $dxchan = $parent->dxchan; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC16 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC16 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } # 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 '*'; @@ -812,18 +805,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); } @@ -834,7 +827,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; @@ -855,7 +848,7 @@ sub handle_17 # do 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; } if ($ncall eq $main::mycall) { @@ -863,14 +856,14 @@ sub handle_17 return; } - RouteDB::delete($ncall, $origin); + RouteDB::delete($ncall, $self->{call}); # do we believe this call? - unless ($ncall eq $origin || $self->is_believed($ncall)) { - if (my $ivp = Investigate::get($ncall, $origin)) { + unless ($ncall eq $self->{call} || $self->is_believed($ncall)) { + if (my $ivp = Investigate::get($ncall, $self->{call})) { $ivp->store_pcxx($pcno,$line,$origin,@_); } else { - dbg("PCPROT: We don't believe $ncall on $origin") if isdbg('chanerr'); + dbg("PCPROT: We don't believe $ncall on $self->{call}") if isdbg('chanerr'); } return; } @@ -886,7 +879,7 @@ sub handle_17 $dxchan = $parent->dxchan if $parent; if ($dxchan && $dxchan ne $self) { - dbg("PCPROT: PC17 from $origin trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); + dbg("PCPROT: PC17 from $self->{call} trying to alter locally connected $ncall, ignored!") if isdbg('chanerr'); return; } @@ -1000,7 +993,7 @@ 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'); next; @@ -1082,7 +1075,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; } @@ -1101,6 +1094,9 @@ sub handle_20 $self->send(pc22()); $self->state('normal'); $self->{lastping} = 0; + my $thing = Thingy::Rt->new_cf(user=>$self->{call}); + my $nref = Route::Node::get($self->{call}); + $thing->broadcast if $thing->copy_pc16_data($nref); } # delete a cluster from the list @@ -1151,7 +1147,7 @@ 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'); return; @@ -1181,6 +1177,9 @@ sub handle_22 my $origin = shift; $self->state('normal'); $self->{lastping} = 0; + my $thing = Thingy::Rt->new_cf(user=>$self->{call}); + my $nref = Route::Node::get($self->{call}); + $thing->broadcast if $thing->copy_pc16_data($nref); } # WWV info @@ -1533,10 +1532,10 @@ sub handle_51 # it's a reply, look in the ping list for this one my $ref = $pings{$from}; if ($ref) { - my $tochan = DXChannel->get($from); + my $tochan = DXChannel::get($from); while (@$ref) { my $r = shift @$ref; - my $dxchan = DXChannel->get($r->{call}); + my $dxchan = DXChannel::get($r->{call}); next unless $dxchan; my $t = tv_interval($r->{t}, [ gettimeofday ]); if ($dxchan->is_user) { @@ -1684,7 +1683,7 @@ sub handle_default sub process { my $t = time; - my @dxchan = DXChannel->get_all(); + my @dxchan = DXChannel::get_all(); my $dxchan; my $pc50s; @@ -1766,7 +1765,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]); @@ -1800,7 +1799,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]); @@ -1833,7 +1832,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 '; @@ -1898,7 +1897,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]); @@ -1994,7 +1993,7 @@ sub send_local_config # don't appear outside of this node # send locally connected nodes - my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} } DXChannel::get_all_nodes(); + my @dxchan = grep { $_->call ne $main::mycall && $_ != $self && !$_->{isolate} && ($_->is_node || $_->is_aranea) } DXChannel::get_all(); @localnodes = map { my $r = Route::Node::get($_->{call}); $r ? $r : () } @dxchan if @dxchan; $self->send_route($main::mycall, \&pc19, scalar(@localnodes)+1, $main::routeroot, @localnodes); @@ -2039,7 +2038,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 { @@ -2062,7 +2061,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; } } @@ -2143,7 +2142,7 @@ sub addping my $r = {}; $r->{call} = $from; $r->{t} = [ gettimeofday ]; - if ($via && (my $dxchan = DXChannel->get($via))) { + if ($via && (my $dxchan = DXChannel::get($via))) { $dxchan->send(pc51($to, $main::mycall, 1)); } else { route(undef, $to, pc51($to, $main::mycall, 1)); @@ -2195,13 +2194,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 { @@ -2301,6 +2300,9 @@ 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; }