]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Item.php
Replace abstract content with a space to prevent missing spaces
[friendica.git] / src / Content / Item.php
index 91bf79f177c9cc3f0ff96a23a6b72d993035806a..f6906b79629b142417ca4c77a375d85c09bdca32 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
 
 namespace Friendica\Content;
 
+use Friendica\Content\Text\BBCode;
 use Friendica\Core\Hook;
 use Friendica\Core\L10n;
+use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
+use Friendica\Model\Group;
 use Friendica\Model\Item as ModelItem;
 use Friendica\Model\Tag;
 use Friendica\Model\Post;
@@ -53,7 +56,7 @@ class Item
                $this->activity = $activity;
                $this->l10n   = $l10n;
        }
-       
+
        /**
         * Return array with details for categories and folders for an item
         *
@@ -135,7 +138,6 @@ class Item
         * the appropriate link.
         *
         * @param string  $body        the text to replace the tag in
-        * @param string  $inform      a comma-seperated string containing everybody to inform
         * @param integer $profile_uid the user id to replace the tag for (0 = anyone)
         * @param string  $tag         the tag to replace
         * @param string  $network     The network of the post
@@ -144,7 +146,7 @@ class Item
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function replaceTag(&$body, &$inform, $profile_uid, $tag, $network = '')
+       public static function replaceTag(&$body, $profile_uid, $tag, $network = '')
        {
                $replaced = false;
 
@@ -218,16 +220,6 @@ class Item
 
                        // Check if $contact has been successfully loaded
                        if (DBA::isResult($contact)) {
-                               if (strlen($inform) && (isset($contact['notify']) || isset($contact['id']))) {
-                                       $inform .= ',';
-                               }
-
-                               if (isset($contact['id'])) {
-                                       $inform .= 'cid:' . $contact['id'];
-                               } elseif (isset($contact['notify'])) {
-                                       $inform  .= $contact['notify'];
-                               }
-
                                $profile = $contact['url'];
                                $newname = ($contact['name'] ?? '') ?: $contact['nick'];
                        }
@@ -490,7 +482,7 @@ class Item
                if (empty($item['verb']) || $this->activity->isHidden($item['verb'])) {
                        return false;
                }
-       
+
                // @TODO below if() block can be rewritten to a single line: $isVisible = allConditionsHere;
                if ($this->activity->match($item['verb'], Activity::FOLLOW) &&
                        $item['object-type'] === Activity\ObjectType::NOTE &&
@@ -498,7 +490,91 @@ class Item
                        $item['uid'] == local_user()) {
                        return false;
                }
-       
+
                return true;
        }
+
+       public function expandTags(array $item, bool $setPermissions = false)
+       {
+               // Look for any tags and linkify them
+               $item['inform'] = '';
+               $private_forum  = false;
+               $private_id     = null;
+               $only_to_forum  = false;
+               $forum_contact  = [];
+               $receivers      = [];
+
+               // Convert mentions in the body to a unified format
+               $item['body'] = BBCode::setMentions($item['body'], $item['uid'], $item['network']);
+
+               // Search for forum mentions
+               foreach (Tag::getFromBody($item['body'], Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
+                       $contact = Contact::getByURLForUser($tag[2], $item['uid']);
+
+                       $receivers[] = $contact['id'];
+
+                       if (!empty($item['inform'])) {
+                               $item['inform'] .= ',';
+                       }
+                       $item['inform'] .= 'cid:' . $contact['id'];
+
+                       if (($item['gravity'] == GRAVITY_COMMENT) || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) {
+                               continue;
+                       }
+
+                       if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
+                               $private_forum = $contact['prv'];
+                               $only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
+                               $private_id = $contact['id'];
+                               $forum_contact = $contact;
+                               Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
+                       } elseif ($item['allow_cid'] == '<' . $contact['id'] . '>') {
+                               $private_forum = false;
+                               $only_to_forum = true;
+                               $private_id = $contact['id'];
+                               $forum_contact = $contact;
+                               Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
+                       } else {
+                               Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
+                       }
+               }
+               Logger::info('Got inform', ['inform' => $item['inform']]);
+
+               if (($item['gravity'] == GRAVITY_PARENT) && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
+                       // we tagged a forum in a top level post. Now we change the post
+                       $item['private'] = $private_forum ? ModelItem::PRIVATE : ModelItem::UNLISTED;
+
+                       if ($only_to_forum) {
+                               $item['postopts'] = '';
+                       }
+
+                       $item['deny_cid'] = '';
+                       $item['deny_gid'] = '';
+
+                       if ($private_forum) {
+                               $item['allow_cid'] = '<' . $private_id . '>';
+                               $item['allow_gid'] = '<' . Group::getIdForForum($forum_contact['id']) . '>';
+                       } else {
+                               $item['allow_cid'] = '';
+                               $item['allow_gid'] = '';
+                       }
+               } elseif ($setPermissions && ($item['gravity'] == GRAVITY_PARENT)) {
+                       if (empty($receivers)) {
+                               // For security reasons direct posts without any receiver will be posts to yourself
+                               $self = Contact::selectFirst(['id'], ['uid' => $item['uid'], 'self' => true]);
+                               $receivers[] = $self['id'];
+                       }
+
+                       $item['private']   = ModelItem::PRIVATE;
+                       $item['allow_cid'] = '';
+                       $item['allow_gid'] = '';
+                       $item['deny_cid']  = '';
+                       $item['deny_gid']  = '';
+
+                       foreach ($receivers as $receiver) {
+                               $item['allow_cid'] .= '<' . $receiver . '>';
+                       }
+               }
+               return $item;
+       }
 }