added more routing code
[spider.git] / perl / Thingy / Hello.pm
index c991a901e274a1036e348be0a763efc96996cb17..c098ca944edfb97825184cf8ab6543107826dbf5 100644 (file)
@@ -12,7 +12,7 @@ package Thingy::Hello;
 
 use vars qw($VERSION $BRANCH);
 $VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /^\d+\.\d+(?:\.(\d+)\.(\d+))?$/  || (0,0));
 $main::build += $VERSION;
 $main::branch += $BRANCH;
 
@@ -49,7 +49,9 @@ sub handle
        my $dxchan = shift;
        
        # verify authenticity
-       if ($dxchan->call eq $thing->{origin}) {
+       if ($dxchan->{call} eq $thing->{origin}) {
+
+               # for directly connected calls
                if ($verify_on_login) {
                        my $pp = $dxchan->user->passphrase;
                        unless ($pp) {
@@ -71,14 +73,37 @@ sub handle
                                $thing->send($dxchan);
                        }
                }
+       } else {
+               
+               # for otherwise connected calls, that come in relayed from other nodes
+               # note that we cannot do any connections at this point
+               my $nref = Route::Node::get($thing->{origin});
+               unless ($nref) {
+                       my $v = $thing->{user} ? undef : $thing->{v};
+                       $nref = Route::Node->new($thing->{origin}, $v, 1);
+               }
+               if (my $user = $thing->{user}) {
+                       my $ur = Route::get($user);
+                       unless ($ur) {
+                               my $uref = DXUser->get_current($user);
+                               if ($uref->is_node || $uref->is_aranea) {
+                                       $nref->add($user, $thing->{v}, 1);
+                               } else {
+                                       $nref->add_user($user, 1);
+                               }
+                       }
+               }
        }
+       RouteDB::update($thing->{origin}, $dxchan->{call}, $thing->{hopsaway});
+       RouteDB::update($thing->{user}, $dxchan->{call}, $thing->{hopsaway}) if $thing->{user};
+               
        $thing->broadcast($dxchan);
 }
 
 sub new
 {
        my $pkg = shift;
-       my $thing = $pkg->SUPER::new(origin=>$main::mycall, group=>'RT');
+       my $thing = $pkg->SUPER::new(origin=>$main::mycall);
        return $thing;
 }
 1;