*/ class ForumController extends Controller { /** * Serves the forum index. * * @return string HTML for the forum index. */ public function index() { // Get the most active topics $activeTopicsIds = DB::table('posts') ->where('forum_id', '!=', config('forum.trash')) ->groupBy('topic_id') ->orderByRaw('COUNT(*) DESC') ->limit(10) ->get(['topic_id']); $activeTopics = []; // make this not disgusting while (list($_n, $_t) = each($activeTopicsIds)) { // Create the topic object $topic = new Topic($_t->topic_id); // Create a forum object $forum = new Forum($topic->forum); // Check if we have permission to view it if (!$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { $fetch = DB::table('posts') ->groupBy('topic_id') ->orderByRaw('COUNT(*) DESC') ->skip(11 + $_n) ->take(1) ->get(['topic_id']); if ($fetch) { $activeTopicsIds[] = $fetch[0]; } continue; } $activeTopics[$topic->id] = $topic; } // Get the latest posts $latestPostsIds = DB::table('posts') ->where('forum_id', '!=', config('forum.trash')) ->orderBy('post_id', 'desc') ->limit(10) ->get(['post_id']); $latestPosts = []; while (list($_n, $_p) = each($latestPostsIds)) { // Create new post object $post = new Post($_p->post_id); // Forum id $forum = new Forum($post->forum); // Check if we have permission to view it if (!$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { $fetch = DB::table('posts') ->orderBy('post_id', 'desc') ->skip(11 + $_n) ->take(1) ->get(['post_id']); if ($fetch) { $latestPostsIds[] = $fetch[0]; } continue; } $latestPosts[$post->id] = $post; } // Get the most active poster $activePosterId = DB::table('posts') ->where('forum_id', '!=', config('forum.trash')) ->where('post_time', '>', time() - (24 * 60 * 60)) ->groupBy('poster_id') ->orderByRaw('COUNT(*) DESC') ->limit(1) ->get(['poster_id']); $activePoster = User::construct( $activePosterId ? $activePosterId[0]->poster_id : 0 ); // Create the forum object $forum = new Forum; Template::vars(compact('forum', 'activeTopics', 'latestPosts', 'activePoster')); // Return the compiled page return Template::render('forum/index'); } /** * Get a forum page. * * @return string */ public function forum($id = 0) { // Get the forum $forum = new Forum($id); // Redirect forum id 0 to the main page if ($forum->id === 0) { return header('Location: ' . Router::route('forums.index')); } // Check if the forum exists if ($forum->id < 0) { // Set render data Template::vars([ 'page' => [ 'message' => 'The forum you tried to access does not exist.', 'redirect' => Router::route('forums.index'), ], ]); // Print page contents return Template::render('global/information'); } // Check if the user has access to the forum if (!$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { // Set render data Template::vars([ 'page' => [ 'message' => 'You do not have access to this forum.', 'redirect' => Router::route('forums.index'), ], ]); // Print page contents return Template::render('global/information'); } // Check if the forum isn't a link if ($forum->type === 2) { // Set render data Template::vars([ 'page' => [ 'message' => 'The forum you tried to access is a link. You\'re being redirected.', 'redirect' => $forum->link, ], ]); // Print page contents return Template::render('global/information'); } // Set parse variables Template::vars([ 'forum' => $forum, ]); // Print page contents return Template::render('forum/forum'); } /** * Mark a forum as read. * * @return string */ public function markForumRead($id = 0) { // Check if the session id was supplied if (!isset($_GET['s']) || $_GET['s'] != session_id()) { // Set render data Template::vars([ 'page' => [ 'message' => 'Your session expired! Go back and try again.', 'redirect' => Router::route('forums.index'), ], ]); // Print page contents return Template::render('global/information'); } // Get the forum $forum = new Forum($id); // Check if the forum exists if ($forum->id < 1) { // Set render data Template::vars([ 'page' => [ 'message' => 'The forum you tried to access does not exist.', 'redirect' => Router::route('forums.index'), ], ]); // Print page contents return Template::render('global/information'); } // Check if the user has access to the forum if (!$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { // Set render data Template::vars([ 'page' => [ 'message' => 'You do not have access to this forum.', 'redirect' => Router::route('forums.index'), ], ]); // Print page contents return Template::render('global/information'); } // Run the function $forum->trackUpdateAll(ActiveUser::$user->id); // Set render data Template::vars([ 'page' => [ 'message' => 'All topics have been marked as read.', 'redirect' => Router::route('forums.forum', $forum->id), ], ]); // Print page contents return Template::render('global/information'); } /** * Redirect to the position of a post in a topic. * * @return mixed */ public function post($id = 0) { // Attempt to get the post $post = new Post($id); // And attempt to get the forum $topic = new Topic($post->topic); // And attempt to get the forum $forum = new Forum($topic->forum); // Check if the forum exists if ($post->id == 0 || $topic->id == 0 || !$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { $message = "This post doesn't exist or you don't have access to it!"; $redirect = Router::route('forums.index'); Template::vars(compact('message', 'redirect')); return Template::render('global/information'); } // Generate link $topicLink = Router::route('forums.topic', $topic->id); // Get all post ids from the database $postIds = DB::table('posts') ->where('topic_id', $topic->id) ->get(['post_id']); $postIds = array_column($postIds, 'post_id'); // Find in array $postAt = ceil(array_search($post->id, $postIds) / 10); // Only append the page variable if it's more than 1 if ($postAt > 1) { $topicLink .= "?page={$postAt}"; } return header("Location: {$topicLink}#p{$post->id}"); } /** * Get the raw text of a post. * * @return string */ public function postRaw($id = 0) { // Attempt to get the post $post = new Post($id); // And attempt to get the forum $topic = new Topic($post->topic); // And attempt to get the forum $forum = new Forum($topic->forum); // Check if the forum exists if ($post->id == 0 || $topic->id == 0 || !$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id)) { return ""; } return $post->text; } /** * Create a topic. * * @return string */ public function createTopic($id = 0) { $title = isset($_POST['title']) ? $_POST['title'] : null; $text = isset($_POST['text']) ? $_POST['text'] : null; // And attempt to get the forum $forum = new Forum($id); // Check if the forum exists if ($forum->id === 0 || $forum->type !== 0 || !$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id) || !$forum->permission(ForumPerms::REPLY, ActiveUser::$user->id) || !$forum->permission(ForumPerms::CREATE_THREADS, ActiveUser::$user->id)) { $message = "This forum doesn't exist or you don't have access to it!"; $redirect = Router::route('forums.index'); Template::vars(compact('message', 'redirect')); return Template::render('global/information'); } if ($text && $title) { // Length $titleLength = strlen($title); $textLength = strlen($text); $titleMin = config('forum.min_title_length'); $titleMax = config('forum.max_title_length'); $textMin = config('forum.min_post_length'); $textMax = config('forum.max_post_length'); // Checks $titleTooShort = $titleLength < $titleMin; $titleTooLong = $titleLength > $titleMax; $textTooShort = $textLength < $textMin; $textTooLong = $textLength > $textMax; // Check requirments if ($titleTooShort || $titleTooLong || $textTooShort || $textTooLong) { $message = ""; if ($titleTooShort) { $message = "This title is too short!"; } elseif ($titleTooLong) { $message = "This title is too long!"; } elseif ($textTooShort) { $message = "Please make your post a little bit longer!"; } elseif ($textTooLong) { $message = "Your post is too long, you're gonna have to cut a little!"; } $redirect = Router::route('forums.new', $forum->id); Template::vars(compact('message', 'redirect')); if (!isset($_SESSION['replyText'])) { $_SESSION['replyText'] = []; } $_SESSION['replyText']["f{$forum->id}"]["title"] = $title; $_SESSION['replyText']["f{$forum->id}"]["text"] = $text; return Template::render('global/information'); } unset($_SESSION['replyText']["f{$forum->id}"]); // Create the post $post = Post::create( $title, $text, ActiveUser::$user, 0, $forum->id ); // Go to the post $postLink = Router::route('forums.post', $post->id); // Head to the post return header("Location: {$postLink}"); } Template::vars(compact('forum')); return Template::render('forum/topic'); } /** * Edit a post. * * @return string */ public function editPost($id = 0) { $title = isset($_POST['title']) ? $_POST['title'] : null; $text = isset($_POST['text']) ? $_POST['text'] : null; // Attempt to get the post $post = new Post($id); // Attempt to get the topic $topic = new Topic($post->topic); // And attempt to get the forum $forum = new Forum($topic->forum); // Check permissions $noAccess = $post->id == 0 || $topic->id == 0 || !$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id); $noEdit = ( $post->poster->id === ActiveUser::$user->id ? !ActiveUser::$user->permission(ForumPerms::EDIT_OWN, Perms::FORUM) : !$forum->permission(ForumPerms::EDIT_ANY, ActiveUser::$user->id) ) || ( $topic->status === 1 && !$forum->permission(ForumPerms::LOCK, ActiveUser::$user->id) ); // Check if the forum exists if ($noAccess || $noEdit) { if ($noDelete) { $message = "You aren't allowed to edit posts in this topic!"; $redirect = Router::route('forums.post', $post->id); } else { $message = "This post doesn't exist or you don't have access to it!"; $redirect = Router::route('forums.index'); } Template::vars(compact('message', 'redirect')); return Template::render('global/information'); } // Length $titleLength = strlen($title); $textLength = strlen($text); $titleMin = config('forum.min_title_length'); $titleMax = config('forum.max_title_length'); $textMin = config('forum.min_post_length'); $textMax = config('forum.max_post_length'); // Checks $titleTooShort = $title !== null && $post->id === $topic->firstPost()->id && $titleLength < $titleMin; $titleTooLong = $title !== null && $post->id === $topic->firstPost()->id && $titleLength > $titleMax; $textTooShort = $textLength < $textMin; $textTooLong = $textLength > $textMax; // Check requirments if ($titleTooShort || $titleTooLong || $textTooShort || $textTooLong) { $message = ""; if ($titleTooShort) { $message = "This title is too short!"; } elseif ($titleTooLong) { $message = "This title is too long!"; } elseif ($textTooShort) { $message = "Please make your post a little bit longer!"; } elseif ($textTooLong) { $message = "Your post is too long, you're gonna have to cut a little!"; } $redirect = Router::route('forums.post', $post->id); Template::vars(compact('message', 'redirect')); if (!isset($_SESSION['replyText'])) { $_SESSION['replyText'] = []; } $_SESSION['replyText']["t{$forum->id}"] = $text; return Template::render('global/information'); } unset($_SESSION['replyText']["t{$forum->id}"]); if ($post->id !== $topic->firstPost()->id || $title === null) { $title = "Re: {$topic->title}"; } else { $topic->title = $title; $topic->update(); } // Create the post $post->subject = $title; $post->text = $text; $post->editTime = time(); $post->editReason = ''; $post->editUser = ActiveUser::$user; $post = $post->update(); // Go to the post $postLink = Router::route('forums.post', $post->id); // Head to the post return header("Location: {$postLink}"); } /** * Delete a post. * * @return string */ public function deletePost($id = 0) { $action = isset($_POST['yes']) && isset($_POST['sessionid']) ? $_POST['sessionid'] === session_id() : null; // Attempt to get the post $post = new Post($id); // And attempt to get the forum $topic = new Topic($post->topic); // And attempt to get the forum $forum = new Forum($topic->forum); // Check permissions $noAccess = $post->id == 0 || $topic->id == 0 || !$forum->permission(ForumPerms::VIEW, ActiveUser::$user->id); $noDelete = ( $post->poster->id === ActiveUser::$user->id ? !ActiveUser::$user->permission(ForumPerms::DELETE_OWN, Perms::FORUM) : !$forum->permission(ForumPerms::DELETE_ANY, ActiveUser::$user->id) ) || ( $topic->status === 1 && !$forum->permission(ForumPerms::LOCK, ActiveUser::$user->id) ); // Check if the forum exists if ($noAccess || $noDelete) { if ($noDelete) { $message = "You aren't allowed to delete posts in this topic!"; $redirect = Router::route('forums.post', $post->id); } else { $message = "This post doesn't exist or you don't have access to it!"; $redirect = Router::route('forums.index'); } Template::vars(compact('message', 'redirect')); return Template::render('global/information'); } if ($action !== null) { if ($action) { // Set message $message = "Deleted the post!"; // Check if the topic only has 1 post if ($topic->replyCount() === 1) { // Delete the entire topic $topic->delete(); $redirect = Router::route('forums.forum', $forum->id); } else { // Just delete the post $post->delete(); $redirect = Router::route('forums.topic', $topic->id); } Template::vars(compact('message', 'redirect')); return Template::render('global/information'); } $postLink = Router::route('forums.post', $post->id); return header("Location: {$postLink}"); } $message = "Are you sure?"; Template::vars(compact('message')); return Template::render('global/confirm'); } }