diff --git a/public-legacy/forum/index.php b/public-legacy/forum/index.php deleted file mode 100644 index 6eec488..0000000 --- a/public-legacy/forum/index.php +++ /dev/null @@ -1,149 +0,0 @@ -authInfo->userInfo; -$categories = $msz->forumCtx->categories->getCategories(hidden: false, asTree: true); - -foreach($categories as $categoryId => $category) { - $perms = $msz->authInfo->getPerms('forum', $category->info); - if(!$perms->check(Perm::F_CATEGORY_LIST)) { - unset($categories[$categoryId]); - continue; - } - - $unread = false; - - if($category->info->mayHaveChildren) - foreach($category->children as $childId => $child) { - $childPerms = $msz->authInfo->getPerms('forum', $child->info); - if(!$childPerms->check(Perm::F_CATEGORY_LIST)) { - unset($category->children[$childId]); - continue; - } - - $childUnread = false; - - if($category->info->isListing) { - if($child->info->mayHaveChildren) { - foreach($child->children as $grandChildId => $grandChild) { - $grandChildPerms = $msz->authInfo->getPerms('forum', $grandChild->info); - if(!$grandChildPerms->check(Perm::F_CATEGORY_LIST)) { - unset($child->children[$grandChildId]); - continue; - } - - $grandChildUnread = false; - - if($grandChild->info->mayHaveTopics) { - $catIds = [$grandChild->info->id]; - foreach($grandChild->childIds as $greatGrandChildId) { - $greatGrandChildPerms = $msz->authInfo->getPerms('forum', $greatGrandChildId); - if($greatGrandChildPerms->check(Perm::F_CATEGORY_LIST)) - $catIds[] = $greatGrandChildId; - } - - $grandChildUnread = $msz->forumCtx->categories->checkCategoryUnread($catIds, $currentUser); - if($grandChildUnread) - $childUnread = true; - } - - $grandChild->perms = $grandChildPerms; - $grandChild->unread = $grandChildUnread; - } - } - - if($child->info->mayHaveChildren || $child->info->mayHaveTopics) { - $catIds = [$child->info->id]; - foreach($child->childIds as $grandChildId) { - $grandChildPerms = $msz->authInfo->getPerms('forum', $grandChildId); - if($grandChildPerms->check(Perm::F_CATEGORY_LIST)) - $catIds[] = $grandChildId; - } - - try { - $lastPostInfo = $msz->forumCtx->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); - } catch(RuntimeException $ex) { - $lastPostInfo = null; - } - - if($lastPostInfo !== null) { - $child->lastPost = new stdClass; - $child->lastPost->info = $lastPostInfo; - $child->lastPost->topicInfo = $msz->forumCtx->topics->getTopic(postInfo: $lastPostInfo); - - if($lastPostInfo->userId !== null) { - $child->lastPost->user = $msz->usersCtx->getUserInfo($lastPostInfo->userId); - $child->lastPost->colour = $msz->usersCtx->getUserColour($child->lastPost->user); - } - } - } - } - - if($child->info->mayHaveTopics && !$childUnread) { - $childUnread = $msz->forumCtx->categories->checkCategoryUnread($child->info, $currentUser); - if($childUnread) - $unread = true; - } - - $child->perms = $childPerms; - $child->unread = $childUnread; - } - - if($category->info->mayHaveTopics && !$unread) - $unread = $msz->forumCtx->categories->checkCategoryUnread($category->info, $currentUser); - - if(!$category->info->isListing) { - if(!array_key_exists('0', $categories)) { - $categories['0'] = $root = new stdClass; - $root->info = null; - $root->perms = 0; - $root->unread = false; - $root->colour = null; - $root->children = []; - } - - $categories['0']->children[$categoryId] = $category; - unset($categories[$categoryId]); - - if($category->info->mayHaveChildren || $category->info->mayHaveTopics) { - $catIds = [$category->info->id]; - foreach($category->childIds as $childId) { - $childPerms = $msz->authInfo->getPerms('forum', $childId); - if($childPerms->check(Perm::F_CATEGORY_LIST)) - $catIds[] = $childId; - } - - try { - $lastPostInfo = $msz->forumCtx->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); - } catch(RuntimeException $ex) { - $lastPostInfo = null; - } - - if($lastPostInfo !== null) { - $category->lastPost = new stdClass; - $category->lastPost->info = $lastPostInfo; - $category->lastPost->topicInfo = $msz->forumCtx->topics->getTopic(postInfo: $lastPostInfo); - - if($lastPostInfo->userId !== null) { - $category->lastPost->user = $msz->usersCtx->getUserInfo($lastPostInfo->userId); - $category->lastPost->colour = $msz->usersCtx->getUserColour($category->lastPost->user); - } - } - } - } - - $category->perms = $perms; - $category->unread = $unread; -} - -Template::render('forum.index', [ - 'forum_categories' => $categories, - 'forum_empty' => empty($categories), - 'forum_show_mark_as_read' => $currentUser !== null, -]); diff --git a/src/Forum/ForumCategoriesRoutes.php b/src/Forum/ForumCategoriesRoutes.php index eb4ac55..1a9c52e 100644 --- a/src/Forum/ForumCategoriesRoutes.php +++ b/src/Forum/ForumCategoriesRoutes.php @@ -1,21 +1,174 @@ forum->categories->getCategories(hidden: false, asTree: true); + + // Filtering! This really needs cleaning up... + foreach($cats as $catId => $category) { + $perms = $this->authInfo->getPerms('forum', $category->info); + + // Check if we're allowed to list this category, separate from viewing for some reason... + if(!$perms->check(Perm::F_CATEGORY_LIST)) { + unset($cats[$catId]); + continue; + } + + $unread = false; + + // This is not fully recursive, idk why... probably shove this into ForumContext? + if($category->info->mayHaveChildren && !$unread) + foreach($category->children as $childId => $child) { + $childPerms = $this->authInfo->getPerms('forum', $child->info); + if(!$childPerms->check(Perm::F_CATEGORY_LIST)) { + unset($category->children[$childId]); + continue; + } + + $childUnread = false; + + if($category->info->isListing) { + if($child->info->mayHaveChildren) { + foreach($child->children as $grandChildId => $grandChild) { + $grandChildPerms = $this->authInfo->getPerms('forum', $grandChild->info); + if(!$grandChildPerms->check(Perm::F_CATEGORY_LIST)) { + unset($child->children[$grandChildId]); + continue; + } + + $grandChildUnread = false; + + if($grandChild->info->mayHaveTopics) { + $catIds = [$grandChild->info->id]; + foreach($grandChild->childIds as $greatGrandChildId) { + $greatGrandChildPerms = $this->authInfo->getPerms('forum', $greatGrandChildId); + if($greatGrandChildPerms->check(Perm::F_CATEGORY_LIST)) + $catIds[] = $greatGrandChildId; + } + + $grandChildUnread = $this->forum->categories->checkCategoryUnread($catIds, $this->authInfo->userInfo); + if($grandChildUnread) + $childUnread = true; + } + + $grandChild->perms = $grandChildPerms; + $grandChild->unread = $grandChildUnread; + } + } + + if($child->info->mayHaveChildren || $child->info->mayHaveTopics) { + $catIds = [$child->info->id]; + foreach($child->childIds as $grandChildId) { + $grandChildPerms = $this->authInfo->getPerms('forum', $grandChildId); + if($grandChildPerms->check(Perm::F_CATEGORY_LIST)) + $catIds[] = $grandChildId; + } + + try { + $lastPostInfo = $this->forum->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); + } catch(RuntimeException $ex) { + $lastPostInfo = null; + } + + if($lastPostInfo !== null) { + $child->lastPost = new stdClass; + $child->lastPost->info = $lastPostInfo; + $child->lastPost->topicInfo = $this->forum->topics->getTopic(postInfo: $lastPostInfo); + + if($lastPostInfo->userId !== null) { + $child->lastPost->user = $this->usersCtx->getUserInfo($lastPostInfo->userId); + $child->lastPost->colour = $this->usersCtx->getUserColour($child->lastPost->user); + } + } + } + } + + if($child->info->mayHaveTopics && !$childUnread) { + $childUnread = $this->forum->categories->checkCategoryUnread($child->info, $this->authInfo->userInfo); + if($childUnread) + $unread = true; + } + + $child->perms = $childPerms; + $child->unread = $childUnread; + } + + // This is listed second despite being less expensive because the subcategories listed also need to show unread :sob: + if($category->info->mayHaveTopics) + $unread = $this->forum->categories->checkCategoryUnread($category->info, $this->authInfo->userInfo); + + // Create virtual root category if we need to list non-listing categories in root + if(!$category->info->isListing) { + if(!array_key_exists('0', $cats)) { + $cats['0'] = $root = new stdClass; + $root->info = null; + $root->perms = 0; + $root->unread = false; + $root->colour = null; + $root->children = []; + } + + $cats['0']->children[$categoryId] = $category; + unset($cats[$categoryId]); + + if($category->info->mayHaveChildren || $category->info->mayHaveTopics) { + $catIds = [$category->info->id]; + foreach($category->childIds as $childId) { + $childPerms = $this->authInfo->getPerms('forum', $childId); + if($childPerms->check(Perm::F_CATEGORY_LIST)) + $catIds[] = $childId; + } + + try { + $lastPostInfo = $this->forum->posts->getPost(categoryInfos: $catIds, getLast: true, deleted: false); + } catch(RuntimeException $ex) { + $lastPostInfo = null; + } + + if($lastPostInfo !== null) { + $category->lastPost = new stdClass; + $category->lastPost->info = $lastPostInfo; + $category->lastPost->topicInfo = $this->forum->topics->getTopic(postInfo: $lastPostInfo); + + if($lastPostInfo->userId !== null) { + $category->lastPost->user = $this->usersCtx->getUserInfo($lastPostInfo->userId); + $category->lastPost->colour = $this->usersCtx->getUserColour($category->lastPost->user); + } + } + } + } + + $category->perms = $perms; + $category->unread = $unread; + } + + return Template::renderRaw('forum.index', [ + 'forum_categories' => $cats, + 'forum_empty' => empty($cats), + 'forum_show_mark_as_read' => $this->authInfo->isLoggedIn, + ]); + } + #[HttpPost('/forum/mark-as-read')] #[UrlFormat('forum-mark-as-read', '/forum/mark-as-read', ['cat' => '', 'rec' => ''])] public function postMarkAsRead(HttpResponseBuilder $response, HttpRequest $request) { diff --git a/src/LegacyRoutes.php b/src/LegacyRoutes.php index 20306c5..bbb8f78 100644 --- a/src/LegacyRoutes.php +++ b/src/LegacyRoutes.php @@ -29,7 +29,6 @@ class LegacyRoutes implements RouteHandler, UrlSource { $urls->register('auth-two-factor', '/auth/twofactor.php', ['token' => '']); $urls->register('auth-revert', '/auth/revert.php', ['csrf' => '']); - $urls->register('forum-index', '/forum'); $urls->register('forum-leaderboard', '/forum/leaderboard.php', ['id' => '', 'mode' => '']); $urls->register('forum-topic-new', '/forum/posting.php', ['f' => '']); $urls->register('forum-reply-new', '/forum/posting.php', ['t' => '']); @@ -185,6 +184,11 @@ class LegacyRoutes implements RouteHandler, UrlSource { ), true); } + #[HttpGet('/forum/index.php')] + public function getForumIndexPHP(HttpResponseBuilder $response, HttpRequest $request): void { + $response->redirect($this->urls->format('forum-index'), true); + } + #[HttpGet('/forum/post.php')] public function getForumPostPHP(HttpResponseBuilder $response, HttpRequest $request): void { $response->redirect($this->urls->format('forum-post', [ diff --git a/src/MisuzuContext.php b/src/MisuzuContext.php index b7389ae..908dca7 100644 --- a/src/MisuzuContext.php +++ b/src/MisuzuContext.php @@ -188,6 +188,7 @@ class MisuzuContext { $routingCtx->register(new \Misuzu\Forum\ForumCategoriesRoutes( $this->forumCtx, + $this->usersCtx, $this->authInfo, )); $routingCtx->register(new \Misuzu\Forum\ForumTopicsRoutes(