*** empty log message ***
[spider.git] / perl / Thingy / RouteUser.pm
1 package Thingy::RouteUser;
2
3 use vars qw($VERSION $BRANCH %valid);
4 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
5 $BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
6 $main::build += $VERSION;
7 $main::branch += $BRANCH;
8
9 %valid = (
10                   list => '0,List of Calls,parray',
11                   new => '0,List of new Routes,parray',
12                  );
13
14 sub add
15 {
16         my $self = shift;
17
18         my $dxchan = DXChannel->get($self->{fromdxchan});
19         my $parent = Route::Node::get($self->{fromnode});
20         
21         my @rout;
22         foreach my $r (@{$self->{list}}) {
23
24                 my $user;
25                 if ($sort eq 'U') {
26                         my $old = Route::User::get($r->call);
27                         if ($old) {
28                                 if ($old->flags != $r->flags) {
29                                         $old->flags($r->flags);
30                                         push @rout, $r;
31                                 }
32                                 $old->addparent($parent);
33                         } else {
34                                 $r->register;
35                                 $parent->add_user($r->call);
36                                 $r->add_parent($parent);
37                                 push @rout, $r;
38                         }
39                         
40                         # add this station to the user database, if required
41                         $call =~ s/-\d+$//o;        # remove ssid for users
42                         $user = DXUser->get_current($call) || DXUser->new($call);
43                         $user->homenode($parent->call) unless $user->homenode;
44                         $user->node($parent->call);
45                 } elsif ($sort eq 'N') {
46                         my $old = Route::Node::get($call);
47                         if ($old) {
48                                 my $ar;
49                                 $ar = $parent->add($call, $ver, $flags);
50                                                 push @rout, $ar if $ar;
51                                         } else {
52                                                 next;
53                                         }
54                                 }
55                                 if ($r->version ne $ver || $r->flags != $flags) {
56                                         $r->version($ver);
57                                         $r->flags($flags);
58                                         push @rout, $r unless $ar;
59                                 }
60                         } else {
61                                 if ($call eq $self->{call}) {
62                                         dbg("DXPROT: my channel route for $call has disappeared");
63                                         next;
64                                 };
65                                 
66                                 my $new = Route->new($call);          # throw away
67                                 if ($dxchan->in_filter_route($new)) {
68                                         my $r = $parent->add($call, $ver, $flags);
69                                         push @rout, $r;
70                                 } else {
71                                         next;
72                                 }
73                         }
74
75                         # add this station to the user database, if required (don't remove SSID from nodes)
76                         my $user = DXUser->get_current($call);
77                         unless ($user) {
78                                 $user = DXUser->new($call);
79                                 $user->sort('A');
80                                 $user->priv(1);                   # I have relented and defaulted nodes
81                                 $user->lockout(1);
82                                 $user->homenode($call);
83                                 $user->node($call);
84                         }
85                 }
86                 $user->lastin($main::systime) unless DXChannel->get($call);
87                 $user->put;
88         }
89         $self->{new} = \@rout;
90 }