+ if ($thing->{t}) {
+ my $sub = "handle_$thing->{t}";
+ if ($thing->can($sub)) {
+ no strict 'refs';
+ $thing = $thing->$sub($dxchan);
+ }
+
+ $thing->broadcast($dxchan) if $thing;
+ }
+}
+
+# these contain users and either a node (for externals) or the from address
+sub handle_au
+{
+ my $thing = shift;
+ my $dxchan = shift;
+
+ my $node = $thing->{n} || $thing->{user};
+ my $nref = Route::Node::get($node);
+
+ if ($nref) {
+ if (my $u = $thing->{u}) {
+ for (split /:/, $u) {
+ my ($here, $call) = unpack "A1 A*", $_;
+ add_user($nref, $call, $here);
+ my $h = $dxchan->{call} eq $nref->{call} ? 3 : ($thing->{hops} || 99);
+ RouteDB::update($call, $dxchan->{call}, $h);
+ }
+ }
+ } else {
+ dbg("Thingy::Rt::au: $node not found") if isdbg('chanerr');
+ return;
+ }
+ return $thing;
+}
+
+sub handle_du
+{
+ my $thing = shift;
+ my $dxchan = shift;
+
+ my $node = $thing->{n} || $thing->{user};
+ my $nref = Route::Node::get($node);
+
+ if ($nref) {
+ if (my $u = $thing->{u}) {
+ for (split /:/, $u) {
+ my ($here, $call) = unpack "A1 A*", $_;
+ my $uref = Route::User::get($call);
+ unless ($uref) {
+ dbg("Thingy::Rt::du $call not a user") if isdbg('chanerr');
+ next;
+ }
+ $nref->del_user($uref);
+ RouteDB::delete($call, $dxchan->{call});
+ }
+ RouteDB::update($nref->{call}, $dxchan->{call}, $dxchan->{call} eq $nref->{call} ? 2 : ($thing->{hops} || 99));
+ }
+ } else {
+ dbg("Thingy::Rt::du: $node not found") if isdbg('chanerr');
+ return;
+ }
+
+ return $thing;