]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Tag.php
Merge pull request #9 from nupplaphil/dependabot/composer/guzzlehttp/guzzle-6.5.8
[friendica.git] / src / Model / Tag.php
index 0ea19f55d9e11f5e8bc0f11585fd5f287e6480bf..5a6a46a1723e0321533e2ab2d937854c9f80b429 100644 (file)
@@ -73,11 +73,12 @@ class Tag
        /**
         * Store tag/mention elements
         *
-        * @param integer $uriid
-        * @param integer $type
-        * @param string  $name
-        * @param string  $url
-        * @param integer $target
+        * @param integer $uriid URI id
+        * @param integer $type Tag type
+        * @param string  $name Tag name
+        * @param string  $url Contact URL (optional)
+        * @param integer $target Target (default: null)
+        * @return void
         */
        public static function store(int $uriid, int $type, string $name, string $url = '', int $target = null)
        {
@@ -224,15 +225,18 @@ class Tag
        {
                $fields = ['name' => substr($name, 0, 96), 'url' => $url];
 
-               if (!empty($type)) {
-                       $fields['type'] = $type;
-               }
-
-               $tag = DBA::selectFirst('tag', ['id'], $fields);
+               $tag = DBA::selectFirst('tag', ['id', 'type'], $fields);
                if (DBA::isResult($tag)) {
+                       if (empty($tag['type']) && !empty($type)) {
+                               DBA::update('tag', ['type' => $type], $fields);
+                       }
                        return $tag['id'];
                }
 
+               if (!empty($type)) {
+                       $fields['type'] = $type;
+               }
+
                DBA::insert('tag', $fields, Database::INSERT_IGNORE);
                $tid = DBA::lastInsertId();
                if (!empty($tid)) {
@@ -246,13 +250,14 @@ class Tag
        /**
         * Store tag/mention elements
         *
-        * @param integer $uriid
-        * @param string $hash
-        * @param string $name
-        * @param string $url
-        * @param boolean $probing
+        * @param integer $uriid URI id
+        * @param string $hash Hash
+        * @param string $name Name
+        * @param string $url URL
+        * @param boolean $probing Whether probing is active
+        * @return void
         */
-       public static function storeByHash(int $uriid, string $hash, string $name, string $url = '', $probing = true)
+       public static function storeByHash(int $uriid, string $hash, string $name, string $url = '', bool $probing = true)
        {
                $type = self::getTypeForHash($hash);
                if ($type == self::UNKNOWN) {
@@ -273,7 +278,7 @@ class Tag
        public static function getFromBody(string $body, string $tags = null)
        {
                if (is_null($tags)) {
-                       $tags =  self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
+                       $tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
                }
 
                if (!preg_match_all("/([" . $tags . "])\[url\=([^\[\]]*)\]([^\[\]]*)\[\/url\]/ism", $body, $result, PREG_SET_ORDER)) {
@@ -290,21 +295,35 @@ class Tag
         * @param string  $body    Body of the post
         * @param string  $tags    Accepted tags
         * @param boolean $probing Perform a probing for contacts, adding them if needed
+        * @return void
         */
-       public static function storeFromBody(int $uriid, string $body, string $tags = null, $probing = true)
+       public static function storeFromBody(int $uriid, string $body, string $tags = null, bool $probing = true)
        {
                Logger::info('Check for tags', ['uri-id' => $uriid, 'hash' => $tags, 'callstack' => System::callstack()]);
 
-               $result = self::getFromBody($body, $tags);
-               if (empty($result)) {
-                       return;
+               if (is_null($tags)) {
+                       $tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
                }
 
-               Logger::info('Found tags', ['uri-id' => $uriid, 'hash' => $tags, 'result' => $result]);
+               // Only remove the shared data from "real" reshares
+               $shared = BBCode::fetchShareAttributes($body);
+               if (!empty($shared['guid'])) {
+                       if (preg_match("/\s*\[share .*?\](.*?)\[\/share\]\s*/ism",  $body, $matches)) {
+                               $share_body = $matches[1];
+                       }
+                       $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
+               }
 
-               foreach ($result as $tag) {
+               foreach (self::getFromBody($body, $tags) as $tag) {
                        self::storeByHash($uriid, $tag[1], $tag[3], $tag[2], $probing);
                }
+
+               // Search for hashtags in the shared body (but only if hashtags are wanted)
+               if (!empty($share_body) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
+                       foreach (self::getFromBody($share_body, self::TAG_CHARACTER[self::HASHTAG]) as $tag) {
+                               self::storeByHash($uriid, $tag[1], $tag[3], $tag[2], $probing);
+                       }
+               }
        }
 
        /**
@@ -314,6 +333,7 @@ class Tag
         *
         * @param integer $uriid URI-Id
         * @param string  $body   Body of the post
+        * @return void
         */
        public static function storeRawTagsFromBody(int $uriid, string $body)
        {
@@ -348,10 +368,11 @@ class Tag
        /**
         * Remove tag/mention
         *
-        * @param integer $uriid
-        * @param integer $type
-        * @param string $name
-        * @param string $url
+        * @param integer $uriid URI id
+        * @param integer $type Type
+        * @param string $name Name
+        * @param string $url URL
+        * @return void
         */
        public static function remove(int $uriid, int $type, string $name, string $url = '')
        {