]> git.mxchange.org Git - friendica.git/commitdiff
Issue 8610: Implicit mentions work again
authorMichael <heluecht@pirati.ca>
Sat, 9 May 2020 06:33:59 +0000 (06:33 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 9 May 2020 06:33:59 +0000 (06:33 +0000)
mod/item.php
src/Model/Tag.php
src/Protocol/ActivityPub/Transmitter.php

index 10ad3ff05b09e6ae340b62096c74aacaeca5eb2d..acce4ecee89d7995773e06390dbfb0f29db3a12f 100644 (file)
@@ -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;
                }
        }
 
index 2f46289720b580f52f5b854058089bbd59023619..5a62aae91b5fd0b37989f33c78d05a73caedd011 100644 (file)
@@ -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.
         *
index 0dfef3ebdeffcb2cceb01c6fb515a2119d78eb28..014afe0963dbaa7d17dcb0f1d6f39b4fc501a017 100644 (file)
@@ -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]';
                        }
                }