+ private static function activityPubDelivery($a, $cmd, $item_id, $uid, $target_item, $parent)
+ {
+ $inboxes = [];
+ $personal = false;
+
+ if ($target_item['origin']) {
+ $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid);
+ Logger::log('Origin item ' . $item_id . ' with URL ' . $target_item['uri'] . ' will be distributed.', Logger::DEBUG);
+ } elseif (!DBA::exists('conversation', ['item-uri' => $target_item['uri'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB])) {
+ Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' is no AP post. It will not be distributed.', Logger::DEBUG);
+ return;
+ } else {
+ // Remote items are transmitted via the personal inboxes.
+ // Doing so ensures that the dedicated receiver will get the message.
+ $personal = true;
+ Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' will be distributed.', Logger::DEBUG);
+ }
+
+ if ($parent['origin']) {
+ $parent_inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid, $personal);
+ $inboxes = array_merge($inboxes, $parent_inboxes);
+ }
+
+ if (empty($inboxes)) {
+ Logger::log('No inboxes found for item ' . $item_id . ' with URL ' . $target_item['uri'] . '. It will not be distributed.', Logger::DEBUG);
+ return;
+ }
+
+ // Fill the item cache
+ ActivityPub\Transmitter::createCachedActivityFromItem($item_id, true);
+
+ foreach ($inboxes as $inbox) {
+ Logger::log('Deliver ' . $item_id .' to ' . $inbox .' via ActivityPub', Logger::DEBUG);
+
+ Worker::add(['priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true],
+ 'APDelivery', $cmd, $item_id, $inbox, $uid);
+ }
+ }
+