make setting of pc9x harder
[spider.git] / perl / DXProtHandle.pm
index fcc30cfe2255ce9b71cf9db3d935b8b50b413e6d..35d656d7cfd84c91d0649a23d133a42ac6e62c45 100644 (file)
@@ -105,6 +105,12 @@ sub handle_10
        RouteDB::update($_[6], $self->{call});
 #      RouteDB::update($to, $_[6]);
 
+       # convert this to a PC93 and process it as such
+       $self->normal(pc93($to, $from, $via, $_[3], $_[6]));
+       return;
+       
+       # this is all redundant but kept for now for reference
+
        # it is here and logged on
        $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall;
        $dxchan = DXChannel::get($to) unless $dxchan;
@@ -423,6 +429,10 @@ sub handle_16
        my $h;
        $h = 1 if DXChannel::get($ncall);
        RouteDB::update($ncall, $self->{call}, $h);
+       if ($h && $self->{call} ne $ncall) {
+               dbg("PCPROT: trying to update a local node, ignored") if isdbg('chanerr');
+               return;
+       }
 
        if (eph_dup($line)) {
                dbg("PCPROT: dup PC16 detected") if isdbg('chanerr');
@@ -606,8 +616,10 @@ sub handle_18
                        $self->sort('S');
                }
                $self->{handle_xml}++ if DXXml::available() && $_[1] =~ /\bxml/;
