diff --git a/mod/item.php b/mod/item.php index 10ad3ff05..acce4ecee 100644 --- a/mod/item.php +++ b/mod/item.php @@ -747,6 +747,7 @@ function item_post(App $a) { } Tag::storeFromBody($datarray['uri-id'], $datarray['body']); + Tag::createImplicitMentions($datarray['uri-id'], $datarray['thr-parent-id']); // update filetags in pconfig FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category'); @@ -1002,29 +1003,15 @@ function handle_tag(&$body, &$inform, $profile_uid, $tag, $network = "") function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_uriid) { - if (DI::config()->get('system', 'disable_implicit_mentions')) { - // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them) - if (in_array($thread_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) { - $contact = Tag::TAG_CHARACTER[Tag::MENTION] . '[url=' . $thread_parent_contact['url'] . ']' . $thread_parent_contact['nick'] . '[/url]'; - if (!stripos(implode($tags), '[url=' . $thread_parent_contact['url'] . ']')) { - $tags[] = $contact; - } - } - } else { - $implicit_mentions = [ - $thread_parent_contact['url'] => $thread_parent_contact['nick'] - ]; + if (!DI::config()->get('system', 'disable_implicit_mentions')) { + return $tags; + } - $parent_terms = Tag::getByURIId($thread_parent_uriid, [Tag::MENTION, Tag::IMPLICIT_MENTION]); - - foreach ($parent_terms as $parent_term) { - $implicit_mentions[$parent_term['url']] = $parent_term['name']; - } - - foreach ($implicit_mentions as $url => $label) { - if ($url != \Friendica\Model\Profile::getMyURL() && !stripos(implode($tags), '[url=' . $url . ']')) { - $tags[] = Tag::TAG_CHARACTER[Tag::IMPLICIT_MENTION] . '[url=' . $url . ']' . $label . '[/url]'; - } + // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them) + if (in_array($thread_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) { + $contact = Tag::TAG_CHARACTER[Tag::MENTION] . '[url=' . $thread_parent_contact['url'] . ']' . $thread_parent_contact['nick'] . '[/url]'; + if (!stripos(implode($tags), '[url=' . $thread_parent_contact['url'] . ']')) { + $tags[] = $contact; } } diff --git a/src/Model/Tag.php b/src/Model/Tag.php index 2f4628972..5a62aae91 100644 --- a/src/Model/Tag.php +++ b/src/Model/Tag.php @@ -325,6 +325,27 @@ class Tag } } + /** + * Create implicit mentions for a given post + * + * @param integer $uri_id + * @param integer $parent_uri_id + */ + public static function createImplicitMentions(int $uri_id, int $parent_uri_id) + { + if (DI::config()->get('system', 'disable_implicit_mentions')) { + return; + } + + $tags = DBA::select('tag-view', ['name', 'url'], ['uri-id' => $parent_uri_id]); + while ($tag = DBA::fetch($tags)) { + self::store($uri_id, self::IMPLICIT_MENTION, $tag['name'], $tag['url']); + } + + $parent = Item::selectFirst(['author-link', 'author-name'], ['uri-id' => $parent_uri_id]); + self::store($uri_id, self::IMPLICIT_MENTION, $parent['author-name'], $parent['author-link']); + } + /** * Retrieves the terms from the provided type(s) associated with the provided item ID. * diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 0dfef3ebd..014afe096 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -1294,7 +1294,7 @@ class Transmitter $body = $item['body']; if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) { - $body = self::prependMentions($body, $permission_block); + $body = self::prependMentions($body, $item['uri-id']); } if ($type == 'Note') { @@ -1843,7 +1843,7 @@ class Transmitter HTTPSignature::transmit($signed, $profile['inbox'], $uid); } - private static function prependMentions($body, array $permission_block) + private static function prependMentions($body, int $uriid) { if (DI::config()->get('system', 'disable_implicit_mentions')) { return $body; @@ -1851,14 +1851,14 @@ class Transmitter $mentions = []; - foreach ($permission_block['to'] as $profile_url) { - $profile = Contact::getDetailsByURL($profile_url); + foreach (Tag::getByURIId($uriid, [Tag::IMPLICIT_MENTION]) as $tag) { + $profile = Contact::getDetailsByURL($tag['url']); if (!empty($profile['addr']) && $profile['contact-type'] != Contact::TYPE_COMMUNITY && !strstr($body, $profile['addr']) - && !strstr($body, $profile_url) + && !strstr($body, $tag['url']) ) { - $mentions[] = '@[url=' . $profile_url . ']' . $profile['nick'] . '[/url]'; + $mentions[] = '@[url=' . $tag['url'] . ']' . $profile['nick'] . '[/url]'; } }