]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Conversation.php
Merge pull request #13375 from MrPetovan/bug/empty-timeline
[friendica.git] / src / Content / Conversation.php
index b645ecf4b2e5d89312adaa1fb682d43ea5dc01f0..151a2bfc7e10a4c72e3254b23cf04e4488d727b7 100644 (file)
@@ -45,6 +45,8 @@ use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Object\Post as PostObject;
 use Friendica\Object\Thread;
 use Friendica\Protocol\Activity;
+use Friendica\User\Settings\Entity\UserGServer;
+use Friendica\User\Settings\Repository;
 use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Profiler;
@@ -90,22 +92,25 @@ class Conversation
        private $mode;
        /** @var IHandleUserSessions */
        private $session;
+       /** @var Repository\UserGServer */
+       private $userGServer;
 
-       public function __construct(LoggerInterface $logger, Profiler $profiler, Activity $activity, L10n $l10n, Item $item, Arguments $args, BaseURL $baseURL, IManageConfigValues $config, IManagePersonalConfigValues $pConfig, App\Page $page, App\Mode $mode, App $app, IHandleUserSessions $session)
+       public function __construct(Repository\UserGServer $userGServer, LoggerInterface $logger, Profiler $profiler, Activity $activity, L10n $l10n, Item $item, Arguments $args, BaseURL $baseURL, IManageConfigValues $config, IManagePersonalConfigValues $pConfig, App\Page $page, App\Mode $mode, App $app, IHandleUserSessions $session)
        {
-               $this->activity = $activity;
-               $this->item     = $item;
-               $this->config   = $config;
-               $this->mode     = $mode;
-               $this->baseURL  = $baseURL;
-               $this->profiler = $profiler;
-               $this->logger   = $logger;
-               $this->l10n     = $l10n;
-               $this->args     = $args;
-               $this->pConfig  = $pConfig;
-               $this->page     = $page;
-               $this->app      = $app;
-               $this->session  = $session;
+               $this->activity    = $activity;
+               $this->item        = $item;
+               $this->config      = $config;
+               $this->mode        = $mode;
+               $this->baseURL     = $baseURL;
+               $this->profiler    = $profiler;
+               $this->logger      = $logger;
+               $this->l10n        = $l10n;
+               $this->args        = $args;
+               $this->pConfig     = $pConfig;
+               $this->page        = $page;
+               $this->app         = $app;
+               $this->session     = $session;
+               $this->userGServer = $userGServer;
        }
 
        /**
@@ -459,8 +464,14 @@ class Conversation
 
                $live_update_div = '';
 
+               $userGservers = $this->userGServer->listIgnoredByUser($this->session->getLocalUserId());
+
+               $ignoredGsids = array_map(function (UserGServer $userGServer) {
+                       return $userGServer->gsid;
+               }, $userGservers->getArrayCopy());
+
                if ($mode === self::MODE_NETWORK) {
-                       $items = $this->addChildren($items, false, $order, $uid, $mode);
+                       $items = $this->addChildren($items, false, $order, $uid, $mode, $ignoredGsids);
                        if (!$update) {
                                /*
                                * The special div is needed for liveUpdate to kick in for this page.
@@ -486,7 +497,7 @@ class Conversation
                                        . "'; </script>\r\n";
                        }
                } elseif ($mode === self::MODE_PROFILE) {
-                       $items = $this->addChildren($items, false, $order, $uid, $mode);
+                       $items = $this->addChildren($items, false, $order, $uid, $mode, $ignoredGsids);
 
                        if (!$update) {
                                $tab = !empty($_GET['tab']) ? trim($_GET['tab']) : 'posts';
@@ -511,7 +522,7 @@ class Conversation
                                        . "; var netargs = '?f='; </script>\r\n";
                        }
                } elseif ($mode === self::MODE_DISPLAY) {
-                       $items = $this->addChildren($items, false, $order, $uid, $mode);
+                       $items = $this->addChildren($items, false, $order, $uid, $mode, $ignoredGsids);
 
                        if (!$update) {
                                $live_update_div = '<div id="live-display"></div>' . "\r\n"
@@ -519,7 +530,7 @@ class Conversation
                                        . "</script>";
                        }
                } elseif ($mode === self::MODE_COMMUNITY) {
-                       $items = $this->addChildren($items, true, $order, $uid, $mode);
+                       $items = $this->addChildren($items, true, $order, $uid, $mode, $ignoredGsids);
 
                        if (!$update) {
                                $live_update_div = '<div id="live-community"></div>' . "\r\n"
@@ -530,7 +541,7 @@ class Conversation
                                        . "'; </script>\r\n";
                        }
                } elseif ($mode === self::MODE_CONTACTS) {
-                       $items = $this->addChildren($items, false, $order, $uid, $mode);
+                       $items = $this->addChildren($items, false, $order, $uid, $mode, $ignoredGsids);
 
                        if (!$update) {
                                $live_update_div = '<div id="live-contact"></div>' . "\r\n"
@@ -589,6 +600,10 @@ class Conversation
         */
        public function getThreadList(array $items, string $mode, bool $preview, bool $pagedrop, string $formSecurityToken): array
        {
+               if (!$items) {
+                       return [];
+               }
+
                if (in_array($mode, [self::MODE_FILED, self::MODE_SEARCH, self::MODE_CONTACT_POSTS])) {
                        $threads = $this->getContextLessThreadList($items, $mode, $preview, $pagedrop, $formSecurityToken);
                } else {
@@ -808,13 +823,14 @@ class Conversation
         *
         * @param array  $parents       Parent items
         * @param bool   $block_authors
-        * @param bool   $order
+        * @param string $order         Either "received" or "commented"
         * @param int    $uid
-        * @param string $mode
+        * @param string $mode          One of self::MODE_*
+        * @param array  $ignoredGsids  List of ids of servers ignored by the user
         * @return array items with parents and comments
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws InternalServerErrorException
         */
-       private function addChildren(array $parents, bool $block_authors, string $order, int $uid, string $mode): array
+       private function addChildren(array $parents, bool $block_authors, string $order, int $uid, string $mode, array $ignoredGsids = []): array
        {
                $this->profiler->startRecording('rendering');
                if (count($parents) > 1) {
@@ -896,6 +912,13 @@ class Conversation
                                continue;
                        }
 
+                       if (in_array($row['author-gsid'], $ignoredGsids)
+                               || in_array($row['owner-gsid'], $ignoredGsids)
+                               || in_array($row['causer-gsid'], $ignoredGsids)
+                       ) {
+                               continue;
+                       }
+
                        if (($mode != self::MODE_CONTACTS) && !$row['origin']) {
                                $row['featured'] = false;
                        }
@@ -1377,8 +1400,6 @@ class Conversation
                                continue;
                        }
 
-                       $threadsid++;
-
                        // prevent private email from leaking.
                        if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
                                continue;
@@ -1460,6 +1481,7 @@ class Conversation
                                'received'             => $item['received'],
                                'created_date'         => $item['created'],
                                'uriid'                => $item['uri-id'],
+                               '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']),