]> git.mxchange.org Git - friendica.git/blobdiff - src/Object/Post.php
Merge pull request #13635 from gudzpoz/emojis-please
[friendica.git] / src / Object / Post.php
index 2f68b1c53e1e951e7ecdb6e72ca354d8d6fb894c..e6aae2f5d559868cffb612f0665d03f5af11eca9 100644 (file)
@@ -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'),