X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FItem.php;h=163db89aa472c6b698cffb5ca92d244d9d7b4b4f;hb=06a1db4f24bffbb6027f6341879345bde7212ecc;hp=2a4bc9e3e6ae2dba54ca0668809f3608678e2eb8;hpb=4eec2804de78a6aeb30f843b3b295a563f78a3fe;p=friendica.git diff --git a/src/Content/Item.php b/src/Content/Item.php index 2a4bc9e3e6..163db89aa4 100644 --- a/src/Content/Item.php +++ b/src/Content/Item.php @@ -34,15 +34,16 @@ use Friendica\Core\Protocol; use Friendica\Core\Session\Capability\IHandleUserSessions; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Model\Attach; +use Friendica\Model\Circle; use Friendica\Model\Contact; use Friendica\Model\Conversation; use Friendica\Model\FileTag; -use Friendica\Model\Group; use Friendica\Model\Item as ItemModel; use Friendica\Model\Photo; -use Friendica\Model\Tag; use Friendica\Model\Post; +use Friendica\Model\Tag; use Friendica\Model\User; use Friendica\Network\HTTPException; use Friendica\Object\EMail\ItemCCEMail; @@ -54,6 +55,7 @@ use Friendica\Util\ParseUrl; use Friendica\Util\Profiler; use Friendica\Util\Proxy; use Friendica\Util\XML; +use GuzzleHttp\Psr7\Uri; /** * A content helper class for displaying items @@ -96,32 +98,33 @@ class Item } /** - * Return array with details for categories and folders for an item + * Lists categories and folders for an item * * @param array $item * @param int $uid - * @return [array, array] - * + * @return array * [ - * [ // categories array - * { - * 'name': 'category name', - * 'removeurl': 'url to remove this category', - * 'first': 'is the first in this array? true/false', - * 'last': 'is the last in this array? true/false', - * } , - * .... - * ], - * [ //folders array - * { - * 'name': 'folder name', - * 'removeurl': 'url to remove this folder', - * 'first': 'is the first in this array? true/false', - * 'last': 'is the last in this array? true/false', - * } , - * .... - * ] - * ] + * [ // categories array + * { + * 'name': 'category name', + * 'removeurl': 'url to remove this category', + * 'first': 'is the first in this array? true/false', + * 'last': 'is the last in this array? true/false', + * }, + * ... + * ], + * [ //folders array + * { + * 'name': 'folder name', + * 'removeurl': 'url to remove this folder', + * 'first': 'is the first in this array? true/false', + * 'last': 'is the last in this array? true/false', + * } , + * ... + * ] + * ] + * + * @throws \Exception */ public function determineCategoriesTerms(array $item, int $uid = 0): array { @@ -135,9 +138,9 @@ class Item return [$categories, $folders]; } - foreach (Post\Category::getArrayByURIId($item['uri-id'], $uid, Post\Category::CATEGORY) as $savedFolderName) { + foreach (Post\Category::getArrayByURIId($item['uri-id'], $uid) as $savedFolderName) { if (!empty($item['author-link'])) { - $url = $item['author-link'] . "?category=" . rawurlencode($savedFolderName); + $url = $item['author-link'] . '/conversations?category=' . rawurlencode($savedFolderName); } else { $url = '#'; } @@ -304,18 +307,20 @@ class Item } $author_arr = [ - 'uid' => 0, - 'id' => $item['author-id'], + 'uid' => 0, + 'id' => $item['author-id'], 'network' => $item['author-network'], - 'url' => $item['author-link'], + 'url' => $item['author-link'], + 'alias' => $item['author-alias'], ]; $author = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $item['author-name'] . '[/url]'; $author_arr = [ - 'uid' => 0, - 'id' => $obj['author-id'], + 'uid' => 0, + 'id' => $obj['author-id'], 'network' => $obj['author-network'], - 'url' => $obj['author-link'], + 'url' => $obj['author-link'], + 'alias' => $obj['author-alias'], ]; $objauthor = '[url=' . Contact::magicLinkByContact($author_arr) . ']' . $obj['author-name'] . '[/url]'; @@ -364,20 +369,25 @@ class Item { $this->profiler->startRecording('rendering'); $sub_link = $contact_url = $pm_url = $status_link = ''; - $photos_link = $posts_link = $block_link = $ignore_link = ''; + $photos_link = $posts_link = $block_link = $ignore_link = $collapse_link = $ignoreserver_link = ''; if ($this->userSession->getLocalUserId() && $this->userSession->getLocalUserId() == $item['uid'] && $item['gravity'] == ItemModel::GRAVITY_PARENT && !$item['self'] && !$item['mention']) { $sub_link = 'javascript:doFollowThread(' . $item['id'] . '); return false;'; } $author = [ - 'uid' => 0, - 'id' => $item['author-id'], + 'uid' => 0, + 'id' => $item['author-id'], 'network' => $item['author-network'], - 'url' => $item['author-link'], + 'url' => $item['author-link'], + 'alias' => $item['author-alias'], ]; $profile_link = Contact::magicLinkByContact($author, $item['author-link']); - $sparkle = (strpos($profile_link, 'contact/redir/') === 0); + if (strpos($profile_link, 'contact/redir/') === 0) { + $status_link = $profile_link . '?' . http_build_query(['url' => $item['author-link'] . '/status']); + $photos_link = $profile_link . '?' . http_build_query(['url' => $item['author-link'] . '/photos']); + $profile_link = $profile_link . '?' . http_build_query(['url' => $item['author-link'] . '/profile']); + } $cid = 0; $pcid = $item['author-id']; @@ -391,12 +401,6 @@ class Item $rel = $contact['rel']; } - if ($sparkle) { - $status_link = $profile_link . '/status'; - $photos_link = $profile_link . '/photos'; - $profile_link = $profile_link . '/profile'; - } - if (!empty($pcid)) { $contact_url = 'contact/' . $pcid; $posts_link = $contact_url . '/posts'; @@ -405,6 +409,11 @@ class Item $collapse_link = $item['self'] ? '' : $contact_url . '/collapse?t=' . $formSecurityToken; } + $authorBaseUri = new Uri($item['author-baseurl'] ?? ''); + if (!empty($item['author-gsid']) && $authorBaseUri->getHost() && !DI::baseUrl()->isLocalUrl($authorBaseUri)) { + $ignoreserver_link = 'settings/server/' . $item['author-gsid'] . '/ignore'; + } + if ($cid && !$item['self']) { $contact_url = 'contact/' . $cid; $posts_link = $contact_url . '/posts'; @@ -425,7 +434,8 @@ class Item $this->l10n->t('Send PM') => $pm_url, $this->l10n->t('Block') => $block_link, $this->l10n->t('Ignore') => $ignore_link, - $this->l10n->t('Collapse') => $collapse_link + $this->l10n->t('Collapse') => $collapse_link, + $this->l10n->t("Ignore %s server", $authorBaseUri->getHost()) => $ignoreserver_link, ]; if (!empty($item['language'])) { @@ -485,16 +495,16 @@ class Item { // Look for any tags and linkify them $item['inform'] = ''; - $private_forum = false; + $private_group = false; $private_id = null; - $only_to_forum = false; - $forum_contact = []; + $only_to_group = false; + $group_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 + // Search for group 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']); if (empty($contact)) { @@ -513,37 +523,45 @@ class Item } 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_group = $contact['prv']; + $only_to_group = ($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]]); + $group_contact = $contact; + Logger::info('Private group or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]); } elseif ($item['allow_cid'] == '<' . $contact['id'] . '>') { - $private_forum = false; - $only_to_forum = true; + $private_group = false; + $only_to_group = true; $private_id = $contact['id']; - $forum_contact = $contact; - Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]); + $group_contact = $contact; + Logger::info('Public group', ['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('Post with group mention will not be converted to a group post', ['url' => $tag[2], 'mention' => $tag[1]]); } } Logger::info('Got inform', ['inform' => $item['inform']]); - if (($item['gravity'] == ItemModel::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 ? ItemModel::PRIVATE : ItemModel::UNLISTED; + if (($item['gravity'] == ItemModel::GRAVITY_PARENT) && !empty($group_contact) && ($private_group || $only_to_group)) { + // we tagged a group in a top level post. Now we change the post + $item['private'] = $private_group ? ItemModel::PRIVATE : ItemModel::UNLISTED; + + if ($only_to_group) { + $cdata = Contact::getPublicAndUserContactID($group_contact['id'], $item['uid']); + if (!empty($cdata['user'])) { + $item['owner-id'] = $cdata['user']; + unset($item['owner-link']); + unset($item['owner-name']); + unset($item['owner-avatar']); + } - if ($only_to_forum) { $item['postopts'] = ''; } $item['deny_cid'] = ''; $item['deny_gid'] = ''; - if ($private_forum) { + if ($private_group) { $item['allow_cid'] = '<' . $private_id . '>'; - $item['allow_gid'] = '<' . Group::getIdForForum($forum_contact['id']) . '>'; + $item['allow_gid'] = '<' . Circle::getIdForGroup($group_contact['id']) . '>'; } else { $item['allow_cid'] = ''; $item['allow_gid'] = ''; @@ -659,14 +677,15 @@ class Item * Add a share block for the given item array * * @param array $item - * @param bool $add_media + * @param bool $add_media true = Media is added to the body + * @param bool $for_display true = The share block is used for display purposes, false = used for connectors, transport to other systems, ... * @return string */ - public function createSharedBlockByArray(array $item, bool $add_media = false): string + public function createSharedBlockByArray(array $item, bool $add_media = false, bool $for_display = false): string { if ($item['network'] == Protocol::FEED) { return PageInfo::getFooterFromUrl($item['plink']); - } elseif (!in_array($item['network'] ?? '', Protocol::FEDERATED)) { + } elseif (!in_array($item['network'] ?? '', Protocol::FEDERATED) && !$for_display) { $item['guid'] = ''; $item['uri'] = ''; } @@ -685,7 +704,7 @@ class Item // If it is a reshared post then reformat it to avoid display problems with two share elements if (!empty($shared)) { - if (!empty($shared['guid']) && ($encapsulated_share = $this->createSharedPostByGuid($shared['guid'], true))) { + if (($item['network'] != Protocol::BLUESKY) && !empty($shared['guid']) && ($encapsulated_share = $this->createSharedPostByGuid($shared['guid'], true))) { if (!empty(BBCode::fetchShareAttributes($item['body']))) { $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $encapsulated_share, $item['body']); } else { @@ -864,9 +883,9 @@ class Item } $post['allow_cid'] = isset($request['contact_allow']) ? $this->aclFormatter->toString($request['contact_allow']) : $user['allow_cid'] ?? ''; - $post['allow_gid'] = isset($request['group_allow']) ? $this->aclFormatter->toString($request['group_allow']) : $user['allow_gid'] ?? ''; + $post['allow_gid'] = isset($request['circle_allow']) ? $this->aclFormatter->toString($request['circle_allow']) : $user['allow_gid'] ?? ''; $post['deny_cid'] = isset($request['contact_deny']) ? $this->aclFormatter->toString($request['contact_deny']) : $user['deny_cid'] ?? ''; - $post['deny_gid'] = isset($request['group_deny']) ? $this->aclFormatter->toString($request['group_deny']) : $user['deny_gid'] ?? ''; + $post['deny_gid'] = isset($request['circle_deny']) ? $this->aclFormatter->toString($request['circle_deny']) : $user['deny_gid'] ?? ''; $visibility = $request['visibility'] ?? ''; if ($visibility === 'public') { @@ -1012,7 +1031,7 @@ class Item $post['body'] = $this->bbCodeVideo->transform($post['body']); $post = $this->setObjectType($post); - // Personal notes must never be altered to a forum post. + // Personal notes must never be altered to a group post. if ($post['post-type'] != ItemModel::PT_PERSONAL_NOTE) { // Look for any tags and linkify them $post = $this->expandTags($post);