From: Michael <heluecht@pirati.ca>
Date: Sat, 9 May 2020 06:33:59 +0000 (+0000)
Subject: Issue 8610: Implicit mentions work again
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=d5f64e11560b34e2b2c3195bb3bd6527315a4440;p=friendica.git

Issue 8610: Implicit mentions work again
---

diff --git a/mod/item.php b/mod/item.php
index 10ad3ff05b..acce4ecee8 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']
-		];
-
-		$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'];
-		}
+	if (!DI::config()->get('system', 'disable_implicit_mentions')) {
+		return $tags;
+	}
 
-		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 2f46289720..5a62aae91b 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 0dfef3ebde..014afe0963 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]';
 			}
 		}