namespace Friendica\Model;
+use DOMDocument;
+use DOMXPath;
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
-use Friendica\Core\Session;
use Friendica\Core\System;
use Friendica\Model\Tag;
use Friendica\Core\Worker;
'private', 'title', 'body', 'raw-body', 'location', 'coord', 'app',
'inform', 'deleted', 'extid', 'post-type', 'post-reason', 'gravity',
'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
- 'author-id', 'author-link', 'author-name', 'author-avatar', 'owner-id', 'owner-link', 'contact-uid',
+ 'author-id', 'author-addr', 'author-link', 'author-name', 'author-avatar', 'owner-id', 'owner-link', 'contact-uid',
'signed_text', 'network', 'wall', 'contact-id', 'plink', 'origin',
'thr-parent-id', 'parent-uri-id', 'quote-uri', 'quote-uri-id', 'postopts', 'pubmail',
'event-created', 'event-edited', 'event-start', 'event-finish',
Activity::FOLLOW,
Activity::ANNOUNCE];
+ // Privacy levels
const PUBLIC = 0;
const PRIVATE = 1;
const UNLISTED = 2;
Logger::info('Updating per single row method', ['fields' => $fields, 'condition' => $condition]);
- $items = Post::select(['id', 'origin', 'uri-id', 'uid', 'author-network'], $condition);
+ $items = Post::select(['id', 'origin', 'uri-id', 'uid', 'author-network', 'quote-uri-id'], $condition);
$notify_items = [];
while ($item = DBA::fetch($items)) {
if (!empty($fields['body'])) {
+ if (!empty($item['quote-uri-id'])) {
+ $fields['body'] = BBCode::removeSharedData($fields['body']);
+
+ if (!empty($fields['raw-body'])) {
+ $fields['raw-body'] = BBCode::removeSharedData($fields['raw-body']);
+ }
+ }
+
Post\Media::insertFromAttachmentData($item['uri-id'], $fields['body']);
$content_fields = ['raw-body' => trim($fields['raw-body'] ?? $fields['body'])];
$content_fields['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $content_fields['raw-body']);
$content_fields['raw-body'] = self::setHashtags($content_fields['raw-body']);
- if ($item['author-network'] != Protocol::DFRN) {
- Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']);
- }
-
+ Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']);
Post\Content::update($item['uri-id'], $content_fields);
}
* generate a resource-id and therefore aren't intimately linked to the item.
*/
/// @TODO: this should first check if photo is used elsewhere
- if (strlen($item['resource-id'])) {
+ if ($item['resource-id']) {
Photo::delete(['resource-id' => $item['resource-id'], 'uid' => $item['uid']]);
}
Post\ThreadUser::update($item['uri-id'], $item['uid'], ['hidden' => true]);
}
+ DI::notify()->deleteForItem($item['uri-id']);
+ DI::notification()->deleteForItem($item['uri-id']);
+
Logger::info('Item has been marked for deletion.', ['id' => $item_id]);
return true;
public static function isValid(array $item): bool
{
// When there is no content then we don't post it
- if (($item['body'] . $item['title'] == '') && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
+ if (($item['body'] . $item['title'] == '') && empty($item['quote-uri-id']) && (empty($item['uri-id']) || !Post\Media::existsByURIId($item['uri-id']))) {
Logger::notice('No body, no title.');
return false;
}
return self::GRAVITY_UNKNOWN; // Should not happen
}
+ private static function prepareOriginPost(array $item): array
+ {
+ $item['wall'] = 1;
+ $item['origin'] = 1;
+ $item['network'] = Protocol::DFRN;
+ $item['protocol'] = Conversation::PARCEL_DIRECT;
+ $item['direction'] = Conversation::PUSH;
+
+ $owner = User::getOwnerDataById($item['uid']);
+
+ if (empty($item['contact-id'])) {
+ $item['contact-id'] = $owner['id'];
+ }
+
+ if (empty($item['author-link']) && empty($item['author-id'])) {
+ $item['author-link'] = $owner['url'];
+ $item['author-name'] = $owner['name'];
+ $item['author-avatar'] = $owner['thumb'];
+ }
+
+ if (empty($item['owner-link']) && empty($item['owner-id'])) {
+ $item['owner-link'] = $item['author-link'];
+ $item['owner-name'] = $item['author-name'];
+ $item['owner-avatar'] = $item['author-avatar'];
+ }
+
+ // Setting the object type if not defined before
+ if (empty($item['object-type'])) {
+ $item['object-type'] = Activity\ObjectType::NOTE; // Default value
+ $objectdata = BBCode::getAttachedData($item['body']);
+
+ if ($objectdata['type'] == 'link') {
+ $item['object-type'] = Activity\ObjectType::BOOKMARK;
+ } elseif ($objectdata['type'] == 'video') {
+ $item['object-type'] = Activity\ObjectType::VIDEO;
+ } elseif ($objectdata['type'] == 'photo') {
+ $item['object-type'] = Activity\ObjectType::IMAGE;
+ }
+ }
+
+ return $item;
+ }
+
/**
* Inserts item record
*
// If it is a posting where users should get notifications, then define it as wall posting
if ($notify) {
- $item['wall'] = 1;
- $item['origin'] = 1;
- $item['network'] = Protocol::DFRN;
- $item['protocol'] = Conversation::PARCEL_DIRECT;
- $item['direction'] = Conversation::PUSH;
+ $item = self::prepareOriginPost($item);
if (is_int($notify) && in_array($notify, Worker::PRIORITIES)) {
$priority = $notify;
$item['parent-uri'] = $toplevel_parent['uri'];
$item['parent-uri-id'] = $toplevel_parent['uri-id'];
$item['deleted'] = $toplevel_parent['deleted'];
+ $item['wall'] = $toplevel_parent['wall'];
// Reshares have to keep their permissions to allow forums to work
if (!$item['origin'] || ($item['verb'] != Activity::ANNOUNCE)) {
}
// We have to tell the hooks who we are - this really should be improved
- if (!Session::getLocalUser()) {
+ if (!DI::userSession()->getLocalUserId()) {
$_SESSION['authenticated'] = true;
$_SESSION['uid'] = $uid;
$dummy_session = true;
unset($item['attachments']);
}
+ if (empty($item['quote-uri-id'])) {
+ $quote_id = self::getQuoteUriId($item['body']);
+ if (!empty($quote_id)) {
+ // This is one of these "should not happen" situations.
+ // The protocol implementations should already have done this job.
+ Logger::notice('Quote-uri-id detected in post', ['id' => $quote_id, 'guid' => $item['guid'], 'uri-id' => $item['uri-id'], 'callstack' => System::callstack(20)]);
+ $item['quote-uri-id'] = $quote_id;
+ }
+ }
+
+ if (!empty($item['quote-uri-id'])) {
+ $item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
+ $item['body'] = BBCode::removeSharedData($item['body']);
+ }
+
Post\Media::insertFromAttachmentData($item['uri-id'], $item['body']);
// Remove all media attachments from the body and store them in the post-media table
$item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']);
$item['raw-body'] = self::setHashtags($item['raw-body']);
- $quote_id = self::getQuoteUriId($item['body']);
-
- if (!empty($quote_id) && Post::exists(['uri-id' => $quote_id, 'network' => Protocol::FEDERATED])) {
- $item['quote-uri-id'] = $quote_id;
- $item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
- }
-
- if (!DBA::exists('contact', ['id' => $item['author-id'], 'network' => Protocol::DFRN])) {
- Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
- }
+ Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
// Check for hashtags in the body and repair or add hashtag links
$item['body'] = self::setHashtags($item['body']);
}
}
+ if (!empty($source) && ($transmit || DI::config()->get('debug', 'store_source'))) {
+ Post\Activity::insert($item['uri-id'], $source);
+ }
+
if ($transmit) {
- if (!empty($source)) {
- Post\Activity::insert($item['uri-id'], $source);
- }
Worker::add(['priority' => $priority, 'dont_fork' => true], 'Notifier', $notify_type, (int)$posted_item['uri-id'], (int)$posted_item['uid']);
}
return;
}
+ $cdata = Contact::getPublicAndUserContactID($item['author-id'], $item['uid']);
+ if (empty($cdata['user']) || ($cdata['user'] != $item['contact-id'])) {
+ return;
+ }
+
if (!DBA::exists('contact', ['id' => $item['contact-id'], 'remote_self' => Contact::MIRROR_NATIVE_RESHARE])) {
return;
}
public static function isRemoteSelf(array $contact, array &$datarray): bool
{
- if (!$contact['remote_self']) {
+ if ($contact['remote_self'] != Contact::MIRROR_OWN_POST) {
return false;
}
// Prevent the forwarding of posts that are forwarded
- if (!empty($datarray["extid"]) && ($datarray["extid"] == Protocol::DFRN)) {
+ if (!empty($datarray['extid']) && ($datarray['extid'] == Protocol::DFRN)) {
Logger::info('Already forwarded');
return false;
}
// Prevent to forward already forwarded posts
- if ($datarray["app"] == DI::baseUrl()->getHostname()) {
+ if ($datarray['app'] == DI::baseUrl()->getHostname()) {
Logger::info('Already forwarded (second test)');
return false;
}
// Only forward posts
- if ($datarray["verb"] != Activity::POST) {
+ if ($datarray['verb'] != Activity::POST) {
Logger::info('No post');
return false;
}
$datarray2 = $datarray;
Logger::info('remote-self start', ['contact' => $contact['url'], 'remote_self'=> $contact['remote_self'], 'item' => $datarray]);
- if ($contact['remote_self'] == Contact::MIRROR_OWN_POST) {
- $self = DBA::selectFirst('contact', ['id', 'name', 'url', 'thumb'],
- ['uid' => $contact['uid'], 'self' => true]);
- if (DBA::isResult($self)) {
- $datarray['contact-id'] = $self["id"];
-
- $datarray['owner-name'] = $self["name"];
- $datarray['owner-link'] = $self["url"];
- $datarray['owner-avatar'] = $self["thumb"];
-
- $datarray['author-name'] = $datarray['owner-name'];
- $datarray['author-link'] = $datarray['owner-link'];
- $datarray['author-avatar'] = $datarray['owner-avatar'];
-
- unset($datarray['edited']);
-
- unset($datarray['network']);
- unset($datarray['owner-id']);
- unset($datarray['author-id']);
- }
-
- if ($contact['network'] != Protocol::FEED) {
- $old_uri_id = $datarray["uri-id"] ?? 0;
- $datarray["guid"] = System::createUUID();
- unset($datarray["plink"]);
- $datarray["uri"] = self::newURI($datarray["guid"]);
- $datarray["uri-id"] = ItemURI::getIdByURI($datarray["uri"]);
- $datarray["extid"] = Protocol::DFRN;
- $urlpart = parse_url($datarray2['author-link']);
- $datarray["app"] = $urlpart["host"];
- if (!empty($old_uri_id)) {
- Post\Media::copy($old_uri_id, $datarray["uri-id"]);
- }
- unset($datarray["parent-uri"]);
- unset($datarray["thr-parent"]);
- } else {
- $datarray['private'] = self::PUBLIC;
- }
+ $self = DBA::selectFirst('contact', ['id', 'name', 'url', 'thumb'],
+ ['uid' => $contact['uid'], 'self' => true]);
+ if (!DBA::isResult($self)) {
+ Logger::error('Self contact not found', ['uid' => $contact['uid']]);
+ return false;
}
+ $datarray['contact-id'] = $self['id'];
+
+ $datarray['author-name'] = $datarray['owner-name'] = $self['name'];
+ $datarray['author-link'] = $datarray['owner-link'] = $self['url'];
+ $datarray['author-avatar'] = $datarray['owner-avatar'] = $self['thumb'];
+
+ unset($datarray['edited']);
+
+ unset($datarray['network']);
+ unset($datarray['owner-id']);
+ unset($datarray['author-id']);
+
if ($contact['network'] != Protocol::FEED) {
+ $old_uri_id = $datarray['uri-id'] ?? 0;
+ $datarray['guid'] = System::createUUID();
+ unset($datarray['plink']);
+ $datarray['uri'] = self::newURI($datarray['guid']);
+ $datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
+ $datarray['extid'] = Protocol::DFRN;
+ $urlpart = parse_url($datarray2['author-link']);
+ $datarray['app'] = $urlpart['host'];
+ if (!empty($old_uri_id)) {
+ Post\Media::copy($old_uri_id, $datarray['uri-id']);
+ }
+
+ unset($datarray['parent-uri']);
+ unset($datarray['thr-parent']);
+
// Store the original post
$result = self::insert($datarray2);
Logger::info('remote-self post original item', ['contact' => $contact['url'], 'result'=> $result, 'item' => $datarray2]);
} else {
- $datarray["app"] = "Feed";
+ $datarray['private'] = self::PUBLIC;
+ $datarray['app'] = 'Feed';
$result = true;
}
}
$condition = ['vid' => $vids, 'deleted' => false, 'gravity' => self::GRAVITY_ACTIVITY,
- 'author-id' => $author_id, 'uid' => $item['uid'], 'thr-parent-id' => $uri_id];
+ 'author-id' => $author_id, 'uid' => $uid, 'thr-parent-id' => $uri_id];
$like_item = Post::selectFirst(['id', 'guid', 'verb'], $condition);
if (DBA::isResult($like_item)) {
*/
public static function getPermissionsConditionArrayByUserId(int $owner_id): array
{
- $local_user = Session::getLocalUser();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
// default permissions - anonymous user
$condition = ["`private` != ?", self::PRIVATE];
*/
public static function getPermissionsSQLByUserId(int $owner_id, string $table = ''): string
{
- $local_user = Session::getLocalUser();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
if (!empty($table)) {
$table = DBA::quoteIdentifier($table) . '.';
$a = DI::app();
Hook::callAll('prepare_body_init', $item);
+
// In order to provide theme developers more possibilities, event items
// are treated differently.
if ($item['object-type'] === Activity\ObjectType::EVENT && isset($item['event-id'])) {
$item['mentions'] = $tags['mentions'];
$body = $item['body'] ?? '';
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'guid', 'plink', 'has-media'], ['guid' => $shared['guid'], 'uid' => [$item['uid'], 0]]);
- }
- $fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media'];
+ $fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media', 'quote-uri-id', 'post-type'];
$shared_uri_id = 0;
$shared_links = [];
- if (empty($shared_item['uri-id']) && !empty($item['quote-uri-id'])) {
- $shared_item = Post::selectFirst($fields, ['uri-id' => $item['quote-uri-id']]);
- $quote_uri_id = $item['quote-uri-id'] ?? 0;
- $shared_links[] = strtolower($item['quote-uri']);
- } elseif (empty($shared_item['uri-id']) && empty($item['quote-uri-id'])) {
+ $shared = DI::contentItem()->getSharedPost($item, $fields);
+ if (!empty($shared['post'])) {
+ $shared_item = $shared['post'];
+ $quote_uri_id = $shared['post']['uri-id'];
+ $shared_links[] = strtolower($shared['post']['uri']);
+ $item['body'] = BBCode::removeSharedData($item['body']);
+ } elseif (empty($shared_item['uri-id']) && empty($item['quote-uri-id']) && ($item['network'] != Protocol::DIASPORA)) {
$media = Post\Media::getByURIId($item['uri-id'], [Post\Media::ACTIVITY]);
if (!empty($media)) {
$shared_item = Post::selectFirst($fields, ['plink' => $media[0]['url'], 'uid' => [$item['uid'], 0]]);
if (!empty($shared_item['uri-id'])) {
$shared_uri_id = $shared_item['uri-id'];
$shared_links[] = strtolower($shared_item['plink']);
- $shared_attachments = Post\Media::splitAttachments($shared_uri_id, $shared_item['guid'], [], $shared_item['has-media']);
+ $shared_attachments = Post\Media::splitAttachments($shared_uri_id, [], $shared_item['has-media']);
$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']);
}
- $attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links, $item['has-media'] ?? false);
+ $attachments = Post\Media::splitAttachments($item['uri-id'], $shared_links, $item['has-media'] ?? false);
$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;
$s = $item["rendered-html"];
// Compile eventual content filter reasons
$filter_reasons = [];
- if (!$is_preview && Session::getPublicContact() != $item['author-id']) {
- if (!empty($item['content-warning']) && (!Session::getLocalUser() || !DI::pConfig()->get(Session::getLocalUser(), 'system', 'disable_cw', false))) {
+ if (!$is_preview && DI::userSession()->getPublicContactId() != $item['author-id']) {
+ if (!empty($item['content-warning']) && (!DI::userSession()->getLocalUserId() || !DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'disable_cw', false))) {
$filter_reasons[] = DI::l10n()->t('Content warning: %s', $item['content-warning']);
}
'filter_reasons' => $filter_reasons
];
Hook::callAll('prepare_body', $hook_data);
+ // Remove old images
+// $hook_data['html'] = preg_replace('|(<a.*><img.*>.*</a>)|', '', $hook_data['html']);
+// $grid = self::make_image_grid($hook_data);
+// $s = $hook_data['html'] . $grid;
$s = $hook_data['html'];
unset($hook_data);
}
if (!empty($shared_attachments)) {
- $s = self::addVisualAttachments($shared_attachments, $item, $s, true);
+ $s = self::addVisualAttachments($shared_attachments, $shared_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);
+ $body = BBCode::removeSharedData($body);
}
$s = self::addVisualAttachments($attachments, $item, $s, false);
return $hook_data['html'];
}
+ private function make_image_grid(array &$data)
+ {
+ $item = $data['item'];
+ if ($item['has-media']) {
+ $attachments = Post\Media::splitAttachments($item['uri-id'], [], $item['has-media'] ?? false);
+ if (count($attachments['visual']) > 1) {
+ $img_tags_fc = array();
+ $img_tags_sc = array();
+ $count = 0;
+ foreach ($attachments['visual'] as $attachment) {
+ $src_url = Post\Media::getUrlForId($attachment['id']);
+ $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE);
+ $img_tag = array(
+ '$image' => [
+ 'src' => $src_url,
+ 'preview' => $preview_url,
+ 'attachment' => $attachment,
+ ]);
+ if ($count % 2 == 0) {
+ $img_tags_fc[] = $img_tag;
+ } else {
+ $img_tags_sc[] = $img_tag;
+ }
+ ++$count;
+ }
+
+ $img_grid = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image_grid.tpl'), [
+ 'columns' => [
+ 'fc' => $img_tags_fc,
+ 'sc' => $img_tags_sc,
+ ],
+ ]);
+ return $img_grid;
+ }
+ }
+
+ }
+
+ /**
+ * This function removes images at the very end of a post based on the assumption that this images are interpreted
+ * as attachments
+ * @param array $rendered_html
+ * @return array
+ */
+ private function cutAttachedImages(array &$rendered_html) {
+ $doc = new DOMDocument();
+ $doc->loadHTML($rendered_html);
+
+ $xpathsearch = new DOMXPath($doc);
+ $nodes = $xpathsearch->query("*");
+
+ return $nodes;
+ }
+
+ /**
+ * @param array $data
+ * @return string|void
+ * @throws \Friendica\Network\HTTPException\ServiceUnavailableException
+ */
+ private function make_image_grid(array &$data)
+ {
+ $item = $data['item'];
+ if ($item['has-media']) {
+ $attachments = Post\Media::splitAttachments($item['uri-id'], [], $item['has-media'] ?? false);
+ if (count($attachments['visual']) > 1) {
+ $img_tags_fc = array();
+ $img_tags_sc = array();
+ $count = 0;
+ foreach ($attachments['visual'] as $attachment) {
+ $src_url = Post\Media::getUrlForId($attachment['id']);
+ $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE);
+ $img_tag = array(
+ '$image' => [
+ 'src' => $src_url,
+ 'preview' => $preview_url,
+ 'attachment' => $attachment,
+ ]);
+ // @todo add some fany ai to divide images equally on both columns
+ if ($count % 2 == 0) {
+ $img_tags_fc[] = $img_tag;
+ } else {
+ $img_tags_sc[] = $img_tag;
+ }
+ ++$count;
+ }
+
+ $img_grid = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image_grid.tpl'), [
+ 'columns' => [
+ 'fc' => $img_tags_fc,
+ 'sc' => $img_tags_sc,
+ ],
+ ]);
+ return $img_grid;
+ }
+ }
+
+ }
+
/**
* Check if the body contains a link
*
{
// Make sure that for example site parameters aren't used when testing if the link is contained in the body
$urlparts = parse_url($url);
- if (!empty($urlparts)) {
- unset($urlparts['query']);
- unset($urlparts['fragment']);
+ if (empty($urlparts)) {
+ return false;
+ }
+
+ unset($urlparts['query']);
+ unset($urlparts['fragment']);
+
+ try {
$url = (string)Uri::fromParts($urlparts);
- } else {
+ } catch (\InvalidArgumentException $e) {
+ DI::logger()->notice('Invalid URL', ['$url' => $url, '$urlparts' => $urlparts]);
+ /* See https://github.com/friendica/friendica/issues/12113
+ * Malformed URLs will result in a Fatal Error
+ */
return false;
}
if (strpos($body, $url)) {
return true;
}
+
foreach ([0, 1, 2] as $size) {
if (preg_match('#/photo/.*-' . $size . '\.#ism', $url) &&
strpos(preg_replace('#(/photo/.*)-[012]\.#ism', '$1-' . $size . '.', $body), $url)) {
return true;
}
}
+
return false;
}
continue;
}
- if (!empty($attachment['preview'])) {
+ if ($attachment['filetype'] == 'image') {
+ $preview_url = Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE);
+ } elseif (!empty($attachment['preview'])) {
$preview_url = Post\Media::getPreviewUrlForId($attachment['id'], Proxy::SIZE_LARGE);
} else {
$preview_url = '';
}
+ if ($preview_url && self::containsLink($item['body'], $preview_url)) {
+ continue;
+ }
+
if (($attachment['filetype'] == 'video')) {
/// @todo Move the template to /content as well
$media = Renderer::replaceMacros(Renderer::getMarkupTemplate('video_top.tpl'), [
$trailing .= $media;
}
} elseif ($attachment['filetype'] == 'image') {
+ $src_url = Post\Media::getUrlForId($attachment['id']);
+ if (self::containsLink($item['body'], $src_url)) {
+ continue;
+ }
$media = Renderer::replaceMacros(Renderer::getMarkupTemplate('content/image.tpl'), [
'$image' => [
- 'src' => Post\Media::getUrlForId($attachment['id']),
- 'preview' => Post\Media::getPreviewUrlForId($attachment['id'], ($attachment['width'] > $attachment['height']) ? Proxy::SIZE_MEDIUM : Proxy::SIZE_LARGE),
+ 'src' => $src_url,
+ 'preview' => $preview_url,
'attachment' => $attachment,
],
]);
$percent = $option['replies'] / $question['voters'] * 100;
$options[$key]['vote'] = DI::l10n()->tt('%2$s (%3$d%%, %1$d vote)', '%2$s (%3$d%%, %1$d votes)', $option['replies'], $option['name'], round($percent, 1));
} else {
- $options[$key]['vote'] = DI::l10n()->tt('%2$s (%1$d vote)', '%2$s (%1$d votes)', $option['replies'], $option['name'], );
+ $options[$key]['vote'] = DI::l10n()->tt('%2$s (%1$d vote)', '%2$s (%1$d votes)', $option['replies'], $option['name']);
}
}
$plink = $item['uri'];
}
- if (Session::getLocalUser()) {
+ if (DI::userSession()->getLocalUserId()) {
$ret = [
'href' => "display/" . $item['guid'],
'orig' => "display/" . $item['guid'],
return 0;
}
- /**
- * Return share data from an item array (if the item is shared item)
- * We are providing the complete Item array, because at some time in the future
- * we hopefully will define these values not in the body anymore but in some item fields.
- * This function is meant to replace all similar functions in the system.
- *
- * @param array $item
- *
- * @return array with share information
- */
- public static function getShareArray(array $item): array
- {
- return BBCode::fetchShareAttributes($item['body']);
- }
-
/**
* Check a prospective item array against user-level permissions
*
}
/**
- * Improve the data in shared posts
+ * Fetch the uri-id of a quote
*
- * @param array $item
- * @param bool $add_media
- * @return string body
+ * @param string $body
+ * @return integer
*/
- public static function improveSharedDataInBody(array $item, bool $add_media = false): string
+ public static function getQuoteUriId(string $body, int $uid = 0): int
{
- $shared = BBCode::fetchShareAttributes($item['body']);
+ $shared = BBCode::fetchShareAttributes($body);
if (empty($shared['guid']) && empty($shared['message_id'])) {
- return $item['body'];
+ return 0;
}
- $link = $shared['link'] ?: $shared['message_id'];
-
- if (empty($shared_content)) {
- $shared_content = DI::contentItem()->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
+ if (empty($shared['link']) && empty($shared['message_id'])) {
+ Logger::notice('Invalid share block.', ['share' => $shared]);
+ return 0;
}
- if (empty($shared_content)) {
- return $item['body'];
+ if (!empty($shared['guid'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['guid' => $shared['guid'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by guid', ['guid' => $shared['guid'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
}
- $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
+ if (!empty($shared['message_id'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['uri' => $shared['message_id'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by message_id', ['message_id' => $shared['message_id'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+ }
- Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
- return $item['body'];
- }
+ if (!empty($shared['link'])) {
+ $shared_item = Post::selectFirst(['uri-id'], ['plink' => $shared['link'], 'uid' => [0, $uid]]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Found post by link', ['link' => $shared['link'], 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+ }
- /**
- * Fetch the uri-id of a quote
- *
- * @param string $body
- * @return integer
- */
- private static function getQuoteUriId(string $body): int
- {
- $shared = BBCode::fetchShareAttributes($body);
- if (empty($shared['message_id'])) {
+ $url = $shared['message_id'] ?: $shared['link'];
+ $id = self::fetchByLink($url);
+ if (!$id) {
+ Logger::notice('Post could not be fetched.', ['url' => $url, 'uid' => $uid]);
return 0;
}
- return ItemURI::getIdByURI($shared['message_id']);
+
+ $shared_item = Post::selectFirst(['uri-id'], ['id' => $id]);
+ if (!empty($shared_item['uri-id'])) {
+ Logger::debug('Fetched shared post', ['id' => $id, 'url' => $url, 'uid' => $uid]);
+ return $shared_item['uri-id'];
+ }
+
+ Logger::warning('Post does not exist although it was supposed to had been fetched.', ['id' => $id, 'url' => $url, 'uid' => $uid]);
+ return 0;
}
}