*** empty log message ***
[spider.git] / perl / Thingy / RouteUser.pm
diff --git a/perl/Thingy/RouteUser.pm b/perl/Thingy/RouteUser.pm
new file mode 100644 (file)
index 0000000..6a69f09
--- /dev/null
@@ -0,0 +1,90 @@
+package Thingy::RouteUser;
+
+use vars qw($VERSION $BRANCH %valid);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
+%valid = (
+                 list => '0,List of Calls,parray',
+                 new => '0,List of new Routes,parray',
+                );
+
+sub add
+{
+       my $self = shift;
+
+       my $dxchan = DXChannel->get($self->{fromdxchan});
+       my $parent = Route::Node::get($self->{fromnode});
+       
+       my @rout;
+       foreach my $r (@{$self->{list}}) {
+
+               my $user;
+               if ($sort eq 'U') {
+                       my $old = Route::User::get($r->call);
+                       if ($old) {
+                               if ($old->flags != $r->flags) {
+                                       $old->flags($r->flags);
+                                       push @rout, $r;
+                               }
+                               $old->addparent($parent);
+                       } else {
+                               $r->register;
+                               $parent->add_user($r->call);
+                               $r->add_parent($parent);
+                               push @rout, $r;
+                       }
+                       
+                       # add this station to the user database, if required
+                       $call =~ s/-\d+$//o;        # remove ssid for users
+                       $user = DXUser->get_current($call) || DXUser->new($call);
+                       $user->homenode($parent->call) unless $user->homenode;
+                       $user->node($parent->call);
+               } elsif ($sort eq 'N') {
+                       my $old = Route::Node::get($call);
+                       if ($old) {
+                               my $ar;
+                               $ar = $parent->add($call, $ver, $flags);
+                                               push @rout, $ar if $ar;
+                                       } else {
+                                               next;
+                                       }
+                               }
+                               if ($r->version ne $ver || $r->flags != $flags) {
+                                       $r->version($ver);
+                                       $r->flags($flags);
+                                       push @rout, $r unless $ar;
+                               }
+                       } else {
+                               if ($call eq $self->{call}) {
+                                       dbg("DXPROT: my channel route for $call has disappeared");
+                                       next;
+                               };
+                               
+                               my $new = Route->new($call);          # throw away
+                               if ($dxchan->in_filter_route($new)) {
+                                       my $r = $parent->add($call, $ver, $flags);
+                                       push @rout, $r;
+                               } else {
+                                       next;
+                               }
+                       }
+
+                       # add this station to the user database, if required (don't remove SSID from nodes)
+                       my $user = DXUser->get_current($call);
+                       unless ($user) {
+                               $user = DXUser->new($call);
+                               $user->sort('A');
+                               $user->priv(1);                   # I have relented and defaulted nodes
+                               $user->lockout(1);
+                               $user->homenode($call);
+                               $user->node($call);
+                       }
+               }
+               $user->lastin($main::systime) unless DXChannel->get($call);
+               $user->put;
+       }
+       $self->{new} = \@rout;
+}