X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FObject%2FPost.php;h=e6aae2f5d559868cffb612f0665d03f5af11eca9;hb=21227453e5354fc98df9f26dec088cd6aad59c44;hp=2f68b1c53e1e951e7ecdb6e72ca354d8d6fb894c;hpb=4c3f2441f7966fad09663090141b7ee4b17d7b91;p=friendica.git diff --git a/src/Object/Post.php b/src/Object/Post.php index 2f68b1c53e..e6aae2f5d5 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -31,16 +31,15 @@ use Friendica\Core\Renderer; use Friendica\DI; use Friendica\Model\Contact; use Friendica\Model\Item; -use Friendica\Model\Photo; use Friendica\Model\Post as PostModel; use Friendica\Model\Tag; use Friendica\Model\User; use Friendica\Protocol\Activity; use Friendica\Util\Crypto; use Friendica\Util\DateTimeFormat; -use Friendica\Util\Proxy; use Friendica\Util\Strings; use Friendica\Util\Temporal; +use GuzzleHttp\Psr7\Uri; use InvalidArgumentException; /** @@ -157,15 +156,16 @@ class Post /** * Get data in a form usable by a conversation template * - * @param array $conv_responses conversation responses - * @param string $formSecurityToken A security Token to avoid CSF attacks - * @param integer $thread_level default = 1 + * @param array $conv_responses conversation responses + * @param string $formSecurityToken A security Token to avoid CSF attacks + * @param integer $thread_level default = 1 + * @param array $thread_parent Array of parent guid and parent author names * * @return mixed The data requested on success, false on failure * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - public function getTemplateData(array $conv_responses, string $formSecurityToken, int $thread_level = 1) + public function getTemplateData(array $conv_responses, string $formSecurityToken, int $thread_level = 1, array $thread_parent = []) { $item = $this->getData(); $edited = false; @@ -248,38 +248,47 @@ class Post $pinned = DI::l10n()->t('Pinned item'); } - // Showing the one or the other text, depending upon if we can only hide it or really delete it. - $delete = $origin ? DI::l10n()->t('Delete globally') : DI::l10n()->t('Remove locally'); - - $drop = false; - $block = false; - $ignore = false; - $collapse = false; + $drop = false; + $block = false; + $ignore = false; + $collapse = false; + $report = false; + $ignoreServer = false; if (DI::userSession()->getLocalUserId()) { $drop = [ 'dropping' => $dropping, 'pagedrop' => $item['pagedrop'], 'select' => DI::l10n()->t('Select'), - 'delete' => $delete, + 'label' => $origin ? DI::l10n()->t('Delete globally') : DI::l10n()->t('Remove locally'), ]; } if (!$item['self'] && DI::userSession()->getLocalUserId()) { $block = [ 'blocking' => true, - 'block' => DI::l10n()->t('Block %s', $item['author-name']), + 'label' => DI::l10n()->t('Block %s', $item['author-name']), 'author_id' => $item['author-id'], ]; $ignore = [ 'ignoring' => true, - 'ignore' => DI::l10n()->t('Ignore %s', $item['author-name']), + 'label' => DI::l10n()->t('Ignore %s', $item['author-name']), 'author_id' => $item['author-id'], ]; $collapse = [ 'collapsing' => true, - 'collapse' => DI::l10n()->t('Collapse %s', $item['author-name']), + 'label' => DI::l10n()->t('Collapse %s', $item['author-name']), 'author_id' => $item['author-id'], ]; + $report = [ + 'label' => DI::l10n()->t('Report post'), + 'href' => 'moderation/report/create?' . http_build_query(['cid' => $item['author-id'], 'uri-ids' => [$item['uri-id']]]), + ]; + $authorBaseUri = new Uri($item['author-baseurl'] ?? ''); + if ($authorBaseUri->getHost() && !DI::baseUrl()->isLocalUrl($authorBaseUri)) { + $ignoreServer = [ + 'label' => DI::l10n()->t("Ignore %s server", $authorBaseUri->getHost()), + ]; + } } $filer = DI::userSession()->getLocalUserId() ? DI::l10n()->t('Save to folder') : false; @@ -311,7 +320,7 @@ class Post $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: ''); // process action responses - e.g. like/dislike/attend/agree/whatever - $response_verbs = ['like', 'dislike', 'announce']; + $response_verbs = ['like', 'dislike', 'announce', 'comment']; $isevent = false; $attend = []; @@ -326,14 +335,31 @@ class Post } } + $emojis = $this->getEmojis($item); + + $verbs = [ + 'like' => Activity::LIKE, + 'dislike' => Activity::DISLIKE, + 'announce' => Activity::ANNOUNCE, + 'comment' => Activity::POST, + 'attendyes' => Activity::ATTEND, + 'attendno' => Activity::ATTENDNO, + 'attendmaybe' => Activity::ATTENDMAYBE, + ]; + $reactions = $emojis; $responses = []; foreach ($response_verbs as $value => $verb) { $responses[$verb] = [ 'self' => $conv_responses[$verb][$item['uri-id']]['self'] ?? 0, 'output' => !empty($conv_responses[$verb][$item['uri-id']]) ? DI::conversation()->formatActivity($conv_responses[$verb][$item['uri-id']]['links'], $verb, $item['uri-id']) : '', + 'total' => $emojis[$verbs[$verb]]['total'] ?? '', + 'title' => $emojis[$verbs[$verb]]['title'] ?? '', ]; + unset($reactions[$verbs[$verb]]); } + unset($emojis[Activity::POST]); + /* * We should avoid doing this all the time, but it depends on the conversation mode * And the conv mode may change when we change the conv, or it changes its mode @@ -432,7 +458,8 @@ class Post $title = ''; } - if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'hide_dislike')) { + $hide_dislike = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'hide_dislike'); + if ($hide_dislike) { $buttons['dislike'] = false; } @@ -488,7 +515,15 @@ class Post $browsershare = null; } + $parent_guid = $thread_parent[$item['thr-parent-id']]['guid'] ?? ''; + $parent_username = $thread_parent[$item['thr-parent-id']]['name'] ?? ''; + $parent_unknown = $parent_username ? '' : DI::l10n()->t('Unknown parent'); + $tmp_item = [ + 'parentguid' => $parent_guid, + 'inreplyto' => DI::l10n()->t('in reply to %s', $parent_username), + 'isunknown' => $parent_unknown, + 'isunknown_label' => DI::l10n()->t('Parent is probably private or not federated.'), 'template' => $this->getTemplate(), 'type' => implode('', array_slice(explode('/', $item['verb']), -1)), 'comment_firstcollapsed' => false, @@ -554,11 +589,17 @@ class Post 'block' => $block, 'ignore_author' => $ignore, 'collapse' => $collapse, + 'report' => $report, + 'ignore_server' => $ignoreServer, 'vote' => $buttons, 'like_html' => $responses['like']['output'], 'dislike_html' => $responses['dislike']['output'], - 'emojis' => $this->getEmojis($item), + 'hide_dislike' => $hide_dislike, + 'emojis' => $emojis, + 'quoteshares' => $this->getQuoteShares($item['quoteshares']), + 'reactions' => $reactions, 'responses' => $responses, + 'legacy_activities' => DI::config()->get('system', 'legacy_activities'), 'switchcomment' => DI::l10n()->t('Comment'), 'reply_label' => DI::l10n()->t('Reply to %s', $profile_name), 'comment_html' => $comment_html, @@ -568,6 +609,7 @@ class Post 'wait' => DI::l10n()->t('Please wait'), 'thread_level' => $thread_level, 'edited' => $edited, + 'author_gsid' => $item['author-gsid'], 'network' => $item['network'], 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network'], $item['author-gsid']), 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link'], $item['author-gsid']), @@ -598,8 +640,10 @@ class Post $children = $this->getChildren(); $nb_children = count($children); if ($nb_children > 0) { + $thread_parent[$item['uri-id']] = ['guid' => $item['guid'], 'name' => $item['author-name']]; foreach ($children as $child) { - $result['children'][] = $child->getTemplateData($conv_responses, $formSecurityToken, $thread_level + 1); + $thread_parent[$child->getDataValue('uri-id')] = ['guid' => $child->getDataValue('guid'), 'name' => $child->getDataValue('author-name')]; + $result['children'][] = $child->getTemplateData($conv_responses, $formSecurityToken, $thread_level + 1, $thread_parent); } // Collapse @@ -640,6 +684,7 @@ class Post $emojis = []; foreach ($item['emojis'] as $index => $element) { + $key = $element['verb']; $actors = implode(', ', $element['title']); switch ($element['verb']) { case Activity::ANNOUNCE: @@ -677,18 +722,38 @@ class Post $icon = ['fa' => 'fa-times', 'icon' => 'icon-remove']; break; + case Activity::POST: + $title = DI::l10n()->t('Commented by: %s', $actors); + $icon = ['fa' => 'fa-commenting', 'icon' => 'icon-commenting']; + break; + default: $title = DI::l10n()->t('Reacted with %s by: %s', $element['emoji'], $actors); $icon = []; + $key = $element['emoji']; break; } - $emojis[$index] = ['emoji' => $element['emoji'], 'total' => $element['total'], 'title' => $title, 'icon' => $icon]; + $emojis[$key] = ['emoji' => $element['emoji'], 'total' => $element['total'], 'title' => $title, 'icon' => $icon]; } - ksort($emojis); return $emojis; } + /** + * Fetch quote shares + * + * @param array $quoteshares + * @return array + */ + private function getQuoteShares($quoteshares) + { + if (empty($quoteshares)) { + return []; + } + + return ['total' => $quoteshares['total'], 'title' => DI::l10n()->t('Quote shared by: %s', implode(', ', $quoteshares['title']))]; + } + /** * @return integer */ @@ -1086,6 +1151,7 @@ class Post '$edbold' => DI::l10n()->t('Bold'), '$editalic' => DI::l10n()->t('Italic'), '$eduline' => DI::l10n()->t('Underline'), + '$contentwarn' => DI::l10n()->t('Content Warning'), '$edquote' => DI::l10n()->t('Quote'), '$edemojis' => DI::l10n()->t('Add emojis'), '$edcode' => DI::l10n()->t('Code'),