]> git.mxchange.org Git - friendica.git/commitdiff
Moved functions
authorMichael <heluecht@pirati.ca>
Thu, 23 Sep 2021 21:29:36 +0000 (21:29 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 23 Sep 2021 21:29:36 +0000 (21:29 +0000)
src/Content/Conversation.php

index fbe88106a84c13be18724e42f8255d171108687d..1dca3216439b4930e07690d21061c2c4956188ff 100644 (file)
@@ -98,27 +98,300 @@ class Conversation
                $this->app      = $app;
        }
 
-       private function getBlocklist()
+       /**
+        * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.)
+        *
+        * Increments the count of each matching activity and adds a link to the author as needed.
+        *
+        * @param array  $activity
+        * @param array &$conv_responses (already created with builtin activity structure)
+        * @return void
+        * @throws ImagickException
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function builtinActivityPuller(array $activity, array &$conv_responses)
        {
-               if (!local_user()) {
-                       return [];
-               }
+               foreach ($conv_responses as $mode => $v) {
+                       $sparkle = '';
 
-               $str_blocked = str_replace(["\n", "\r"], ",", $this->pConfig->get(local_user(), 'system', 'blocked'));
-               if (empty($str_blocked)) {
-                       return [];
+                       switch ($mode) {
+                               case 'like':
+                                       $verb = Activity::LIKE;
+                                       break;
+                               case 'dislike':
+                                       $verb = Activity::DISLIKE;
+                                       break;
+                               case 'attendyes':
+                                       $verb = Activity::ATTEND;
+                                       break;
+                               case 'attendno':
+                                       $verb = Activity::ATTENDNO;
+                                       break;
+                               case 'attendmaybe':
+                                       $verb = Activity::ATTENDMAYBE;
+                                       break;
+                               case 'announce':
+                                       $verb = Activity::ANNOUNCE;
+                                       break;
+                               default:
+                                       return;
+                       }
+
+                       if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) {
+                               $author = [
+                                       'uid' => 0,
+                                       'id' => $activity['author-id'],
+                                       'network' => $activity['author-network'],
+                                       'url' => $activity['author-link']
+                               ];
+                               $url = Contact::magicLinkByContact($author);
+                               if (strpos($url, 'redir/') === 0) {
+                                       $sparkle = ' class="sparkle" ';
+                               }
+
+                               $link = '<a href="' . $url . '"' . $sparkle . '>' . htmlentities($activity['author-name']) . '</a>';
+
+                               if (empty($activity['thr-parent-id'])) {
+                                       $activity['thr-parent-id'] = $activity['parent-uri-id'];
+                               }
+
+                               // Skip when the causer of the parent is the same than the author of the announce
+                               if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'],
+                                       'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) {
+                                       continue;
+                               }
+
+                               if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) {
+                                       $conv_responses[$mode][$activity['thr-parent-id']] = [
+                                               'links' => [],
+                                               'self' => 0,
+                                       ];
+                               } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) {
+                                       // only list each unique author once
+                                       continue;
+                               }
+
+                               if (public_contact() == $activity['author-id']) {
+                                       $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1;
+                               }
+
+                               $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link;
+
+                               // there can only be one activity verb per item so if we found anything, we can stop looking
+                               return;
+                       }
                }
+       }
 
-               $blocklist = [];
+       /**
+        * Format the activity text for an item/photo/video
+        *
+        * @param array  $links = array of pre-linked names of actors
+        * @param string $verb  = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe'
+        * @param int    $id    = item id
+        * @return string formatted text
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        */
+       public function formatActivity(array $links, $verb, $id) {
+               $this->profiler->startRecording('rendering');
+               $o = '';
+               $expanded = '';
+               $phrase = '';
 
-               foreach (explode(',', $str_blocked) as $entry) {
-                       $cid = Contact::getIdForURL(trim($entry), 0, false);
-                       if (!empty($cid)) {
-                               $blocklist[] = $cid;
+               $total = count($links);
+               if ($total == 1) {
+                       $likers = $links[0];
+
+                       // Phrase if there is only one liker. In other cases it will be uses for the expanded
+                       // list which show all likers
+                       switch ($verb) {
+                               case 'like' :
+                                       $phrase = $this->l10n->t('%s likes this.', $likers);
+                                       break;
+                               case 'dislike' :
+                                       $phrase = $this->l10n->t('%s doesn\'t like this.', $likers);
+                                       break;
+                               case 'attendyes' :
+                                       $phrase = $this->l10n->t('%s attends.', $likers);
+                                       break;
+                               case 'attendno' :
+                                       $phrase = $this->l10n->t('%s doesn\'t attend.', $likers);
+                                       break;
+                               case 'attendmaybe' :
+                                       $phrase = $this->l10n->t('%s attends maybe.', $likers);
+                                       break;
+                               case 'announce' :
+                                       $phrase = $this->l10n->t('%s reshared this.', $likers);
+                                       break;
+                       }
+               } elseif ($total > 1) {
+                       if ($total < MAX_LIKERS) {
+                               $likers = implode(', ', array_slice($links, 0, -1));
+                               $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1];
+                       } else  {
+                               $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1));
+                               $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS);
                        }
