diff --git a/include/conversation.php b/include/conversation.php
index ed9086307..4b3c4f0de 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 5a0a0a92a..514fd4172 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 2c99132c2..54d61bd6e 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 6910ee11c..f3cf87c85 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 50c7d5b8d..7659f6b83 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 c4f959beb..1d52e1198 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}}