From 81aaacc67dad3216400f089a21fc33fcabe61b97 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Jul 2022 14:17:53 +0000 Subject: [PATCH] Improvements for the "post-reason" --- mod/item.php | 2 +- src/Content/Conversation.php | 21 ++++++++++++--- src/Model/Item.php | 27 +++++++++---------- src/Module/Api/Mastodon/Statuses/Bookmark.php | 2 +- .../Api/Mastodon/Statuses/Unbookmark.php | 2 +- src/Module/Item/Star.php | 2 +- src/Protocol/ActivityPub/Delivery.php | 5 +--- src/Protocol/ActivityPub/Transmitter.php | 26 +++++++----------- src/Worker/Notifier.php | 2 +- 9 files changed, 46 insertions(+), 43 deletions(-) diff --git a/mod/item.php b/mod/item.php index ce4cd45ca7..26dcef91cd 100644 --- a/mod/item.php +++ b/mod/item.php @@ -138,7 +138,7 @@ function item_post(App $a) { // When commenting on a public post then store the post for the current user // This enables interaction like starring and saving into folders if ($toplevel_item['uid'] == 0) { - $stored = Item::storeForUserByUriId($toplevel_item['uri-id'], local_user()); + $stored = Item::storeForUserByUriId($toplevel_item['uri-id'], local_user(), ['post-reason' => Item::PR_ACTIVITY]); Logger::info('Public item stored for user', ['uri-id' => $toplevel_item['uri-id'], 'uid' => $uid, 'stored' => $stored]); if ($stored) { $toplevel_item = Post::selectFirst(Item::ITEM_FIELDLIST, ['id' => $stored]); diff --git a/src/Content/Conversation.php b/src/Content/Conversation.php index 5bb47b23b1..36fd38915d 100644 --- a/src/Content/Conversation.php +++ b/src/Content/Conversation.php @@ -857,7 +857,7 @@ class Conversation $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('You are following %s.', $row['author-name'])]; break; case ItemModel::PR_TAG: - $row['direction'] = ['direction' => 4, 'title' => $this->l10n->t('Tagged')]; + $row['direction'] = ['direction' => 4, 'title' => $this->l10n->t('You subscribed to one or more tags in this post.')]; break; case ItemModel::PR_ANNOUNCEMENT: if (!empty($row['causer-id']) && $this->pConfig->get(local_user(), 'system', 'display_resharer')) { @@ -878,17 +878,30 @@ class Conversation $row['direction'] = ['direction' => 5, 'title' => $this->l10n->t('%s is participating in this thread.', $row['author-name'])]; break; case ItemModel::PR_STORED: - $row['direction'] = ['direction' => 8, 'title' => $this->l10n->t('Stored')]; + $row['direction'] = ['direction' => 8, 'title' => $this->l10n->t('Stored for general reasons')]; break; case ItemModel::PR_GLOBAL: - $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global')]; + $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global post')]; break; case ItemModel::PR_RELAY: - $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Relayed') : $this->l10n->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))]; + $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Send via an relay server') : $this->l10n->t('Send via the relay server %s <%s>', $row['causer-name'], $row['causer-link']))]; break; case ItemModel::PR_FETCHED: $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Fetched') : $this->l10n->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))]; break; + case ItemModel::PR_COMPLETION: + $row['direction'] = ['direction' => 2, 'title' => $this->l10n->t('Stored because of a child post to complete this thread.')]; + break; + case ItemModel::PR_DIRECT: + $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('Local delivery')]; + break; + case ItemModel::PR_ACTIVITY: + $row['direction'] = ['direction' => 2, 'title' => $this->l10n->t('Stored because of your activity (like, comment, star, ...)')]; + break; + case ItemModel::PR_DISTRIBUTE: + $row['direction'] = ['direction' => 6, 'title' => $this->l10n->t('Distributed')]; + break; + } $row['thr-parent-row'] = $thr_parent; diff --git a/src/Model/Item.php b/src/Model/Item.php index 55022519aa..a465e8c93c 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -44,6 +44,7 @@ use Friendica\Util\Proxy; use Friendica\Util\Strings; use Friendica\Util\Temporal; use Friendica\Worker\Delivery; +use GuzzleHttp\Psr7\Uri; use LanguageDetection\Language; class Item @@ -74,6 +75,10 @@ class Item const PR_GLOBAL = 73; const PR_RELAY = 74; const PR_FETCHED = 75; + const PR_COMPLETION = 76; + const PR_DIRECT = 77; + const PR_ACTIVITY = 78; + const PR_DISTRIBUTE = 79; // system.accept_only_sharer setting values const COMPLETION_NONE = 1; @@ -688,9 +693,9 @@ class Item $parent = Post::selectFirst($fields, $condition, $params); if (!DBA::isResult($parent) && Post::exists(['uri-id' => [$item['thr-parent-id'], $item['parent-uri-id']], 'uid' => 0])) { - $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid']); + $stored = Item::storeForUserByUriId($item['thr-parent-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]); if (!$stored && ($item['thr-parent-id'] != $item['parent-uri-id'])) { - $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid']); + $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]); } if ($stored) { Logger::info('Stored thread parent item for user', ['uri-id' => $item['thr-parent-id'], 'uid' => $item['uid'], 'stored' => $stored]); @@ -714,7 +719,7 @@ class Item $toplevel_parent = Post::selectFirst($fields, $condition, $params); if (!DBA::isResult($toplevel_parent) && $item['origin']) { - $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid']); + $stored = Item::storeForUserByUriId($item['parent-uri-id'], $item['uid'], ['post-reason' => Item::PR_COMPLETION]); Logger::info('Stored parent item for user', ['uri-id' => $item['parent-uri-id'], 'uid' => $item['uid'], 'stored' => $stored]); $toplevel_parent = Post::selectFirst($fields, $condition, $params); } @@ -1355,14 +1360,8 @@ class Item $uids = Tag::getUIDListByURIId($item['uri-id']); foreach ($uids as $uid) { - if (Contact::isSharing($item['author-id'], $uid)) { - $fields = []; - } else { - $fields = ['post-reason' => self::PR_TAG]; - } - - $stored = self::storeForUserByUriId($item['uri-id'], $uid, $fields); - Logger::info('Stored item for users', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'fields' => $fields, 'stored' => $stored]); + $stored = self::storeForUserByUriId($item['uri-id'], $uid, ['post-reason' => self::PR_TAG]); + Logger::info('Stored item for users', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'stored' => $stored]); } } @@ -1454,6 +1453,7 @@ class Item if ($origin_uid == $uid) { $item['diaspora_signed_text'] = $signed_text; } + $item['post-reason'] = self::PR_DISTRIBUTE; self::storeForUser($item, $uid); } } @@ -1605,7 +1605,6 @@ class Item unset($item['event-id']); unset($item['hidden']); unset($item['notification-type']); - unset($item['post-reason']); // Data from the "post-delivery-data" table unset($item['postopts']); @@ -2488,7 +2487,7 @@ class Item } if (!Post::exists(['uri-id' => $item['parent-uri-id'], 'uid' => $uid])) { - $stored = self::storeForUserByUriId($item['parent-uri-id'], $uid); + $stored = self::storeForUserByUriId($item['parent-uri-id'], $uid, ['post-reason' => Item::PR_ACTIVITY]); if (($item['parent-uri-id'] == $item['uri-id']) && !empty($stored)) { $item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $stored]); if (!DBA::isResult($item)) { @@ -2948,7 +2947,7 @@ class Item $urlparts = parse_url($url); unset($urlparts['query']); unset($urlparts['fragment']); - $url = Network::unparseURL($urlparts); + $url = Uri::fromParts($urlparts); // Remove media links to only search in embedded content // @todo Check images for image link, audio for audio links, ... diff --git a/src/Module/Api/Mastodon/Statuses/Bookmark.php b/src/Module/Api/Mastodon/Statuses/Bookmark.php index 95a072889c..cebb061927 100644 --- a/src/Module/Api/Mastodon/Statuses/Bookmark.php +++ b/src/Module/Api/Mastodon/Statuses/Bookmark.php @@ -52,7 +52,7 @@ class Bookmark extends BaseApi } if ($item['uid'] == 0) { - $stored = Item::storeForUserByUriId($this->parameters['id'], $uid); + $stored = Item::storeForUserByUriId($this->parameters['id'], $uid, ['post-reason' => Item::PR_ACTIVITY]); if (!empty($stored)) { $item = Post::selectFirst(['id', 'gravity'], ['id' => $stored]); if (!DBA::isResult($item)) { diff --git a/src/Module/Api/Mastodon/Statuses/Unbookmark.php b/src/Module/Api/Mastodon/Statuses/Unbookmark.php index 103fac04af..f90916176d 100644 --- a/src/Module/Api/Mastodon/Statuses/Unbookmark.php +++ b/src/Module/Api/Mastodon/Statuses/Unbookmark.php @@ -52,7 +52,7 @@ class Unbookmark extends BaseApi } if ($item['uid'] == 0) { - $stored = Item::storeForUserByUriId($this->parameters['id'], $uid); + $stored = Item::storeForUserByUriId($this->parameters['id'], $uid, ['post-reason' => Item::PR_ACTIVITY]); if (!empty($stored)) { $item = Post::selectFirst(['id', 'gravity'], ['id' => $stored]); if (!DBA::isResult($item)) { diff --git a/src/Module/Item/Star.php b/src/Module/Item/Star.php index 8f444d54ed..660095103d 100644 --- a/src/Module/Item/Star.php +++ b/src/Module/Item/Star.php @@ -56,7 +56,7 @@ class Star extends BaseModule } if ($item['uid'] == 0) { - $stored = Item::storeForUserByUriId($item['uri-id'], local_user()); + $stored = Item::storeForUserByUriId($item['uri-id'], local_user(), ['post-reason' => Item::PR_ACTIVITY]); if (!empty($stored)) { $item = Post::selectFirst(['starred'], ['id' => $stored]); if (!DBA::isResult($item)) { diff --git a/src/Protocol/ActivityPub/Delivery.php b/src/Protocol/ActivityPub/Delivery.php index fac8536d67..6e97b0b927 100644 --- a/src/Protocol/ActivityPub/Delivery.php +++ b/src/Protocol/ActivityPub/Delivery.php @@ -110,10 +110,7 @@ class Delivery } elseif ($cmd == WorkerDelivery::PROFILEUPDATE) { $success = ActivityPub\Transmitter::sendProfileUpdate($uid, $inbox); } else { - $data = Post\Activity::getByURIId($uri_id); - if (empty($data)) { - $data = ActivityPub\Transmitter::createCachedActivityFromItem($item_id); - } + $data = ActivityPub\Transmitter::createCachedActivityFromItem($item_id); if (!empty($data)) { $timestamp = microtime(true); $response = HTTPSignature::post($data, $inbox, $uid); diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index ddf4957946..ecd1843185 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -1233,26 +1233,20 @@ class Transmitter if (!$item['deleted']) { $data = Post\Activity::getByURIId($item['uri-id']); if (!$item['origin'] && !empty($data)) { - if (!empty($data['type'])) { - if (in_array($data['type'], ['Create', 'Update'])) { - if ($object_mode) { - unset($data['@context']); - unset($data['signature']); - } - Logger::info('Return stored conversation', ['item' => $item_id]); - return $data; - } elseif (in_array('as:' . $data['type'], Receiver::CONTENT_TYPES)) { - if (!empty($data['@context'])) { - $context = $data['@context']; - unset($data['@context']); - } - unset($data['actor']); - $object = $data; - } + if ($object_mode) { + unset($data['@context']); + unset($data['signature']); } + Logger::info('Return stored conversation', ['item' => $item_id]); + return $data; } } + if (!$item['origin'] && empty($object)) { + Logger::debug('Post is not ours and is not stored', ['id' => $item_id, 'uri-id' => $item['uri-id']]); + return false; + } + $type = self::getTypeOfItem($item); if (!$object_mode) { diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 8655d2662e..36d1a76b73 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -506,7 +506,7 @@ class Notifier // Direct delivery of local contacts if (!in_array($cmd, [Delivery::RELOCATION, Delivery::SUGGESTION, Delivery::DELETION, Delivery::MAIL]) && $target_uid = User::getIdForURL($contact['url'])) { Logger::info('Direct delivery', ['uri-id' => $target_item['uri-id'], 'target' => $target_uid]); - $fields = ['protocol' => Conversation::PARCEL_LOCAL_DFRN, 'direction' => Conversation::PUSH]; + $fields = ['protocol' => Conversation::PARCEL_LOCAL_DFRN, 'direction' => Conversation::PUSH, 'post-reason' => Item::PR_DIRECT]; Item::storeForUserByUriId($target_item['uri-id'], $target_uid, $fields, $target_item['uid']); continue; }