+
+                       $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\"";
+
+                       $explikers = '';
+                       switch ($verb) {
+                               case 'like':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> like this', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s like this.', $likers);
+                                       break;
+                               case 'dislike':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> don\'t like this', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s don\'t like this.', $likers);
+                                       break;
+                               case 'attendyes':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> attend', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s attend.', $likers);
+                                       break;
+                               case 'attendno':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> don\'t attend', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s don\'t attend.', $likers);
+                                       break;
+                               case 'attendmaybe':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> attend maybe', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s attend maybe.', $likers);
+                                       break;
+                               case 'announce':
+                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> reshared this', $spanatts, $total);
+                                       $explikers = $this->l10n->t('%s reshared this.', $likers);
+                                       break;
+                       }
+
+                       $expanded .= "\t" . '<p class="wall-item-' . $verb . '-expanded" id="' . $verb . 'list-' . $id . '" style="display: none;" >' . $explikers . EOL . '</p>';
                }
 
-               return $blocklist;
+               $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [
+                       '$phrase' => $phrase,
+                       '$type' => $verb,
+                       '$id' => $id
+               ]);
+               $o .= $expanded;
+
+               $this->profiler->stopRecording();
+               return $o;
+       }
+
+       public function statusEditor(array $x = [], $notes_cid = 0, $popup = false)
+       {
+               $user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']);
+               if (empty($user['uid'])) {
+                       return '';
+               }
+
+               $this->profiler->startRecording('rendering');
+               $o = '';
+
+               $x['allow_location']   = $x['allow_location']   ?? $user['allow_location'];
+               $x['default_location'] = $x['default_location'] ?? $user['default-location'];
+               $x['nickname']         = $x['nickname']         ?? $user['nickname'];
+               $x['lockstate']        = $x['lockstate']        ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock';
+               $x['acl']              = $x['acl']              ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true);
+               $x['bang']             = $x['bang']             ?? '';
+               $x['visitor']          = $x['visitor']          ?? 'block';
+               $x['is_owner']         = $x['is_owner']         ?? true;
+               $x['profile_uid']      = $x['profile_uid']      ?? local_user();
+
+
+               $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : '';
+
+               $tpl = Renderer::getMarkupTemplate('jot-header.tpl');
+               $this->page['htmlhead'] .= Renderer::replaceMacros($tpl, [
+                       '$newpost'   => 'true',
+                       '$baseurl'   => $this->baseURL->get(true),
+                       '$geotag'    => $geotag,
+                       '$nickname'  => $x['nickname'],
+                       '$ispublic'  => $this->l10n->t('Visible to <strong>everybody</strong>'),
+                       '$linkurl'   => $this->l10n->t('Please enter a image/video/audio/webpage URL:'),
+                       '$term'      => $this->l10n->t('Tag term:'),
+                       '$fileas'    => $this->l10n->t('Save to Folder:'),
+                       '$whereareu' => $this->l10n->t('Where are you right now?'),
+                       '$delitems'  => $this->l10n->t("Delete item\x28s\x29?"),
+                       '$is_mobile' => $this->mode->isMobile(),
+               ]);
+
+               $jotplugins = '';
+               Hook::callAll('jot_tool', $jotplugins);
+
+               $tpl = Renderer::getMarkupTemplate("jot.tpl");
+
+               $o .= Renderer::replaceMacros($tpl, [
+                       '$new_post' => $this->l10n->t('New Post'),
+                       '$return_path'  => $this->args->getQueryString(),
+                       '$action'       => 'item',
+                       '$share'        => ($x['button'] ?? '') ?: $this->l10n->t('Share'),
+                       '$loading'      => $this->l10n->t('Loading...'),
+                       '$upload'       => $this->l10n->t('Upload photo'),
+                       '$shortupload'  => $this->l10n->t('upload photo'),
+                       '$attach'       => $this->l10n->t('Attach file'),
+                       '$shortattach'  => $this->l10n->t('attach file'),
+                       '$edbold'       => $this->l10n->t('Bold'),
+                       '$editalic'     => $this->l10n->t('Italic'),
+                       '$eduline'      => $this->l10n->t('Underline'),
+                       '$edquote'      => $this->l10n->t('Quote'),
+                       '$edcode'       => $this->l10n->t('Code'),
+                       '$edimg'        => $this->l10n->t('Image'),
+                       '$edurl'        => $this->l10n->t('Link'),
+                       '$edattach'     => $this->l10n->t('Link or Media'),
+                       '$edvideo'      => $this->l10n->t('Video'),
+                       '$setloc'       => $this->l10n->t('Set your location'),
+                       '$shortsetloc'  => $this->l10n->t('set location'),
+                       '$noloc'        => $this->l10n->t('Clear browser location'),
+                       '$shortnoloc'   => $this->l10n->t('clear location'),
+                       '$title'        => $x['title'] ?? '',
+                       '$placeholdertitle' => $this->l10n->t('Set title'),
+                       '$category'     => $x['category'] ?? '',
+                       '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '',
+                       '$scheduled_at' => Temporal::getDateTimeField(
+                               new \DateTime(),
+                               new \DateTime('now + 6 months'),
+                               null,
+                               $this->l10n->t('Scheduled at'),
+                               'scheduled_at'
+                       ),
+                       '$wait'         => $this->l10n->t('Please wait'),
+                       '$permset'      => $this->l10n->t('Permission settings'),
+                       '$shortpermset' => $this->l10n->t('Permissions'),
+                       '$wall'         => $notes_cid ? 0 : 1,
+                       '$posttype'     => $notes_cid ? ItemModel::PT_PERSONAL_NOTE : ItemModel::PT_ARTICLE,
+                       '$content'      => $x['content'] ?? '',
+                       '$post_id'      => $x['post_id'] ?? '',
+                       '$baseurl'      => $this->baseURL->get(true),
+                       '$defloc'       => $x['default_location'],
+                       '$visitor'      => $x['visitor'],
+                       '$pvisit'       => $notes_cid ? 'none' : $x['visitor'],
+                       '$public'       => $this->l10n->t('Public post'),
+                       '$lockstate'    => $x['lockstate'],
+                       '$bang'         => $x['bang'],
+                       '$profile_uid'  => $x['profile_uid'],
+                       '$preview'      => $this->l10n->t('Preview'),
+                       '$jotplugins'   => $jotplugins,
+                       '$notes_cid'    => $notes_cid,
+                       '$cancel'       => $this->l10n->t('Cancel'),
+                       '$rand_num'     => Crypto::randomDigits(12),
+
+                       // ACL permissions box
+                       '$acl'           => $x['acl'],
+
+                       //jot nav tab (used in some themes)
+                       '$message' => $this->l10n->t('Message'),
+                       '$browser' => $this->l10n->t('Browser'),
+
+                       '$compose_link_title' => $this->l10n->t('Open Compose page'),
+               ]);
+
+
+               if ($popup == true) {
+                       $o = '<div id="jot-popup" style="display: none;">' . $o . '</div>';
+               }
+
+               $this->profiler->stopRecording();
+               return $o;
        }
 
        /**
@@ -491,6 +764,29 @@ class Conversation
                return $o;
        }
 
+       private function getBlocklist()
+       {
+               if (!local_user()) {
+                       return [];
+               }
+
+               $str_blocked = str_replace(["\n", "\r"], ",", $this->pConfig->get(local_user(), 'system', 'blocked'));
+               if (empty($str_blocked)) {
+                       return [];
+               }
+
+               $blocklist = [];
+
+               foreach (explode(',', $str_blocked) as $entry) {
+                       $cid = Contact::getIdForURL(trim($entry), 0, false);
+                       if (!empty($cid)) {
+                               $blocklist[] = $cid;
+                       }
+               }
+
+               return $blocklist;
+       }
+
        /**
         * Adds some information (Causer, post reason, direction) to the fetched post row.
         *
@@ -564,396 +860,100 @@ class Conversation
                                $row['direction'] = ['direction' => 9, 'title' => $this->l10n->t('Global')];
                                break;
                        case ItemModel::PR_RELAY:
-                               $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Relayed') : $this->l10n->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
-                               break;
-                       case ItemModel::PR_FETCHED:
-                               $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Fetched') : $this->l10n->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
-                               break;
-               }
-
-               $this->profiler->stopRecording();
-               return $row;
-       }
-
-       /**
-        * Add comments to top level entries that had been fetched before
-        *
-        * The system will fetch the comments for the local user whenever possible.
-        * This behaviour is currently needed to allow commenting on Friendica posts.
-        *
-        * @param array $parents Parent items
-        *
-        * @param       $block_authors
-        * @param       $order
-        * @param       $uid
-        * @return array items with parents and comments
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       private function addChildren(array $parents, $block_authors, $order, $uid) {
-               $this->profiler->startRecording('rendering');
-               if (count($parents) > 1) {
-                       $max_comments = $this->config->get('system', 'max_comments', 100);
-               } else {
-                       $max_comments = $this->config->get('system', 'max_display_comments', 1000);
-               }
-
-               $params = ['order' => ['uri-id' => true, 'uid' => true]];
-
-               $activities      = [];
-               $uriids          = [];
-               $commentcounter  = [];
-               $activitycounter = [];
-
-               foreach ($parents AS $parent) {
-                       if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) {
-                               $uriid = $parent['thr-parent-id'];
-                               if (!empty($parent['author-id'])) {
-                                       $activities[$uriid] = ['causer-id' => $parent['author-id']];
-                                       foreach (['commented', 'received', 'created'] as $orderfields) {
-                                               if (!empty($parent[$orderfields])) {
-                                                       $activities[$uriid][$orderfields] = $parent[$orderfields];
-                                               }
-                                       }
-                               }
-                       } else {
-                               $uriid = $parent['uri-id'];
-                       }
-                       $uriids[] = $uriid;
-
-                       $commentcounter[$uriid]  = 0;
-                       $activitycounter[$uriid] = 0;
-               }
-
-               $condition = ['parent-uri-id' => $uriids];
-               if ($block_authors) {
-                       $condition['author-hidden'] = false;
-               }
-
-               $condition = DBA::mergeConditions($condition,
-                       ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]);
-
-               $thread_items = Post::selectForUser(local_user(), array_merge(ItemModel::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params);
-
-               $items = [];
-
-               while ($row = Post::fetch($thread_items)) {
-                       if (!empty($items[$row['uri-id']]) && ($row['uid'] == 0)) {
-                               continue;
-                       }
-
-                       if ($max_comments > 0) {
-                               if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) {
-                                       continue;
-                               }
-                               if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) {
-                                       continue;
-                               }
-                       }
-                       $items[$row['uri-id']] = $this->addRowInformation($row, $activities[$row['uri-id']] ?? []);
-               }
-
-               DBA::close($thread_items);
-
-               $items = $this->convSort($items, $order);
-
-               $this->profiler->stopRecording();
-               return $items;
-       }
-
-       /**
-        * Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.)
-        *
-        * Increments the count of each matching activity and adds a link to the author as needed.
-        *
-        * @param array  $activity
-        * @param array &$conv_responses (already created with builtin activity structure)
-        * @return void
-        * @throws ImagickException
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public function builtinActivityPuller(array $activity, array &$conv_responses)
-       {
-               foreach ($conv_responses as $mode => $v) {
-                       $sparkle = '';
-
-                       switch ($mode) {
-                               case 'like':
-                                       $verb = Activity::LIKE;
-                                       break;
-                               case 'dislike':
-                                       $verb = Activity::DISLIKE;
-                                       break;
-                               case 'attendyes':
-                                       $verb = Activity::ATTEND;
-                                       break;
-                               case 'attendno':
-                                       $verb = Activity::ATTENDNO;
-                                       break;
-                               case 'attendmaybe':
-                                       $verb = Activity::ATTENDMAYBE;
-                                       break;
-                               case 'announce':
-                                       $verb = Activity::ANNOUNCE;
-                                       break;
-                               default:
-                                       return;
-                       }
-
-                       if (!empty($activity['verb']) && $this->activity->match($activity['verb'], $verb) && ($activity['gravity'] != GRAVITY_PARENT)) {
-                               $author = [
-                                       'uid' => 0,
-                                       'id' => $activity['author-id'],
-                                       'network' => $activity['author-network'],
-                                       'url' => $activity['author-link']
-                               ];
-                               $url = Contact::magicLinkByContact($author);
-                               if (strpos($url, 'redir/') === 0) {
-                                       $sparkle = ' class="sparkle" ';
-                               }
-
-                               $link = '<a href="' . $url . '"' . $sparkle . '>' . htmlentities($activity['author-name']) . '</a>';
-
-                               if (empty($activity['thr-parent-id'])) {
-                                       $activity['thr-parent-id'] = $activity['parent-uri-id'];
-                               }
-
-                               // Skip when the causer of the parent is the same than the author of the announce
-                               if (($verb == Activity::ANNOUNCE) && Post::exists(['uri-id' => $activity['thr-parent-id'],
-                                       'uid' => $activity['uid'], 'causer-id' => $activity['author-id'], 'gravity' => GRAVITY_PARENT])) {
-                                       continue;
-                               }
-
-                               if (!isset($conv_responses[$mode][$activity['thr-parent-id']])) {
-                                       $conv_responses[$mode][$activity['thr-parent-id']] = [
-                                               'links' => [],
-                                               'self' => 0,
-                                       ];
-                               } elseif (in_array($link, $conv_responses[$mode][$activity['thr-parent-id']]['links'])) {
-                                       // only list each unique author once
-                                       continue;
-                               }
-
-                               if (public_contact() == $activity['author-id']) {
-                                       $conv_responses[$mode][$activity['thr-parent-id']]['self'] = 1;
-                               }
-
-                               $conv_responses[$mode][$activity['thr-parent-id']]['links'][] = $link;
-
-                               // there can only be one activity verb per item so if we found anything, we can stop looking
-                               return;
-                       }
+                               $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Relayed') : $this->l10n->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
+                               break;
+                       case ItemModel::PR_FETCHED:
+                               $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? $this->l10n->t('Fetched') : $this->l10n->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
+                               break;
                }
+
+               $this->profiler->stopRecording();
+               return $row;
        }
 
        /**
-        * Format the activity text for an item/photo/video
+        * Add comments to top level entries that had been fetched before
         *
-        * @param array  $links = array of pre-linked names of actors
-        * @param string $verb  = one of 'like, 'dislike', 'attendyes', 'attendno', 'attendmaybe'
-        * @param int    $id    = item id
-        * @return string formatted text
+        * The system will fetch the comments for the local user whenever possible.
+        * This behaviour is currently needed to allow commenting on Friendica posts.
+        *
+        * @param array $parents Parent items
+        *
+        * @param       $block_authors
+        * @param       $order
+        * @param       $uid
+        * @return array items with parents and comments
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function formatActivity(array $links, $verb, $id) {
+       private function addChildren(array $parents, $block_authors, $order, $uid) {
                $this->profiler->startRecording('rendering');
-               $o = '';
-               $expanded = '';
-               $phrase = '';
-
-               $total = count($links);
-               if ($total == 1) {
-                       $likers = $links[0];
+               if (count($parents) > 1) {
+                       $max_comments = $this->config->get('system', 'max_comments', 100);
+               } else {
+                       $max_comments = $this->config->get('system', 'max_display_comments', 1000);
+               }
 
-                       // Phrase if there is only one liker. In other cases it will be uses for the expanded
-                       // list which show all likers
-                       switch ($verb) {
-                               case 'like' :
-                                       $phrase = $this->l10n->t('%s likes this.', $likers);
-                                       break;
-                               case 'dislike' :
-                                       $phrase = $this->l10n->t('%s doesn\'t like this.', $likers);
-                                       break;
-                               case 'attendyes' :
-                                       $phrase = $this->l10n->t('%s attends.', $likers);
-                                       break;
-                               case 'attendno' :
-                                       $phrase = $this->l10n->t('%s doesn\'t attend.', $likers);
-                                       break;
-                               case 'attendmaybe' :
-                                       $phrase = $this->l10n->t('%s attends maybe.', $likers);
-                                       break;
-                               case 'announce' :
-                                       $phrase = $this->l10n->t('%s reshared this.', $likers);
-                                       break;
-                       }
-               } elseif ($total > 1) {
-                       if ($total < MAX_LIKERS) {
-                               $likers = implode(', ', array_slice($links, 0, -1));
-                               $likers .= ' ' . $this->l10n->t('and') . ' ' . $links[count($links)-1];
-                       } else  {
-                               $likers = implode(', ', array_slice($links, 0, MAX_LIKERS - 1));
-                               $likers .= ' ' . $this->l10n->t('and %d other people', $total - MAX_LIKERS);
-                       }
+               $params = ['order' => ['uri-id' => true, 'uid' => true]];
 
-                       $spanatts = "class=\"fakelink\" onclick=\"openClose('{$verb}list-$id');\"";
+               $activities      = [];
+               $uriids          = [];
+               $commentcounter  = [];
+               $activitycounter = [];
 
-                       $explikers = '';
-                       switch ($verb) {
-                               case 'like':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> like this', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s like this.', $likers);
-                                       break;
-                               case 'dislike':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> don\'t like this', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s don\'t like this.', $likers);
-                                       break;
-                               case 'attendyes':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> attend', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s attend.', $likers);
-                                       break;
-                               case 'attendno':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> don\'t attend', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s don\'t attend.', $likers);
-                                       break;
-                               case 'attendmaybe':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> attend maybe', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s attend maybe.', $likers);
-                                       break;
-                               case 'announce':
-                                       $phrase = $this->l10n->t('<span  %1$s>%2$d people</span> reshared this', $spanatts, $total);
-                                       $explikers = $this->l10n->t('%s reshared this.', $likers);
-                                       break;
+               foreach ($parents AS $parent) {
+                       if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) {
+                               $uriid = $parent['thr-parent-id'];
+                               if (!empty($parent['author-id'])) {
+                                       $activities[$uriid] = ['causer-id' => $parent['author-id']];
+                                       foreach (['commented', 'received', 'created'] as $orderfields) {
+                                               if (!empty($parent[$orderfields])) {
+                                                       $activities[$uriid][$orderfields] = $parent[$orderfields];
+                                               }
+                                       }
+                               }
+                       } else {
+                               $uriid = $parent['uri-id'];
                        }
+                       $uriids[] = $uriid;
 
-                       $expanded .= "\t" . '<p class="wall-item-' . $verb . '-expanded" id="' . $verb . 'list-' . $id . '" style="display: none;" >' . $explikers . EOL . '</p>';
+                       $commentcounter[$uriid]  = 0;
+                       $activitycounter[$uriid] = 0;
                }
 
-               $o .= Renderer::replaceMacros(Renderer::getMarkupTemplate('voting_fakelink.tpl'), [
-                       '$phrase' => $phrase,
-                       '$type' => $verb,
-                       '$id' => $id
-               ]);
-               $o .= $expanded;
-
-               $this->profiler->stopRecording();
-               return $o;
-       }
-
-       public function statusEditor(array $x = [], $notes_cid = 0, $popup = false)
-       {
-               $user = User::getById($this->app->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']);
-               if (empty($user['uid'])) {
-                       return '';
+               $condition = ['parent-uri-id' => $uriids];
+               if ($block_authors) {
+                       $condition['author-hidden'] = false;
                }
 
-               $this->profiler->startRecording('rendering');
-               $o = '';
-
-               $x['allow_location']   = $x['allow_location']   ?? $user['allow_location'];
-               $x['default_location'] = $x['default_location'] ?? $user['default-location'];
-               $x['nickname']         = $x['nickname']         ?? $user['nickname'];
-               $x['lockstate']        = $x['lockstate']        ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock';
-               $x['acl']              = $x['acl']              ?? ACL::getFullSelectorHTML($this->page, $user['uid'], true);
-               $x['bang']             = $x['bang']             ?? '';
-               $x['visitor']          = $x['visitor']          ?? 'block';
-               $x['is_owner']         = $x['is_owner']         ?? true;
-               $x['profile_uid']      = $x['profile_uid']      ?? local_user();
-
-
-               $geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : '';
-
-               $tpl = Renderer::getMarkupTemplate('jot-header.tpl');
-               $this->page['htmlhead'] .= Renderer::replaceMacros($tpl, [
-                       '$newpost'   => 'true',
-                       '$baseurl'   => $this->baseURL->get(true),
-                       '$geotag'    => $geotag,
-                       '$nickname'  => $x['nickname'],
-                       '$ispublic'  => $this->l10n->t('Visible to <strong>everybody</strong>'),
-                       '$linkurl'   => $this->l10n->t('Please enter a image/video/audio/webpage URL:'),
-                       '$term'      => $this->l10n->t('Tag term:'),
-                       '$fileas'    => $this->l10n->t('Save to Folder:'),
-                       '$whereareu' => $this->l10n->t('Where are you right now?'),
-                       '$delitems'  => $this->l10n->t("Delete item\x28s\x29?"),
-                       '$is_mobile' => $this->mode->isMobile(),
-               ]);
-
-               $jotplugins = '';
-               Hook::callAll('jot_tool', $jotplugins);
-
-               $tpl = Renderer::getMarkupTemplate("jot.tpl");
+               $condition = DBA::mergeConditions($condition,
+                       ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]);
 
-               $o .= Renderer::replaceMacros($tpl, [
-                       '$new_post' => $this->l10n->t('New Post'),
-                       '$return_path'  => $this->args->getQueryString(),
-                       '$action'       => 'item',
-                       '$share'        => ($x['button'] ?? '') ?: $this->l10n->t('Share'),
-                       '$loading'      => $this->l10n->t('Loading...'),
-                       '$upload'       => $this->l10n->t('Upload photo'),
-                       '$shortupload'  => $this->l10n->t('upload photo'),
-                       '$attach'       => $this->l10n->t('Attach file'),
-                       '$shortattach'  => $this->l10n->t('attach file'),
-                       '$edbold'       => $this->l10n->t('Bold'),
-                       '$editalic'     => $this->l10n->t('Italic'),
-                       '$eduline'      => $this->l10n->t('Underline'),
-                       '$edquote'      => $this->l10n->t('Quote'),
-                       '$edcode'       => $this->l10n->t('Code'),
-                       '$edimg'        => $this->l10n->t('Image'),
-                       '$edurl'        => $this->l10n->t('Link'),
-                       '$edattach'     => $this->l10n->t('Link or Media'),
-                       '$edvideo'      => $this->l10n->t('Video'),
-                       '$setloc'       => $this->l10n->t('Set your location'),
-                       '$shortsetloc'  => $this->l10n->t('set location'),
-                       '$noloc'        => $this->l10n->t('Clear browser location'),
-                       '$shortnoloc'   => $this->l10n->t('clear location'),
-                       '$title'        => $x['title'] ?? '',
-                       '$placeholdertitle' => $this->l10n->t('Set title'),
-                       '$category'     => $x['category'] ?? '',
-                       '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? $this->l10n->t("Categories \x28comma-separated list\x29") : '',
-                       '$scheduled_at' => Temporal::getDateTimeField(
-                               new \DateTime(),
-                               new \DateTime('now + 6 months'),
-                               null,
-                               $this->l10n->t('Scheduled at'),
-                               'scheduled_at'
-                       ),
-                       '$wait'         => $this->l10n->t('Please wait'),
-                       '$permset'      => $this->l10n->t('Permission settings'),
-                       '$shortpermset' => $this->l10n->t('Permissions'),
-                       '$wall'         => $notes_cid ? 0 : 1,
-                       '$posttype'     => $notes_cid ? ItemModel::PT_PERSONAL_NOTE : ItemModel::PT_ARTICLE,
-                       '$content'      => $x['content'] ?? '',
-                       '$post_id'      => $x['post_id'] ?? '',
-                       '$baseurl'      => $this->baseURL->get(true),
-                       '$defloc'       => $x['default_location'],
-                       '$visitor'      => $x['visitor'],
-                       '$pvisit'       => $notes_cid ? 'none' : $x['visitor'],
-                       '$public'       => $this->l10n->t('Public post'),
-                       '$lockstate'    => $x['lockstate'],
-                       '$bang'         => $x['bang'],
-                       '$profile_uid'  => $x['profile_uid'],
-                       '$preview'      => $this->l10n->t('Preview'),
-                       '$jotplugins'   => $jotplugins,
-                       '$notes_cid'    => $notes_cid,
-                       '$cancel'       => $this->l10n->t('Cancel'),
-                       '$rand_num'     => Crypto::randomDigits(12),
+               $thread_items = Post::selectForUser(local_user(), array_merge(ItemModel::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params);
 
-                       // ACL permissions box
-                       '$acl'           => $x['acl'],
+               $items = [];
 
-                       //jot nav tab (used in some themes)
-                       '$message' => $this->l10n->t('Message'),
-                       '$browser' => $this->l10n->t('Browser'),
+               while ($row = Post::fetch($thread_items)) {
+                       if (!empty($items[$row['uri-id']]) && ($row['uid'] == 0)) {
+                               continue;
+                       }
 
-                       '$compose_link_title' => $this->l10n->t('Open Compose page'),
-               ]);
+                       if ($max_comments > 0) {
+                               if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) {
+                                       continue;
+                               }
+                               if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) {
+                                       continue;
+                               }
+                       }
+                       $items[$row['uri-id']] = $this->addRowInformation($row, $activities[$row['uri-id']] ?? []);
+               }
 
+               DBA::close($thread_items);
 
-               if ($popup == true) {
-                       $o = '<div id="jot-popup" style="display: none;">' . $o . '</div>';
-               }
+               $items = $this->convSort($items, $order);
 
                $this->profiler->stopRecording();
-               return $o;
+               return $items;
        }
 
        /**