X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FThingy.pm;h=24c8b98f78c72d5a682e24b3e3e16cf2c2039036;hb=14a47618833cb6212d88973a6a23b1ebd6249422;hp=6ab36080596b931c8c4a671c41318537f15225ac;hpb=57740a288c82793988be72c9b5666087d636344f;p=spider.git diff --git a/perl/Thingy.pm b/perl/Thingy.pm index 6ab36080..24c8b98f 100644 --- a/perl/Thingy.pm +++ b/perl/Thingy.pm @@ -36,16 +36,19 @@ my $lastmin = time; use DXChannel; use DXDebug; +use DXUtil; + # we expect all thingies to be subclassed sub new { my $class = shift; + my $pkg = ref $class || $class; my $thing = {@_}; $thing->{origin} ||= $main::mycall; - bless $thing, $class; + bless $thing, $pkg; return $thing; } @@ -95,13 +98,34 @@ sub send } } -# broadcast to all except @_ +# +# This is the main routing engine for the new protocol. Broadcast is a slight +# misnomer, because if it thinks it can route it down one or interfaces, it will. +# +# It handles anything it recognises as a callsign, sees if it can find it in a +# routing table, and if it does, then routes the message. +# +# If it can't then it will broadcast it. +# sub broadcast { my $thing = shift; dbg("Thingy::broadcast: " . $thing->ascii) if isdbg('thing'); - foreach my $dxchan (DXChannel::get_all()) { + my @dxchan; + my $to ||= $thing->{route}; + $to ||= $thing->{touser}; + $to ||= $thing->{group}; + if ($to && is_callsign($to) && (my $ref = Route::get($to))) { + dbg("Thingy::broadcast: routing for $to") if isdbg('thing'); + @dxchan = $ref->alldxchan; + } else { + @dxchan = DXChannel::get_all(); + } + + dbg("Thingy::broadcast: offered " . join(',', map {$_->call} @dxchan)) if isdbg('thing'); + + foreach my $dxchan (@dxchan) { next if $dxchan == $main::me; next if grep $dxchan == $_, @_; next if $dxchan->{call} eq $thing->{origin}; @@ -219,10 +243,12 @@ sub new_reply if ($thing->{group} eq $main::mycall) { $out = $thing->new; $out->{touser} = $thing->{user} if $thing->{user}; + $out->{group} = $thing->{origin}; } elsif (DXChannel::get($thing->{group})) { $out = $thing->new(user => $thing->{group}); $out->{touser} = $thing->{user} if $thing->{user}; - } elsif ($thing->{touser} && DXChannel->{$thing->{touser}}) { + $out->{group} = $thing->{origin}; + } elsif ($thing->{touser} && DXChannel::get($thing->{touser})) { $out = $thing->new(user => $thing->{touser}); $out->{group} = $thing->{group}; }