misuzu/public-legacy/forum/index.php

192 lines
7.4 KiB
PHP
Raw Normal View History

2022-09-13 13:14:49 +00:00
<?php
namespace Misuzu;
2023-08-28 01:17:34 +00:00
use stdClass;
use RuntimeException;
$forumCtx = $msz->getForumContext();
$forumCategories = $forumCtx->getCategories();
$forumTopics = $forumCtx->getTopics();
$forumPosts = $forumCtx->getPosts();
$usersCtx = $msz->getUsersContext();
2023-08-28 01:17:34 +00:00
$mode = (string)filter_input(INPUT_GET, 'm');
2022-09-13 13:14:49 +00:00
$authInfo = $msz->getAuthInfo();
$currentUser = $authInfo->getUserInfo();
$currentUserId = $currentUser === null ? '0' : $currentUser->getId();
2022-09-13 13:14:49 +00:00
2023-08-28 01:17:34 +00:00
if($mode === 'mark') {
if(!$authInfo->isLoggedIn())
Template::throwError(403);
2023-08-28 01:17:34 +00:00
$categoryId = filter_input(INPUT_GET, 'f', FILTER_SANITIZE_NUMBER_INT);
2023-08-28 01:17:34 +00:00
if($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) {
$categoryInfos = $categoryId === null
? $forumCategories->getCategories()
: $forumCategories->getCategoryChildren(parentInfo: $categoryId, includeSelf: true);
2023-08-28 01:17:34 +00:00
foreach($categoryInfos as $categoryInfo) {
$perms = $authInfo->getPerms('forum', $categoryInfo);
2023-08-30 22:37:21 +00:00
if($perms->check(Perm::F_CATEGORY_LIST))
$forumCategories->updateUserReadCategory($userInfo, $categoryInfo);
}
2023-09-08 20:40:48 +00:00
Tools::redirect($msz->getURLs()->format($categoryId ? 'forum-category' : 'forum-index', ['forum' => $categoryId]));
2023-08-28 01:17:34 +00:00
return;
}
Template::render('confirm', [
'title' => 'Mark forum as read',
'message' => 'Are you sure you want to mark ' . ($categoryId < 1 ? 'the entire' : 'this') . ' forum as read?',
2023-09-08 20:40:48 +00:00
'return' => $msz->getURLs()->format($categoryId ? 'forum-category' : 'forum-index', ['forum' => $categoryId]),
2023-08-28 01:17:34 +00:00
'params' => [
'forum' => $categoryId,
]
]);
return;
}
if($mode !== '')
Template::throwError(404);
2023-08-28 01:17:34 +00:00
$categories = $forumCategories->getCategories(hidden: false, asTree: true);
2023-08-28 01:17:34 +00:00
foreach($categories as $categoryId => $category) {
$perms = $authInfo->getPerms('forum', $category->info);
2023-08-30 22:37:21 +00:00
if(!$perms->check(Perm::F_CATEGORY_LIST)) {
2023-08-28 01:17:34 +00:00
unset($categories[$categoryId]);
continue;
}
$unread = false;
if($category->info->mayHaveChildren())
foreach($category->children as $childId => $child) {
$childPerms = $authInfo->getPerms('forum', $child->info);
2023-08-30 22:37:21 +00:00
if(!$childPerms->check(Perm::F_CATEGORY_LIST)) {
2023-08-28 01:17:34 +00:00
unset($category->children[$childId]);
continue;
}
$childUnread = false;
if($category->info->isListing()) {
if($child->info->mayHaveChildren()) {
foreach($child->children as $grandChildId => $grandChild) {
$grandChildPerms = $authInfo->getPerms('forum', $grandChild->info);
2023-08-30 22:37:21 +00:00
if(!$grandChildPerms->check(Perm::F_CATEGORY_LIST)) {
2023-08-28 01:17:34 +00:00
unset($child->children[$grandChildId]);
continue;
}
$grandChildUnread = false;
if($grandChild->info->mayHaveTopics()) {
$catIds = [$grandChild->info->getId()];
foreach($grandChild->childIds as $greatGrandChildId) {
$greatGrandChildPerms = $authInfo->getPerms('forum', $greatGrandChildId);
2023-08-30 22:37:21 +00:00
if($greatGrandChildPerms->check(Perm::F_CATEGORY_LIST))
2023-08-28 01:17:34 +00:00
$catIds[] = $greatGrandChildId;
}
$grandChildUnread = $forumCategories->checkCategoryUnread($catIds, $currentUser);
2023-08-28 01:17:34 +00:00
if($grandChildUnread)
$childUnread = true;
}
$grandChild->perms = $grandChildPerms;
$grandChild->unread = $grandChildUnread;
}
}
if($child->info->mayHaveChildren() || $child->info->mayHaveTopics()) {
$catIds = [$child->info->getId()];
foreach($child->childIds as $grandChildId) {
$grandChildPerms = $authInfo->getPerms('forum', $grandChildId);
2023-08-30 22:37:21 +00:00
if($grandChildPerms->check(Perm::F_CATEGORY_LIST))
2023-08-28 01:17:34 +00:00
$catIds[] = $grandChildId;
}
try {
$lastPostInfo = $forumPosts->getPost(categoryInfos: $catIds, getLast: true, deleted: false);
2023-08-28 01:17:34 +00:00
} catch(RuntimeException $ex) {
$lastPostInfo = null;
}
if($lastPostInfo !== null) {
$child->lastPost = new stdClass;
$child->lastPost->info = $lastPostInfo;
$child->lastPost->topicInfo = $forumTopics->getTopic(postInfo: $lastPostInfo);
2023-08-28 01:17:34 +00:00
if($lastPostInfo->hasUserId()) {
$child->lastPost->user = $usersCtx->getUserInfo($lastPostInfo->getUserId());
$child->lastPost->colour = $usersCtx->getUserColour($child->lastPost->user);
2023-08-28 01:17:34 +00:00
}
}
2022-09-13 13:14:49 +00:00
}
2023-08-28 01:17:34 +00:00
}
2022-09-13 13:14:49 +00:00
2023-08-28 01:17:34 +00:00
if($child->info->mayHaveTopics() && !$childUnread) {
$childUnread = $forumCategories->checkCategoryUnread($child->info, $currentUser);
2023-08-28 01:17:34 +00:00
if($childUnread)
$unread = true;
2022-09-13 13:14:49 +00:00
}
2023-08-28 01:17:34 +00:00
$child->perms = $childPerms;
$child->unread = $childUnread;
2022-09-13 13:14:49 +00:00
}
2023-08-28 01:17:34 +00:00
if($category->info->mayHaveTopics() && !$unread)
$unread = $forumCategories->checkCategoryUnread($category->info, $currentUser);
2023-08-28 01:17:34 +00:00
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->getId()];
foreach($category->childIds as $childId) {
$childPerms = $authInfo->getPerms('forum', $childId);
2023-08-30 22:37:21 +00:00
if($childPerms->check(Perm::F_CATEGORY_LIST))
2023-08-28 01:17:34 +00:00
$catIds[] = $childId;
}
try {
$lastPostInfo = $forumPosts->getPost(categoryInfos: $catIds, getLast: true, deleted: false);
2023-08-28 01:17:34 +00:00
} catch(RuntimeException $ex) {
$lastPostInfo = null;
}
if($lastPostInfo !== null) {
$category->lastPost = new stdClass;
$category->lastPost->info = $lastPostInfo;
$category->lastPost->topicInfo = $forumTopics->getTopic(postInfo: $lastPostInfo);
2023-08-28 01:17:34 +00:00
if($lastPostInfo->hasUserId()) {
$category->lastPost->user = $usersCtx->getUserInfo($lastPostInfo->getUserId());
$category->lastPost->colour = $usersCtx->getUserColour($category->lastPost->user);
2023-08-28 01:17:34 +00:00
}
}
}
}
$category->perms = $perms;
$category->unread = $unread;
2022-09-13 13:14:49 +00:00
}
2023-08-28 01:17:34 +00:00
Template::render('forum.index', [
'forum_categories' => $categories,
'forum_empty' => empty($categories),
'forum_show_mark_as_read' => $currentUser !== null,
]);