]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Transmitter.php
Merge pull request #6747 from nupplaphil/issue/6677-frio_admin
[friendica.git] / src / Protocol / ActivityPub / Transmitter.php
index 0ee619a7321c27b20cb55e658496b77e52b4a0b4..7d33fb2dc54713cdafdcd7a1bbe6713a811764e6 100644 (file)
@@ -5,6 +5,7 @@
 namespace Friendica\Protocol\ActivityPub;
 
 use Friendica\BaseObject;
+use Friendica\Content\Feature;
 use Friendica\Database\DBA;
 use Friendica\Core\Config;
 use Friendica\Core\Logger;
@@ -342,7 +343,7 @@ class Transmitter
                        $actor_profile = APContact::getByURL($item['author-link']);
                }
 
-               $terms = Term::tagArrayFromItemId($item['id'], TERM_MENTION);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
 
                if (!$item['private']) {
                        $data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
@@ -806,12 +807,12 @@ class Transmitter
        {
                $tags = [];
 
-               $terms = Term::tagArrayFromItemId($item['id']);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::HASHTAG, Term::MENTION, Term::IMPLICIT_MENTION]);
                foreach ($terms as $term) {
-                       if ($term['type'] == TERM_HASHTAG) {
+                       if ($term['type'] == Term::HASHTAG) {
                                $url = System::baseUrl() . '/search?tag=' . urlencode($term['term']);
                                $tags[] = ['type' => 'Hashtag', 'href' => $url, 'name' => '#' . $term['term']];
-                       } elseif ($term['type'] == TERM_MENTION) {
+                       } elseif ($term['type'] == Term::MENTION || $term['type'] == Term::IMPLICIT_MENTION) {
                                $contact = Contact::getDetailsByURL($term['url']);
                                if (!empty($contact['addr'])) {
                                        $mention = '@' . $contact['addr'];
@@ -891,12 +892,12 @@ class Transmitter
        private static function mentionCallback($match)
        {
                if (empty($match[1])) {
-                       return;
+                       return '';
                }
 
                $data = Contact::getDetailsByURL($match[1]);
-               if (empty($data) || empty($data['nick'])) {
-                       return;
+               if (empty($data['nick'])) {
+                       return $match[0];
                }
 
                return '@[url=' . $data['url'] . ']' . $data['nick'] . '[/url]';
@@ -1037,8 +1038,14 @@ class Transmitter
                        $data['name'] = BBCode::toPlaintext($item['title'], false);
                }
 
+               $permission_block = self::createPermissionBlockForItem($item, false);
+
                $body = $item['body'];
 
+               if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) {
+                       $body = self::prependMentions($body, $permission_block);
+               }
+
                if ($type == 'Note') {
                        $body = self::removePictures($body);
                }
@@ -1069,7 +1076,7 @@ class Transmitter
                        $data['generator'] = ['type' => 'Application', 'name' => $item['app']];
                }
 
-               $data = array_merge($data, self::createPermissionBlockForItem($item, false));
+               $data = array_merge($data, $permission_block);
 
                return $data;
        }
@@ -1298,10 +1305,6 @@ class Transmitter
         */
        public static function sendFollowObject($object, $target, $uid = 0)
        {
-               // Currently deactivated, due to notification problems.
-               // The follow message is reflected back and then causes false notifications.
-               return true;
-
                $profile = APContact::getByURL($target);
 
                if (empty($uid)) {
@@ -1314,6 +1317,13 @@ class Transmitter
                        $uid = $first_user['uid'];
                }
 
+               $condition = ['verb' => ACTIVITY_FOLLOW, 'uid' => 0, 'parent-uri' => $object,
+                       'author-id' => Contact::getPublicIdByUserId($uid)];
+               if (Item::exists($condition)) {
+                       Logger::log('Follow for ' . $object . ' for user ' . $uid . ' does already exist.', Logger::DEBUG);
+                       return false;
+               }
+
                $owner = User::getOwnerDataById($uid);
 
                $data = ['@context' => ActivityPub::CONTEXT,
@@ -1426,4 +1436,28 @@ class Transmitter
                $signed = LDSignature::sign($data, $owner);
                HTTPSignature::transmit($signed, $profile['inbox'], $uid);
        }
+
+       private static function prependMentions($body, array $permission_block)
+       {
+               if (Config::get('system', 'disable_implicit_mentions')) {
+                       return $body;
+               }
+
+               $mentions = [];
+
+               foreach ($permission_block['to'] as $profile_url) {
+                       $profile = Contact::getDetailsByURL($profile_url);
+                       if (!empty($profile['addr'])
+                               && $profile['contact-type'] != Contact::TYPE_COMMUNITY
+                               && !strstr($body, $profile['addr'])
+                               && !strstr($body, $profile_url)
+                       ) {
+                               $mentions[] = '@[url=' . $profile_url . ']' . $profile['nick'] . '[/url]';
+                       }
+               }
+
+               $mentions[] = $body;
+
+               return implode(' ', $mentions);
+       }
 }