fix // in talk
[spider.git] / perl / DXChannel.pm
index c4a81c7f509b503a9c3025217f2a3f80b45c5177..d0c995d9756c3bd582e3ed2c9db8766f6b38d5a0 100644 (file)
@@ -85,7 +85,7 @@ $count = 0;
                  inwcyfilter => '5,WCY Filt-inp',
                  inspotsfilter => '5,Spot Filt-inp',
                  inroutefilter => '5,Route Filt-inp',
-                 passwd => '9,Passwd List,parray',
+                 passwd => '9,Passwd List,yesno',
                  pingint => '5,Ping Interval ',
                  nopings => '5,Ping Obs Count',
                  lastping => '5,Ping last sent,atime',
@@ -105,11 +105,20 @@ $count = 0;
                  width => '0,Column Width',
                  disconnecting => '9,Disconnecting,yesno',
                  ann_talk => '0,Suppress Talk Anns,yesno',
+                 metric => '1,Route metric',
+                 badcount => '1,Bad Word Count',
+                 edit => '7,Edit Function',
+                 registered => '9,Registered?,yesno',
+                 prompt => '0,Required Prompt',
+                 version => '1,Node Version',
+                 build => '1,Node Build',
+                 verified => '9,Verified?,yesno',
+                 newroute => '1,New Style Routing,yesno',
                 );
 
 use vars qw($VERSION $BRANCH);
 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
@@ -294,6 +303,15 @@ sub sort
        return @_ ? $self->{'sort'} = shift : $self->{'sort'} ;
 }
 
+# find out whether we are prepared to believe this callsign on this interface
+sub is_believed
+{
+       my $self = shift;
+       my $call = shift;
+       
+       return grep $call eq $_, $self->user->believe;
+}
+
 # handle out going messages, immediately without waiting for the select to drop
 # this could, in theory, block
 sub send_now
@@ -418,6 +436,7 @@ sub disconnect
        my $self = shift;
        my $user = $self->{user};
        
+       main::clean_inqueue($self);          # clear out any remaining incoming frames
        $user->close() if defined $user;
        $self->{conn}->disconnect;
        $self->del();
@@ -489,12 +508,12 @@ sub decode_input
        # the above regexp must work
        unless (defined $sort && defined $call && defined $line) {
 #              $data =~ s/([\x00-\x1f\x7f-\xff])/uc sprintf("%%%02x",ord($1))/eg;
-               dbg("DUFF Line on $chcall: $data") if isdbg('err');
+               dbg("DUFF Line on $chcall: $data");
                return ();
        }
 
        if(ref($dxchan) && $call ne $chcall) {
-               dbg("DUFF Line come in for $call on wrong channel $chcall") if isdbg('err');
+               dbg("DUFF Line come in for $call on wrong channel $chcall");
                return();
        }
        