-               my ($pc9x) = $_[1] =~ /\bpc9\[(\d+)\]/;
-               $self->{do_pc92}++ if defined $pc9x && $pc9x =~ /2/;
+               if ($_[1] =~ /\bpc9x/) {
+                       $self->{do_pc9x} = 1;
+                       dbg("Do px9x set on $self->{call}");
+               }
        } else {
                $self->version(50.0);
                $self->version($_[2] / 100) if $_[2] && $_[2] =~ /^\d+$/;
@@ -764,7 +776,7 @@ sub handle_19
        # but remember there will only be one (pair) these because any extras will be
        # thrown away.
        if (@rout) {
-               $self->route_pc21($self->{call}, $line, @rout);
+#              $self->route_pc21($self->{call}, $line, @rout);
                $self->route_pc19($self->{call}, $line, @rout);
        }
        if (@pc92out) {
@@ -776,9 +788,15 @@ sub send_delayed_pc92
 {
        my $self = shift;
        
-       # send out delayed PC92 config for this node if it is external
-       my $line = $main::me->gen_my_pc92_config;
+       # send out new PC92 config to everyone else 
+       my $line = gen_my_pc92_config($main::me);
        $self->broadcast_route_pc9x($main::mycall, undef, $line, 0);
+
+       # if this is an external node then send out the external config
+       unless ($self->{do_pc9x}) {
+               $line = gen_my_pc92_config(Route::Node::get($self->{call}));
+               $self->broadcast_route_pc9x($main::mycall, undef, $line, 0);
+       }
 }
 
 # send local configuration
@@ -789,7 +807,7 @@ sub handle_20
        my $line = shift;
        my $origin = shift;
 
-       if ($self->{do_pc92} && $self->{state} ne 'init92') {
+       if ($self->{do_pc9x} && $self->{state} ne 'init92') {
                dbg("PCPROT: disconnecting because login call not sent in any pc92") if isdbg('chanerr');
                $self->send("**** You logged in with $self->{call} but that is NOT your \$mycall");
                $self->disconnect;
@@ -874,26 +892,17 @@ sub handle_22
        my $line = shift;
        my $origin = shift;
 
-       if ($self->{do_pc92}) {
+       if ($self->{do_pc9x}) {
                if ($self->{state} ne 'init92') {
                        dbg("PCPROT: disconnecting because login call not sent in any pc92") if isdbg('chanerr');
                        $self->send("**** You logged in with $self->{call} but that is NOT your \$mycall");
                        $self->disconnect;
                        return;
                }
-#              my $ref = Route::Node::get($self->{call});
-#              if ($ref) {
-#                      $main::me->route_pc92a($main::mycall, undef, $main::routeroot, $ref);
-#              } else {
-#                      dbg("PCPROT: disconnecting because pc92 for $self->{call} received") if isdbg('chanerr');
-#                      $self->disconnect;
-#                      return;
-#              }
-#      } else {
-               $self->send_delayed_pc92;
        }
        $self->{lastping} = 0;
        $self->state('normal');
+       $self->send_delayed_pc92;
 }
                                
 # WWV info
@@ -1362,7 +1371,7 @@ sub _encode_pc92_call
        if ($ref->isa('Route::Node') || $ref->isa('DXProt')) {
                $flag |= 4;
                my $dxchan = DXChannel::get($call);
-               $flag |= 2 if $call ne $main::mycall && $dxchan && !$dxchan->{do_pc92};
+               $flag |= 2 if $call ne $main::mycall && $dxchan && !$dxchan->{do_pc9x};
                if ($ext) {
                        if ($ref->version) {
                                my $version = $ref->version || 1.0;
@@ -1460,8 +1469,6 @@ sub handle_92
 
        my (@radd, @rdel);
        
-       $self->{do_pc92} ||= 1;
-
        my $pcall = $_[1];
        unless ($pcall) {
                dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
@@ -1483,8 +1490,11 @@ sub handle_92
        my $parent = check_pc9x_t($pcall, $t, 92, 1) || return;
        my $oparent = $parent;
        
-       $parent->lastid->{92} = $t;
-       $parent->do_pc92(1);
+       if (!$self->{do_pc9x} && $self->{call} eq $pcall && $self->state =~ /^init/) {
+               $self->{do_pc9x} = 1;
+               dbg("Do_px9x set on $pcall");
+       }
+       $parent->do_pc9x(1);
        $parent->via_pc92(1);
 
        if (@ent) {
@@ -1552,6 +1562,7 @@ sub handle_92
                        dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('route');
                }
 
+               # 
                foreach my $r (@nent) {
 #                      my ($call, $is_node, $is_extnode, $here, $version, $build) = _decode_pc92_call($_);                     
                        if ($r->[0]) {
@@ -1595,10 +1606,85 @@ sub handle_92
        }
        my @pc19 = grep { $_ && $_->isa('Route::Node') } @radd;
        my @pc16 = grep { $_ && $_->isa('Route::User') } @radd;
+       unshift @pc19, $parent if $self->{state} eq 'init92' && $oparent == $parent;
        $self->route_pc19($pcall, undef, @pc19) if @pc19;
        $self->route_pc16($pcall, undef, $parent, @pc16) if @pc16;
 }
 
+sub handle_93
+{
+       my $self = shift;
+       my $pcno = shift;
+       my $line = shift;
+       my $origin = shift;
+
+#      $self->{do_pc9x} ||= 1;
+
+       my $pcall = $_[1];
+       unless (is_callsign($pcall)) {
+               dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
+               return;
+       }
+       my $t = $_[2];
+       my $parent = check_pc9x_t($pcall, $t, 93, 1) || return;
+
+       my $to = $_[3];
+       my $from = $_[4];
+       my $via = $_[5];
+       my $text = $_[6];
+       my $onode = $_[7];
+       $onode = $pcall if @_ <= 8;
+
+       # will we allow it at all?
+       if ($censorpc) {
+               my @bad;
+               if (@bad = BadWords::check($text)) {
+                       dbg("PCPROT: Bad words: @bad, dropped") if isdbg('chanerr');
+                       return;
+               }
+       }
+       
+       # if this is a 'bad spotter' user then ignore it
+       my $nossid = $from;
+       $nossid =~ s/-\d+$//;
+       if ($badspotter->in($nossid)) {
+               dbg("PCPROT: Bad Spotter, dropped") if isdbg('chanerr');
+               return;
+       }
+
+       if (is_callsign($to)) {
+               # local talks 
+               my $dxchan;
+               $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall;
+               $dxchan = DXChannel::get($to) unless $dxchan;
+               if ($dxchan && $dxchan->is_user) {
+                       $dxchan->talk($from, $to, $via, $text, $onode);
+                       return;
+               }
+
+               # convert to PC10 talks where appropriate
+               my $ref = Route::get($to);
+               if ($ref) {
+                       my @dxchan = $ref->alldxchan;
+                       for $dxchan (@dxchan) {
+                               if ($dxchan->{do_pc9x}) {
+                                       $dxchan->send($line);
+                               } else {
+                                       $dxchan->talk($from, $to, $via, $text, $onode);
+                               }
+                       }
+                       return;
+               }
+
+               # otherwise, drop through and allow it to be broadcast
+       } elsif ($to eq '*' || $to eq 'SYSOP' || $to eq 'WX') {
+               # announces
+       } else {
+               # chat messages
+       }
+       $self->broadcast_route_pc9x($pcall, undef, $line, 0);
+}
+
 # if get here then rebroadcast the thing with its Hop count decremented (if
 # there is one). If it has a hop count and it decrements to zero then don't
 # rebroadcast it.
@@ -1617,8 +1703,19 @@ sub handle_default
        if (eph_dup($line)) {
                dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr');
        } else {
-               unless ($self->{isolate}) {
-                       DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
+               if ($pcno >= 90) {
+                       my $pcall = $_[1];
+                       unless (is_callsign($pcall)) {
+                               dbg("PCPROT: invalid callsign string '$_[1]', ignored") if isdbg('chanerr');
+                               return;
+                       }
+                       my $t = $_[2];
+                       my $parent = check_pc9x_t($pcall, $t, $pcno, 1) || return;
+                       $self->broadcast_route_pc9x($pcall, undef, $line, 0);
+               } else {
+                       unless ($self->{isolate}) {
+                               DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me
+                       }
                }
        }
 }