added user filtering (or at leats the capability for it)
[spider.git] / perl / DXProt.pm
index a6982f1f2bf53a47025e22200556f58c7ba39522..b446b713f3e705994c1516995ff21583335425c3 100644 (file)
@@ -230,35 +230,7 @@ sub normal
                        return if $pcno == 26;
 
                        # send out the filtered spots
-                       my @dxchan = get_all_ak1a();
-                       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 == $self;
-                               my $routeit;
-                               my ($filter, $hops) = Filter::it($dxchan->{spotfilter}, @spot, $self->{call} ) if $dxchan->{spotfilter};
-                               if ($hops) {
-                                       $routeit = $line;
-                                       $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/;
-                               } else {
-                                       $routeit = adjust_hops($dxchan, $line);  # adjust its hop count by node name
-                                       next unless $routeit;
-                               }
-                               if ($filter) {
-                                       $dxchan->send($routeit) if $routeit;
-                               } else {
-                                       $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
-                               }                                       
-                       }
-
-                       # send orf to the users
-                       if (@spot) {
-                               my $buf = Spot::formatb($field[1], $field[2], $d, $text, $spotter);
-                               broadcast_users("$buf\a\a", 'dx', $spot[0]);
-                       }
-
+                       send_dx_spot($self, $line, @spot) if @spot;
                        return;
                }
                
@@ -711,33 +683,72 @@ sub finish
 #
 # some active measures
 #
+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) {
+               my $routeit;
+               my ($filter, $hops) = Filter::it($dxchan->{spotfilter}, @_, $self->{call} ) if $dxchan->{spotfilter};
+               if ($dxchan->is_ak1a) {
+                       next if $dxchan == $self;
+                       if ($hops) {
+                               $routeit = $line;
+                               $routeit =~ s/\^H\d+\^\~$/\^H$hops\^\~/;
+                       } else {
+                               $routeit = adjust_hops($dxchan, $line);  # adjust its hop count by node name
+                               next unless $routeit;
+                       }
+                       if ($filter) {
+                               $dxchan->send($routeit) if $routeit;
+                       } else {
+                               $dxchan->send($routeit) unless $dxchan->{isolate} || $self->{isolate};
+                               
+                       }
+               } elsif ($dxchan->is_user) {
+                       my $buf = Spot::formatb($_[0], $_[1], $_[2], $_[3], $_[4]);
+                       $buf .= "\a\a" if $dxchan->beep;
+                       $dxchan->send($buf);
+               }                                       
+       }
+}
 
 sub send_local_config
 {
        my $self = shift;
        my $n;
        my @nodes;
-       
+       my @localnodes;
+       my @remotenodes;
+               
        # send our nodes
        if ($self->{isolate}) {
-               @nodes = (DXCluster->get_exact($main::mycall));
+               @localnodes = (DXCluster->get_exact($main::mycall));
        } else {
                # create a list of all the nodes that are not connected to this connection
                # and are not themselves isolated, this to make sure that isolated nodes
         # don't appear outside of this node
-               @nodes = DXNode::get_all(); 
-               @nodes = grep { $_->dxchan != $self } @nodes;
-               @nodes = grep { !($_->dxchan && $_->dxchan->isolate) } @nodes;
+               @nodes = DXNode::get_all();
+               @nodes = grep { $_->dxchan != $self && !$_->dxchan->{isolate} } @nodes;
+               @nodes = grep { $_->{call} ne $main::mycall } @nodes;
+               @localnodes = grep { $_->dxchan->{call} eq $_->{call} } @nodes if @nodes;
+               unshift @localnodes, DXCluster->get_exact($main::mycall);
+               @remotenodes = grep { $_->dxchan->{call} ne $_->{call} } @nodes if @nodes;
        }
 
-       my @s = $me->pc19(@nodes);
+       my @s = $me->pc19(@localnodes, @remotenodes);
        for (@s) {
                my $routeit = adjust_hops($self, $_);
                $self->send($routeit) if $routeit;
        }
        
        # get all the users connected on the above nodes and send them out
-       foreach $n (@nodes) {
+       foreach $n (@localnodes, @remotenodes) {
                my @users = values %{$n->list};
                my @s = pc16($n, @users);
                for (@s) {
@@ -768,7 +779,8 @@ sub route
        }
 }
 
-# broadcast a message to all clusters [except those mentioned after buffer]
+# broadcast a message to all clusters taking into account isolation
+# [except those mentioned after buffer]
 sub broadcast_ak1a
 {
        my $s = shift;                          # the line to be rebroadcast
@@ -784,6 +796,23 @@ sub broadcast_ak1a
        }
 }
 
+# broadcast a message to all clusters ignoring isolation
+# [except those mentioned after buffer]
+sub broadcast_all_ak1a
+{
+       my $s = shift;                          # the line to be rebroadcast
+       my @except = @_;                        # to all channels EXCEPT these (dxchannel refs)
+       my @dxchan = get_all_ak1a();
+       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;
+               my $routeit = adjust_hops($dxchan, $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