context->isLoggedIn()) $this->home($response, $request); else $this->landing($response, $request); } public function landing($response, $request): void { $users = $this->context->getUsers(); $config = $this->context->getConfig(); $counters = $this->context->getCounters(); if($config->getBoolean('social.embed_linked')) { $ldr = $config->getValues([ ['site.name:s', 'Misuzu'], 'site.url:s', 'site.ext_logo:s', 'social.linked:a' ]); $linkedData = [ 'name' => $ldr['site.name'], 'url' => $ldr['site.url'], 'logo' => $ldr['site.ext_logo'], 'same_as' => $ldr['social.linked'], ]; } else $linkedData = null; $featuredNews = $this->context->getNews()->getAllPosts( onlyFeatured: true, pagination: new Pagination(3) ); $stats = $counters->get(self::STATS); $onlineUserInfos = $users->getUsers( lastActiveInMinutes: 5, deleted: false, orderBy: 'random', ); // can also chat here, whoa $stats['users:online:recent'] = count($onlineUserInfos); // TODO: don't hardcode forum ids $featuredForums = $config->getArray('landing.forum_categories'); $popularTopics = []; $activeTopics = []; if(!empty($featuredForums)) { $getPopularTopics = DB::prepare( 'SELECT t.`topic_id`, c.`forum_id`, t.`topic_title`, c.`forum_icon`, t.`topic_count_views`' . ', (SELECT COUNT(*) FROM `msz_forum_posts` AS p WHERE p.`topic_id` = t.`topic_id` AND `post_deleted` IS NULL) AS `topic_count_posts`' . ' FROM `msz_forum_topics` AS t' . ' LEFT JOIN `msz_forum_categories` AS c ON c.`forum_id` = t.`forum_id`' . ' WHERE c.`forum_id` IN (' . implode(',', $featuredForums) . ') AND `topic_deleted` IS NULL AND `topic_locked` IS NULL' . ' ORDER BY (SELECT COUNT(*) FROM `msz_forum_posts` AS p WHERE p.`topic_id` = t.`topic_id` AND `post_deleted` IS NULL AND `post_created` > NOW() - INTERVAL 3 MONTH) DESC' )->stmt; $getPopularTopics->execute(); for($i = 0; $i < 10; ++$i) { $topicInfo = $getPopularTopics->fetchObject(); if(empty($topicInfo)) break; $popularTopics[] = $topicInfo; } $getActiveTopics = DB::prepare( 'SELECT t.`topic_id`, c.`forum_id`, t.`topic_title`, c.`forum_icon`, t.`topic_count_views`' . ', (SELECT COUNT(*) FROM `msz_forum_posts` AS p WHERE p.`topic_id` = t.`topic_id` AND `post_deleted` IS NULL) AS `topic_count_posts`' . ', (SELECT MAX(`post_id`) FROM `msz_forum_posts` AS p WHERE p.`topic_id` = t.`topic_id` AND `post_deleted` IS NULL) AS `latest_post_id`' . ' FROM `msz_forum_topics` AS t' . ' LEFT JOIN `msz_forum_categories` AS c ON c.`forum_id` = t.`forum_id`' . ' WHERE c.`forum_id` IN (' . implode(',', $featuredForums) . ') AND `topic_deleted` IS NULL AND `topic_locked` IS NULL' . ' ORDER BY `topic_bumped` DESC' )->stmt; $getActiveTopics->execute(); for($i = 0; $i < 10; ++$i) { $topicInfo = $getActiveTopics->fetchObject(); if(empty($topicInfo)) break; $activeTopics[] = $topicInfo; } } $response->setContent(Template::renderRaw('home.landing', [ 'statistics' => $stats, 'online_users' => $onlineUserInfos, 'featured_news' => $featuredNews, 'linked_data' => $linkedData, 'forum_popular' => $popularTopics, 'forum_active' => $activeTopics, ])); } public function home($response, $request): void { $news = $this->context->getNews(); $users = $this->context->getUsers(); $config = $this->context->getConfig(); $comments = $this->context->getComments(); $counters = $this->context->getCounters(); $featuredNews = []; $userInfos = []; $userColours = []; $categoryInfos = []; $featuredNewsInfos = $news->getAllPosts( onlyFeatured: true, pagination: new Pagination(5) ); foreach($featuredNewsInfos as $postInfo) { $userId = $postInfo->getUserId(); $categoryId = $postInfo->getCategoryId(); if(array_key_exists($userId, $userInfos)) { $userInfo = $userInfos[$userId]; $userColour = $userColours[$userId]; } else { try { $userInfo = $users->getUser($userId, 'id'); $userColour = $userColours[$userId] = $users->getUserColour($userInfo); } catch(RuntimeException $ex) { $userInfo = null; $userColour = $userColours[$userId] = null; } $userInfos[$userId] = $userInfo; } if(array_key_exists($categoryId, $categoryInfos)) $categoryInfo = $categoryInfos[$categoryId]; else $categoryInfos[$categoryId] = $categoryInfo = $news->getCategoryByPost($postInfo); $commentsCount = $postInfo->hasCommentsCategoryId() ? $comments->countPosts($postInfo->getCommentsCategoryId(), includeReplies: true) : 0; $featuredNews[] = [ 'post' => $postInfo, 'category' => $categoryInfo, 'user' => $userInfo, 'user_colour' => $userColour, 'comments_count' => $commentsCount, ]; } $stats = $counters->get(self::STATS); $changelog = $this->context->getChangelog()->getAllChanges(pagination: new Pagination(10)); $birthdays = []; $birthdayInfos = $users->getUsers(deleted: false, birthdate: DateTime::now(), orderBy: 'random'); foreach($birthdayInfos as $birthdayInfo) $birthdays[] = [ 'info' => $birthdayInfo, 'colour' => $users->getUserColour($birthdayInfo), ]; $newestMember = []; if(empty($birthdays)) { $newestMemberId = $config->getString('users.newest'); if(!empty($newestMemberId)) try { $newestMemberInfo = $users->getUser($newestMemberId, 'id'); $newestMember['info'] = $newestMemberInfo; $newestMember['colour'] = $users->getUserColour($newestMemberInfo); } catch(RuntimeException $ex) { $newestMember = []; $config->removeValues('users.newest'); } } $onlineUserInfos = $users->getUsers( lastActiveInMinutes: 5, deleted: false, orderBy: 'random', ); // today we cheat $stats['users:online:recent'] = count($onlineUserInfos); $response->setContent(Template::renderRaw('home.home', [ 'statistics' => $stats, 'newest_member' => $newestMember, 'online_users' => $onlineUserInfos, 'birthdays' => $birthdays, 'featured_changelog' => $changelog, 'featured_news' => $featuredNews, ])); } }