diff --git a/include/conversation.php b/include/conversation.php index ed9086307b..4b3c4f0de4 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -764,10 +764,9 @@ function conversation_fetch_comments($thread_items, $pinned) { case Item::PT_GLOBAL: $row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')]; break; - default: - if ($row['uid'] == 0) { - $row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')]; - } + case Item::PT_RELAY: + $row['direction'] = ['direction' => 10, 'title' => DI::l10n()->t('Relay')]; + break; } if (($row['gravity'] == GRAVITY_PARENT) && !$row['origin'] && ($row['author-id'] == $row['owner-id']) && diff --git a/src/Model/Item.php b/src/Model/Item.php index 5a0a0a92a4..514fd41725 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -67,6 +67,7 @@ class Item const PT_COMMENT = 71; const PT_STORED = 72; const PT_GLOBAL = 73; + const PT_RELAY = 74; const PT_PERSONAL_NOTE = 128; // Field list that is used to display the items diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 2c99132c20..54d61bd6ee 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -521,6 +521,10 @@ class Processor $item['post-type'] = Item::PT_ARTICLE; } + if (in_array($item['post-type'], [Item::PT_GLOBAL, Item::PT_ARTICLE]) && !empty($activity['from-relay'])) { + $item['post-type'] = Item::PT_RELAY; + } + if ($item['isForum'] ?? false) { $item['contact-id'] = Contact::getIdForURL($activity['actor'], $receiver); } else { @@ -688,12 +692,13 @@ class Processor /** * Fetches missing posts * - * @param string $url message URL - * @param array $child activity array with the child of this message + * @param string $url message URL + * @param array $child activity array with the child of this message + * @param bool $relaymode Posts arrived via relay * @return string fetched message URL * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function fetchMissingActivity(string $url, array $child = []) + public static function fetchMissingActivity(string $url, array $child = [], bool $relaymode = false) { if (!empty($child['receiver'])) { $uid = ActivityPub\Receiver::getFirstUserFromReceivers($child['receiver']); @@ -752,6 +757,7 @@ class Processor $ldactivity = JsonLD::compact($activity); $ldactivity['thread-completion'] = true; + $ldactivity['from-relay'] = $relaymode; ActivityPub\Receiver::processActivity($ldactivity, json_encode($activity), $uid, true, false, $signer); diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index 6910ee11c2..f3cf87c858 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -180,7 +180,7 @@ class Receiver return; } - Processor::fetchMissingActivity($object_id); + Processor::fetchMissingActivity($object_id, [], true); $item_id = Item::searchByLink($object_id); if ($item_id) { @@ -468,6 +468,11 @@ class Receiver $object_data['thread-completion'] = $activity['thread-completion']; } + // Internal flag for posts that arrived via relay + if (!empty($activity['from-relay'])) { + $object_data['from-relay'] = $activity['from-relay']; + } + switch ($type) { case 'as:Create': if (in_array($object_data['object_type'], self::CONTENT_TYPES)) { diff --git a/view/theme/frio/templates/sub/direction.tpl b/view/theme/frio/templates/sub/direction.tpl index 50c7d5b8d4..7659f6b839 100644 --- a/view/theme/frio/templates/sub/direction.tpl +++ b/view/theme/frio/templates/sub/direction.tpl @@ -19,6 +19,8 @@ {{elseif $direction.direction == 9}} + {{elseif $direction.direction == 10}} + {{/if}} {{/if}} diff --git a/view/theme/vier/templates/sub/direction.tpl b/view/theme/vier/templates/sub/direction.tpl index c4f959beb7..1d52e1198f 100644 --- a/view/theme/vier/templates/sub/direction.tpl +++ b/view/theme/vier/templates/sub/direction.tpl @@ -19,6 +19,8 @@ {{elseif $direction.direction == 9}} + {{elseif $direction.direction == 10}} + {{/if}} {{/if}}