Allow dependant nodes to send pc16 data
[spider.git] / perl / Thingy / Rt.pm
index 0e6d21c0393272f8602d9fcf1d6c4cb3275d9a3b..bc6228b112b9c568149ea3ca78d3260366445875 100644 (file)
@@ -32,13 +32,16 @@ sub gen_Aranea
        my $thing = shift;
        unless ($thing->{Aranea}) {
                my $ref;
+               if ($ref = $thing->{anodes}) {
+                       $thing->{a} = join(':', map {"$_->{flags}$_->{call}"} @$ref);
+               }
                if ($ref = $thing->{anodes}) {
                        $thing->{n} = join(':', map {"$_->{flags}$_->{call}"} @$ref);
                }
                if ($ref = $thing->{ausers}) {
                        $thing->{u} = join(':', map {"$_->{flags}$_->{call}"} @$ref);
                }
-               $thing->{Aranea} = Aranea::genmsg($thing, [qw(s n u)]);
+               $thing->{Aranea} = Aranea::genmsg($thing, [qw(s n u)]);
        }
        return $thing->{Aranea};
 }
@@ -69,24 +72,35 @@ sub handle
 # this handles the standard local configuration, it 
 # will reset all the config, make / break links and
 # will generate pc sentences as required for nodes and users
-sub handle_lcf
+sub handle_cf
 {
        my $thing = shift;
        my $dxchan = shift;
-       my $origin = $thing->{origin};
+       my $origin = $thing->{user} || $thing->{origin};
        my $chan_call = $dxchan->{call};
        
        my $parent = Route::Node::get($origin);
        unless ($parent) {
-               dbg("Thingy::Rt::lcf: received from $origin on $chan_call unknown") if isdbg('chanerr');
+               dbg("Thingy::Rt::cf: received from $thing->{origin}/$origin on $chan_call unknown") if isdbg('chanerr');
                return;
        }
 
        # do nodes
+       my ($del, $add);
+       my %in;
        if ($thing->{n}) {
-               my %in = (map {my ($here, $call) = unpack "A1 A*", $_; ($call, $here)} split /:/, $thing->{n});
-               my ($del, $add) = $parent->diff_nodes(keys %in);
-
+               %in = (map {my ($here, $call) = unpack("A1 A*", $_); ($call, $here)} split /:/, $thing->{n});
+               my ($tdel, $tadd) = $parent->diff_nodes(keys %in);
+               $add = $tadd;
+               $del = $tdel;
+       }
+       if ($thing->{a}) {
+               %in = (map {my ($here, $call) = unpack("A1 A*", $_); ($call, $here)} split /:/, $thing->{a});
+               my ($tdel, $tadd) = $parent->diff_nodes(keys %in);
+               push @$add, @$tadd;
+               push @$del, @$tdel;
+       }
+       if (@$add || @$del) {
                my $call;
 
                my @pc21;
@@ -108,8 +122,8 @@ sub handle_lcf
        
        # now users
        if ($thing->{u}) {
-               my %in = (map {my ($here, $call) = unpack "A1 A*", $_; ($call, $here)} split /:/, $thing->{u});
-               my ($del, $add) = $parent->diff_users(keys %in);
+               %in = (map {my ($here, $call) = unpack "A1 A*", $_; ($call, $here)} split /:/, $thing->{u});
+               ($del, $add) = $parent->diff_users(keys %in);
 
                my $call;
 
@@ -144,6 +158,24 @@ sub handle_lcf
        return $thing;
 }
 
+# 
+# copy out the PC16 data for a node into the
+# pc16n and u slots if there are any users 
+#
+sub copy_node_pc16_data
+{
+       my $thing = shift;
+       my $uref = shift;
+       
+       my @u = $uref->users;
+       if (@u) {
+               $thing->{pc16n} = $uref;
+               $thing->{pc16u} = [map {Route::User::get($_)} @u];
+               return scalar @u;
+       }
+       return undef;
+}
+
 sub _add_user
 {
        my $node = shift;
@@ -183,21 +215,27 @@ sub new_lcf
        my $pkg = shift;
        my $thing = $pkg->SUPER::new(@_);
        
-       $thing->{'s'} = 'lcf';
+       $thing->{'s'} = 'cf';
 
-       my @nodes;
+       my @anodes;
+       my @pnodes;
        my @users;
        
        foreach my $dxchan (DXChannel::get_all()) {
-               if ($dxchan->is_node || $dxchan->is_aranea) {
+               next if $dxchan == $main::me;
+               if ($dxchan->is_node) {
+                       my $ref = Route::Node::get($dxchan->{call});
+                       push @pnodes, $ref if $ref;
+               } elsif ($dxchan->is_aranea) {
                        my $ref = Route::Node::get($dxchan->{call});
-                       push @nodes, $ref if $ref;
+                       push @anodes, $ref if $ref;
                } else {
                        my $ref = Route::User::get($dxchan->{call});
                        push @users, $ref if $ref;
                }
        }
-       $thing->{anodes} = \@nodes if @nodes;
+       $thing->{anodes} = \@anodes if @anodes;
+       $thing->{pnodes} = \@pnodes if @pnodes;
        $thing->{ausers} = \@users if @users;
        return $thing;
 }