1package DJabberd::Delivery::Local; 2use strict; 3use warnings; 4use base 'DJabberd::Delivery'; 5 6sub run_before { ("DJabberd::Delivery::S2S") } 7 8sub deliver { 9 my ($self, $vhost, $cb, $stanza) = @_; 10 my $to = $stanza->to_jid or return $cb->declined; 11 12 my @dconns; 13 my $find_bares = sub { 14 @dconns = grep { $_->is_available || $stanza->deliver_when_unavailable } $vhost->find_conns_of_bare($to) 15 }; 16 17 if ($to->is_bare) { 18 $find_bares->(); 19 } else { 20 my $dest; 21 if (($dest = $vhost->find_jid($to)) && ($dest->is_available || $stanza->deliver_when_unavailable)) { 22 push @dconns, $dest; 23 } else { 24 $find_bares->(); 25 } 26 } 27 28 return $cb->declined unless @dconns; 29 30 $DJabberd::Stats::counter{deliver_local}++; 31 32 foreach my $c (@dconns) { 33 $c->send_stanza($stanza); 34 } 35 36 $cb->delivered; 37} 38 391; 40