@@ -505,36 +524,130 @@ sub rspfcheck
 {
        my ($self, $flag, $node, $user) = @_;
        my $nref = Route::Node::get($node);
-       if ($nref) {
-           if ($nref->dxchan == $self) {
+       my $dxchan = $nref->dxchan if $nref;
+       if ($nref && $dxchan) {
+           if ($dxchan == $self) {
                        return 1 unless $user;
+                       return 1 if $user eq $node;
                        my @users = $nref->users;
                        return 1 if @users == 0 || grep $user eq $_, @users;
-                       dbg("RSPF: $user not on $node") if isdbg('rspf');
+                       dbg("RSPF: $user not on $node") if isdbg('chanerr');
                } else {
-                       dbg("RSPF: Shortest path for $node is " . $nref->dxchan->{call}) if isdbg('rspf');
+                       dbg("RSPF: Shortest path for $node is " . $nref->dxchan->{call}) if isdbg('chanerr');
                }
        } else {
                return 1 if $flag;
-               dbg("RSPF: required $node not found" ) if isdbg('rspf');
+               dbg("RSPF: required $node not found" ) if isdbg('chanerr');
        }
        return 0;
 }
 
-no strict;
+# broadcast a message to all clusters taking into account isolation
+# [except those mentioned after buffer]
+sub broadcast_nodes
+{
+       my $s = shift;                          # the line to be rebroadcast
+       my @except = @_;                        # to all channels EXCEPT these (dxchannel refs)
+       my @dxchan = DXChannel::get_all_nodes();
+       my $dxchan;
+       
+       # send it if it isn't the except list and isn't isolated and still has a hop count
+       foreach $dxchan (@dxchan) {
+               next if grep $dxchan == $_, @except;
+               next if $dxchan == $main::me;
+               
+               my $routeit = $dxchan->can('adjust_hops') ? $dxchan->adjust_hops($s) : $s;      # adjust its hop count by node name
+
+               $dxchan->send($routeit) unless $dxchan->{isolate} || !$routeit;
+       }
+}
+
+# broadcast a message to all clusters ignoring isolation
+# [except those mentioned after buffer]
+sub broadcast_all_nodes
+{
+       my $s = shift;                          # the line to be rebroadcast
+       my @except = @_;                        # to all channels EXCEPT these (dxchannel refs)
+       my @dxchan = DXChannel::get_all_nodes();
+       my $dxchan;
+       
+       # send it if it isn't the except list and isn't isolated and still has a hop count
+       foreach $dxchan (@dxchan) {
+               next if grep $dxchan == $_, @except;
+               next if $dxchan == $main::me;
+
+               my $routeit = $dxchan->can('adjust_hops') ? $dxchan->adjust_hops($s) : $s;      # adjust its hop count by node name
+               $dxchan->send($routeit);
+       }
+}
+
+# broadcast to all users
+# storing the spot or whatever until it is in a state to receive it
+sub broadcast_users
+{
+       my $s = shift;                          # the line to be rebroadcast
+       my $sort = shift;           # the type of transmission
+       my $fref = shift;           # a reference to an object to filter on
+       my @except = @_;                        # to all channels EXCEPT these (dxchannel refs)
+       my @dxchan = DXChannel::get_all_users();
+       my $dxchan;
+       my @out;
+       
+       foreach $dxchan (@dxchan) {
+               next if grep $dxchan == $_, @except;
+               push @out, $dxchan;
+       }
+       broadcast_list($s, $sort, $fref, @out);
+}
+
+
+# broadcast to a list of users
+sub broadcast_list
+{
+       my $s = shift;
+       my $sort = shift;
+       my $fref = shift;
+       my $dxchan;
+       
+       foreach $dxchan (@_) {
+               my $filter = 1;
+               next if $dxchan == $main::me;
+               
+               if ($sort eq 'dx') {
+                   next unless $dxchan->{dx};
+                       ($filter) = $dxchan->{spotsfilter}->it(@{$fref}) if ref $fref;
+                       next unless $filter;
+               }
+               next if $sort eq 'ann' && !$dxchan->{ann} && $s !~ /^To\s+LOCAL\s+de\s+(?:$main::myalias|$main::mycall)/i;
+               next if $sort eq 'wwv' && !$dxchan->{wwv};
+               next if $sort eq 'wcy' && !$dxchan->{wcy};
+               next if $sort eq 'wx' && !$dxchan->{wx};
+
+               $s =~ s/\a//og unless $dxchan->{beep};
+
+               if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
+                       $dxchan->send($s);      
+               } else {
+                       $dxchan->delay($s);
+               }
+       }
+}
+
+
+#no strict;
 sub AUTOLOAD
 {
-       my $self = shift;
+       no strict;
        my $name = $AUTOLOAD;
        return if $name =~ /::DESTROY$/;
-       $name =~ s/.*:://o;
+       $name =~ s/^.*:://o;
   
        confess "Non-existant field '$AUTOLOAD'" if !$valid{$name};
 
        # this clever line of code creates a subroutine which takes over from autoload
        # from OO Perl - Conway
-       *{$AUTOLOAD} = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}} ;
-    @_ ? $self->{$name} = shift : $self->{$name} ;
+       *$AUTOLOAD = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}};
+       goto &$AUTOLOAD;
 }