X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FItem.php;h=86b9270fe9e899c55f7e6bf4cd2c129f1d515619;hb=d8974c9a2ae28b5dbf6281cee250b733f1363851;hp=f85bce5e8fcda0926657cf8864293777f76e8925;hpb=49b9505972ccfbc7bc5bda97960a9e09017e76f0;p=friendica.git diff --git a/src/Model/Item.php b/src/Model/Item.php index f85bce5e8f..86b9270fe9 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -159,6 +159,10 @@ class Item $fields['vid'] = Verb::getID($fields['verb']); } + if (!empty($fields['edited'])) { + $previous = Post::selectFirst(['edited'], $condition); + } + $rows = Post::update($fields, $condition); if (is_bool($rows)) { return $rows; @@ -203,8 +207,8 @@ class Item } // We only need to notfiy others when it is an original entry from us. - // Only call the notifier when the item has some content relevant change. - if ($item['origin'] && in_array('edited', array_keys($fields))) { + // Only call the notifier when the item had been edited and records had been changed. + if ($item['origin'] && !empty($fields['edited']) && ($previous['edited'] != $fields['edited'])) { $notify_items[] = $item['id']; } } @@ -518,7 +522,7 @@ class Item public static function isValid(array $item) { // When there is no content then we don't post it - if (($item['body'] . $item['title'] == '') && !Post\Media::existsByURIId($item['uri-id'])) { + if (($item['body'] . $item['title'] == '') && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) { Logger::notice('No body, no title.'); return false; } @@ -1004,9 +1008,6 @@ class Item // Check for hashtags in the body and repair or add hashtag links $item['body'] = self::setHashtags($item['body']); - // Fill the cache field - self::putInCache($item); - if (stristr($item['verb'], Activity::POKE)) { $notify_type = Delivery::POKE; } else { @@ -1909,6 +1910,15 @@ class Item return false; } + self::performActivity($item['id'], 'announce', $uid); + + /** + * All the following lines are only needed for private forums and compatibility to older systems without AP support. + * A possible way would be that the followers list of a forum would always be readable by all followers. + * So this would mean that the comment distribution could be done exactly for the intended audience. + * Or possibly we could store the receivers that had been in the "announce" message above and use this. + */ + // now change this copy of the post to a forum head message and deliver to all the tgroup members $self = DBA::selectFirst('contact', ['id', 'name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]); if (!DBA::isResult($self)) { @@ -1918,8 +1928,13 @@ class Item $owner_id = Contact::getIdForURL($self['url']); // also reset all the privacy bits to the forum default permissions - - $private = ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) ? self::PRIVATE : self::UNLISTED; + if ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) { + $private = self::PRIVATE; + } elseif (DI::pConfig()->get($user['uid'], 'system', 'unlisted')) { + $private = self::UNLISTED; + } else { + $private = self::PUBLIC; + } $psid = PermissionSet::getIdFromACL( $user['uid'], @@ -1937,8 +1952,6 @@ class Item Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], 'Notifier', Delivery::POST, (int)$item['uri-id'], (int)$item['uid']); - self::performActivity($item['id'], 'announce', $uid); - return false; } @@ -2627,7 +2640,7 @@ class Item ) { self::addRedirToImageTags($item); - $item['rendered-html'] = BBCode::convert($item['body']); + $item['rendered-html'] = BBCode::convertForUriId($item['uri-id'], $item['body']); $item['rendered-hash'] = hash('md5', BBCode::VERSION . '::' . $body); $hook_data = ['item' => $item, 'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']]; @@ -2726,6 +2739,23 @@ class Item } $body = $item['body'] ?? ''; + $shared = BBCode::fetchShareAttributes($body); + if (!empty($shared['guid'])) { + $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]); + $shared_uri_id = $shared_item['uri-id'] ?? 0; + $shared_links = [strtolower($shared_item['plink'] ?? '')]; + $shared_attachments = Post\Media::splitAttachments($shared_uri_id, $shared['guid']); + $shared_links = array_merge($shared_links, array_column($shared_attachments['visual'], 'url')); + $shared_links = array_merge($shared_links, array_column($shared_attachments['link'], 'url')); + $shared_links = array_merge($shared_links, array_column($shared_attachments['additional'], 'url')); + $item['body'] = self::replaceVisualAttachments($shared_attachments, $item['body']); + } else { + $shared_uri_id = 0; + $shared_links = []; + } + $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links); + $item['body'] = self::replaceVisualAttachments($attachments, $item['body'] ?? ''); + $item['body'] = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", "\n", $item['body']); self::putInCache($item); $item['body'] = $body; @@ -2748,27 +2778,15 @@ class Item return $s; } - $shared = BBCode::fetchShareAttributes($item['body']); - if (!empty($shared['guid'])) { - $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]); - $shared_uri_id = $shared_item['uri-id'] ?? 0; - $shared_links = [strtolower($shared_item['plink'] ?? '')]; - $attachments = Post\Media::splitAttachments($shared_uri_id, $shared['guid']); - $s = self::addVisualAttachments($attachments, $item, $s, true); - $s = self::addLinkAttachment($attachments, $body, $s, true, []); - $s = self::addNonVisualAttachments($attachments, $item, $s, true); - $shared_links = array_merge($shared_links, array_column($attachments['visual'], 'url')); - $shared_links = array_merge($shared_links, array_column($attachments['link'], 'url')); - $shared_links = array_merge($shared_links, array_column($attachments['additional'], 'url')); + if (!empty($shared_attachments)) { + $s = self::addVisualAttachments($shared_attachments, $item, $s, true); + $s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $shared_attachments, $body, $s, true, []); + $s = self::addNonVisualAttachments($shared_attachments, $item, $s, true); $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body); - } else { - $shared_uri_id = 0; - $shared_links = []; } - $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links); $s = self::addVisualAttachments($attachments, $item, $s, false); - $s = self::addLinkAttachment($attachments, $body, $s, false, $shared_links); + $s = self::addLinkAttachment($item['uri-id'], $attachments, $body, $s, false, $shared_links); $s = self::addNonVisualAttachments($attachments, $item, $s, false); // Map. @@ -2827,6 +2845,28 @@ class Item return false; } + /** + * Replace visual attachments in the body + * + * @param array $attachments + * @param string $body + * @return string modified body + */ + private static function replaceVisualAttachments(array $attachments, string $body) + { + $stamp1 = microtime(true); + + foreach ($attachments['visual'] as $attachment) { + if (!empty($attachment['preview'])) { + $body = str_replace($attachment['preview'], Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE), $body); + } elseif ($attachment['filetype'] == 'image') { + $body = str_replace($attachment['url'], Post\Media::getUrlForId($attachment['id']), $body); + } + } + DI::profiler()->saveTimestamp($stamp1, 'rendering'); + return $body; + } + /** * Add visual attachments to the content * @@ -2847,12 +2887,8 @@ class Item continue; } - $author = ['uid' => 0, 'id' => $item['author-id'], - 'network' => $item['author-network'], 'url' => $item['author-link']]; - $the_url = Contact::magicLinkByContact($author, $attachment['url']); - if (!empty($attachment['preview'])) { - $preview_url = Proxy::proxifyUrl(Contact::magicLinkByContact($author, $attachment['preview'])); + $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE); } else { $preview_url = ''; } @@ -2862,7 +2898,7 @@ class Item $media = Renderer::replaceMacros(Renderer::getMarkupTemplate('video_top.tpl'), [ '$video' => [ 'id' => $attachment['id'], - 'src' => $the_url, + 'src' => $attachment['url'], 'name' => $attachment['name'] ?: $attachment['url'], 'preview' => $preview_url, 'mime' => $attachment['mimetype'], @@ -2877,8 +2913,8 @@ class Item $media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/audio.tpl'), [ '$audio' => [ 'id' => $attachment['id'], - 'src' => $the_url, - 'name' => $attachment['name'] ?: $attachment['url'], + 'src' => $attachment['url'], + 'name' => $attachment['name'] ?: $attachment['url'], 'mime' => $attachment['mimetype'], ], ]); @@ -2888,14 +2924,11 @@ class Item $trailing .= $media; } } elseif ($attachment['filetype'] == 'image') { - if (empty($preview_url) && (max($attachment['width'], $attachment['height']) > 600)) { - $preview_url = Proxy::proxifyUrl($the_url, false, ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE); - } $media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image.tpl'), [ '$image' => [ - 'src' => Proxy::proxifyUrl($the_url), - 'preview' => $preview_url, - 'attachment' => $attachment, + 'src' => Post\Media::getUrlForId($attachment['id']), + 'preview' => Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE), + 'attachment' => $attachment, ], ]); // On Diaspora posts the attached pictures are leading @@ -2934,7 +2967,7 @@ class Item * @param array $ignore_links A list of URLs to ignore * @return string modified content */ - private static function addLinkAttachment(array $attachments, string $body, string $content, bool $shared, array $ignore_links) + private static function addLinkAttachment(int $uriid, array $attachments, string $body, string $content, bool $shared, array $ignore_links) { $stamp1 = microtime(true); // @ToDo Check only for audio and video @@ -2973,11 +3006,11 @@ class Item 'type' => 'link', 'url' => $attachment['url']]; - if ($preview) { + if ($preview && !empty($attachment['preview'])) { if ($attachment['preview-width'] >= 500) { - $data['image'] = $attachment['preview'] ?? ''; + $data['image'] = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_MEDIUM); } else { - $data['preview'] = $attachment['preview'] ?? ''; + $data['preview'] = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_MEDIUM); } } @@ -3020,7 +3053,7 @@ class Item } // @todo Use a template - $rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data); + $rendered = BBCode::convertAttachment('', BBCode::INTERNAL, false, $data, $uriid); } elseif (!self::containsLink($content, $data['url'], Post\Media::HTML)) { $rendered = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/link.tpl'), [ '$url' => $data['url'],