Fixes API-Issues #13985 and #13986
authorMichael <heluecht@pirati.ca>
Tue, 12 Mar 2024 03:12:36 +0000 (03:12 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 12 Mar 2024 03:12:36 +0000 (03:12 +0000)
src/Content/Text/BBCode.php
src/Factory/Api/Mastodon/StatusSource.php
src/Module/Api/Mastodon/Markers.php

index 574b998..9a3db9e 100644 (file)
@@ -1245,6 +1245,42 @@ class BBCode
                return $match[1] . '[url=' . $data['url'] . ']' . $data['nick'] . '[/url]';
        }
 
+       /**
+        * Replace mention links
+        *
+        * @param string $body HTML/BBCode
+        * @return string Body with replaced mentions
+        */
+       public static function setMentionsToAddr(string $body): string
+       {
+               DI::profiler()->startRecording('rendering');
+               $regexp = "/([@!])\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
+               $body = preg_replace_callback($regexp, [self::class, 'mentionToAddrCallback'], $body);
+               DI::profiler()->stopRecording();
+               return $body;
+       }
+
+       /**
+        * Callback function to replace a Friendica style mention in a mention with the addr
+        *
+        * @param array $match Matching values for the callback
+        * @return string Replaced mention or empty string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       private static function mentionToAddrCallback(array $match): string
+       {
+               if (empty($match[2])) {
+                       return '';
+               }
+
+               $data = Contact::getByURL($match[2], false, ['url', 'nick', 'addr']);
+               if (empty($data['nick'])) {
+                       return $match[0];
+               }
+
+               return $match[1] . ($data['addr'] ?: $data['nick']);
+       }
+
        /**
         * Normalize links to Youtube and Vimeo to a unified format.
         *
index 9ef6b6b..7e2a18e 100644 (file)
@@ -38,10 +38,14 @@ class StatusSource extends BaseFactory
         */
        public function createFromUriId(int $uriId, int $uid): \Friendica\Object\Api\Mastodon\StatusSource
        {
-               $post = Post::selectOriginal(['uri-id', 'raw-body', 'body', 'title'], ['uri-id' => $uriId, 'uid' => [0, $uid]]);
+               $post = Post::selectOriginal(['uri-id', 'raw-body', 'body', 'title', 'content-warning'], ['uri-id' => $uriId, 'uid' => [0, $uid]]);
 
-               $spoiler_text = $post['title'] ?: BBCode::toPlaintext(BBCode::getAbstract($post['body'], Protocol::ACTIVITYPUB));
-               $body         = BBCode::toMarkdown(Post\Media::removeFromEndOfBody($post['body']));
+               $spoiler_text = $post['title'] ?: $post['content-warning'] ?: BBCode::toPlaintext(BBCode::getAbstract($post['body'], Protocol::ACTIVITYPUB));
+
+               $body = Post\Media::removeFromEndOfBody($post['body']);
+               $body = Post\Media::addHTMLLinkToBody($uriId, $body);
+               $body = BBCode::setMentionsToAddr($body);
+               $body = BBCode::toPlaintext($body);
 
                return new \Friendica\Object\Api\Mastodon\StatusSource($post['uri-id'], $body, $spoiler_text);
        }
index 7319c2c..f8a42fc 100644 (file)
@@ -82,7 +82,7 @@ class Markers extends BaseApi
                        $values->{$marker['timeline']} = [
                                'last_read_id' => $marker['last_read_id'],
                                'version'      => $marker['version'],
-                               'updated_at'   => $marker['updated_at']
+                               'updated_at'   => DateTimeFormat::utc($marker['updated_at'], DateTimeFormat::JSON)
                        ];
                }
                return $values;