add pc93 talk messages
authorminima <minima>
Mon, 22 Jan 2007 12:55:10 +0000 (12:55 +0000)
committerminima <minima>
Mon, 22 Jan 2007 12:55:10 +0000 (12:55 +0000)
perl/DXChannel.pm
perl/DXProt.pm
perl/DXProtHandle.pm
perl/DXProtout.pm
perl/RouteDB.pm

index 36b221561c19775a570a7ca819c2dbd3f173be3b..98617515981c8821f8590031aa41984ef277c253 100644 (file)
@@ -120,7 +120,7 @@ $count = 0;
                  inscript => '9,In a script,yesno',
                  handle_xml => '9,Handles XML,yesno',
                  do_pc92 => '9,Handles PC92,yesno',
-                 send_pc92 => '9,Send PC92,atime',
+                 do_pc93 => '9,Handles PC93,yesno',
                  inqueue => '9,Input Queue,parray',
                 );
 
index 33f962fda2cd583cde3a12d18d2c3ea1d30f2273..4e32c22e77940e1eea3db025e85a55b08c0039ca 100644 (file)
@@ -371,12 +371,14 @@ sub normal
        }
 
        # modify the hop count here
-       if (my ($hops, $trail) = $line =~ /\^H(\d+)(\^?\~?)?$/) {
-               $trail ||= '';
-               $hops--;
-               return if $hops < 0;
-               $line =~ s/\^H(\d+)(\^?\~?)?$/sprintf('^H%d%s', $hops, $trail)/e;
-               $field[-1] = "H$hops";
+       if ($self != $main::me) {
+               if (my ($hops, $trail) = $line =~ /\^H(\d+)(\^?\~?)?$/) {
+                       $trail ||= '';
+                       $hops--;
+                       return if $hops < 0;
+                       $line =~ s/\^H(\d+)(\^?\~?)?$/sprintf('^H%d%s', $hops, $trail)/e;
+                       $field[-1] = "H$hops";
+               }
        }
 
        # send it out for processing
@@ -1157,8 +1159,11 @@ sub talk
 {
        my ($self, $from, $to, $via, $line, $origin) = @_;
        
-       $line =~ s/\^/\\5E/g;                   # remove any ^ characters
-       $self->send(DXProt::pc10($from, $to, $via, $line, $origin));
+       if ($self->{do_pc93}) {
+               $self->send(pc93($to, $from, $via, $line));
+       } else {
+               $self->send(pc10($from, $to, $via, $line, $origin));
+       }
        Log('talk', $to, $from, $via?$via:$self->call, $line) unless $origin && $origin ne $main::mycall;
 }
 
index 9d287df45133b1e3925e26d01a40b6c69a907a61..938d0fbca136cb84aedd245e03c3ebc011ffc54f 100644 (file)
@@ -611,7 +611,10 @@ sub handle_18
                }
                $self->{handle_xml}++ if DXXml::available() && $_[1] =~ /\bxml/;
                my ($pc9x) = $_[1] =~ /\bpc9\[(\d+)\]/;
-               $self->{do_pc92}++ if defined $pc9x && $pc9x =~ /2/;
+               if (defined $pc9x) {
+                       $self->{do_pc92}++ if $pc9x =~ /2/;
+                       $self->{do_pc93}++ if $pc9x =~ /3/;
+               }
        } else {
                $self->version(50.0);
                $self->version($_[2] / 100) if $_[2] && $_[2] =~ /^\d+$/;
@@ -1553,6 +1556,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]) {
@@ -1596,10 +1600,82 @@ 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_pc93} ||= 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];
+
+       # 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 = 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);
+                       return;
+               }
+
+               # convert to PC10 talks where appropriate
+               my $ref = Route::get($to);
+               if ($ref) {
+                       my @dxchan = $ref->alldxchan;
+                       for $dxchan (@dxchan) {
+                               if ($dxchan->{do_pc93}) {
+                                       $dxchan->send($line);
+                               } else {
+                                       $dxchan->talk($from, $to, $via, $text);
+                               }
+                       }
+                       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.
@@ -1618,8 +1694,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
+                       }
                }
        }
 }
index f6f9a39c81691c3179c6db372db0b9a1d09a9cea..118261ef30450aaf96e5c2c3d729687049f7b5d5 100644 (file)
@@ -35,7 +35,7 @@ sub pc10
 {
        my ($from, $to, $via, $text, $origin) = @_;
        my ($user1, $user2);
-       if ($via && $via ne $to) {
+       if ($via && $via ne $to && $via ne '*') {
                $user1 = $via;
                $user2 = $to;
        } else {
@@ -120,7 +120,7 @@ sub pc17
 # Request init string
 sub pc18
 {
-       my $flags = " pc9[2]";
+       my $flags = " pc9[23]";
        $flags .= " xml" if DXXml::available(); 
        return "PC18^DXSpider Version: $main::version Build: $main::build$flags^$DXProt::myprot_version^";
 }
@@ -417,6 +417,17 @@ sub pc92c
        return _gen_pc92('C', 1, @_);
 }
 
+sub pc93
+{
+       my $to = shift;                         # *, callsign, chat group name, sysop
+       my $from = shift;                       # from user callsign
+       my $via = shift || '*';                 # *, node call
+       my $line = shift;                       # the text
+       $line = unpad($line);
+       $line =~ s/\^/\\5E/g;           # remove any ^ characters
+       return "PC93^$main::mycall^" . gen_pc9x_t() . "^$to^$from^$via^$line^H99^";
+}
+
 1;
 __END__
 
index 42cf693f76f65a6d06772b3a68b36aaa131e6979..96d0b0b4691a690c6d13d647040c67b108e759f1 100644 (file)
@@ -90,7 +90,7 @@ sub update
        my $interface = shift;
        my $hops = shift || $default;
        my $ref = $list{$call} || RouteDB->new($call);
-       my $iref = $ref->{item}->{$interface} ||= RouteDB::Item->new($interface);
+       my $iref = $ref->{item}->{$interface} ||= RouteDB::Item->new($interface, $hops);
        $iref->{count}++;
        $iref->{hops} = $hops if $hops < $iref->{hops};
        $iref->{t} = shift || $main::systime;
@@ -142,7 +142,8 @@ sub new
 {
        my $pkg = shift;
        my $call = shift;
-       return bless {call => $call, hops => $RouteDB::default}, (ref $pkg || $pkg);
+       my $hops = shift || $RouteDB::default;
+       return bless {call => $call, hops => $hops}, (ref $pkg || $pkg);
 }
 
 1;