2016-07-31 01:32:37 +00:00
|
|
|
<?php
|
|
|
|
/**
|
2016-07-31 19:36:13 +00:00
|
|
|
* Holds the controller for topics.
|
2016-07-31 01:32:37 +00:00
|
|
|
* @package Sakura
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Sakura\Controllers\Forum;
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
use Phroute\Phroute\Exception\HttpMethodNotAllowedException;
|
|
|
|
use Phroute\Phroute\Exception\HttpRouteNotFoundException;
|
2016-08-07 14:10:27 +00:00
|
|
|
use Sakura\CurrentSession;
|
2016-07-31 01:32:37 +00:00
|
|
|
use Sakura\Forum\Forum;
|
2016-07-31 19:36:13 +00:00
|
|
|
use Sakura\Forum\Post;
|
2016-07-31 01:32:37 +00:00
|
|
|
use Sakura\Forum\Topic;
|
|
|
|
use Sakura\Perms\Forum as ForumPerms;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Topic controller.
|
|
|
|
* @package Sakura
|
|
|
|
* @author Julian van de Groep <me@flash.moe>
|
|
|
|
*/
|
|
|
|
class TopicController extends Controller
|
|
|
|
{
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Views a topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpRouteNotFoundException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function view($id = 0)
|
|
|
|
{
|
|
|
|
$topic = new Topic($id);
|
|
|
|
$forum = new Forum($topic->forum);
|
|
|
|
|
|
|
|
// Check if the forum exists
|
2016-07-31 19:36:13 +00:00
|
|
|
if ($topic->id === 0
|
2016-08-07 14:10:27 +00:00
|
|
|
|| !$forum->permission(ForumPerms::VIEW, CurrentSession::$user->id)) {
|
2016-09-13 22:05:03 +00:00
|
|
|
throw new HttpRouteNotFoundException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-07 14:10:27 +00:00
|
|
|
$topic->trackUpdate(CurrentSession::$user->id);
|
2016-07-31 01:32:37 +00:00
|
|
|
$topic->viewsUpdate();
|
|
|
|
|
2016-07-31 19:36:13 +00:00
|
|
|
return view('forum/topic', compact('forum', 'topic'));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Checks if a user can moderate the topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpRouteNotFoundException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return array
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
private function modBase($id)
|
|
|
|
{
|
|
|
|
$topic = new Topic($id);
|
|
|
|
$forum = new Forum($topic->forum);
|
|
|
|
|
2016-07-31 19:36:13 +00:00
|
|
|
if ($topic->id !== 0
|
2016-08-07 14:10:27 +00:00
|
|
|
|| $forum->permission(ForumPerms::VIEW, CurrentSession::$user->id)
|
2016-07-31 19:36:13 +00:00
|
|
|
|| session_check()) {
|
2016-07-31 01:32:37 +00:00
|
|
|
return compact('topic', 'forum');
|
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
throw new HttpRouteNotFoundException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Sticky a topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function sticky($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if (!$forum->permission(ForumPerms::STICKY, CurrentSession::$user->id)) {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
$topic->type = $topic->type !== 1 ? 1 : 0;
|
|
|
|
$topic->update();
|
|
|
|
|
|
|
|
redirect(route('forums.topic', $topic->id));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Announce a topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function announce($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if (!$forum->permission(ForumPerms::ANNOUNCEMENT, CurrentSession::$user->id)) {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
$topic->type = $topic->type !== 2 ? 2 : 0;
|
|
|
|
$topic->update();
|
|
|
|
|
|
|
|
redirect(route('forums.topic', $topic->id));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Lock a topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function lock($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if (!$forum->permission(ForumPerms::LOCK, CurrentSession::$user->id)) {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
$topic->status = $topic->status !== 1 ? 1 : 0;
|
|
|
|
$topic->update();
|
|
|
|
|
|
|
|
redirect(route('forums.topic', $topic->id));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Delete an entire topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function delete($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
|
|
|
|
|
|
|
$trash = intval(config('forum.trash'));
|
|
|
|
|
|
|
|
if ($topic->forum === $trash
|
|
|
|
&& $forum->permission(ForumPerms::DELETE_ANY, CurrentSession::$user->id)) {
|
|
|
|
$redirect = route('forums.forum', $trash);
|
|
|
|
$topic->delete();
|
|
|
|
} elseif ($forum->permission(ForumPerms::MOVE, CurrentSession::$user->id)) {
|
|
|
|
$redirect = route('forums.topic', $topic->id);
|
|
|
|
$topic->move($trash);
|
|
|
|
} else {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
redirect($redirect);
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Restore a topic to its previous location.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function restore($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if (!$forum->permission(ForumPerms::MOVE, CurrentSession::$user->id)) {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
|
|
|
}
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if ($topic->oldForum) {
|
|
|
|
$topic->move($topic->oldForum, false);
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
redirect(route('forums.topic', $topic->id));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Move a topic.
|
|
|
|
* @param int $id
|
2016-09-13 22:05:03 +00:00
|
|
|
* @throws HttpMethodNotAllowedException
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function move($id)
|
|
|
|
{
|
2016-09-13 22:05:03 +00:00
|
|
|
extract($this->modBase($id));
|
|
|
|
$dest_forum = new Forum($_REQUEST['forum_id'] ?? 0);
|
2016-07-31 01:32:37 +00:00
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
if (!$forum->permission(ForumPerms::MOVE, CurrentSession::$user->id)
|
|
|
|
|| $dest_forum->id === 0
|
|
|
|
|| $dest_forum->permission(ForumPerms::VIEW, CurrentSession::$user->id)) {
|
|
|
|
throw new HttpMethodNotAllowedException;
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-09-13 22:05:03 +00:00
|
|
|
$topic->move($dest_forum->id);
|
|
|
|
|
|
|
|
redirect(route('forums.topic', $topic->id));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Reply to a topic.
|
|
|
|
* @param int $id
|
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function reply($id = 0)
|
|
|
|
{
|
|
|
|
$text = $_POST['text'] ?? null;
|
|
|
|
|
|
|
|
// Attempt to get the forum
|
|
|
|
$topic = new Topic($id);
|
|
|
|
|
|
|
|
// And attempt to get the forum
|
|
|
|
$forum = new Forum($topic->forum);
|
|
|
|
|
|
|
|
// Check if the topic exists
|
|
|
|
if ($topic->id === 0
|
|
|
|
|| $forum->type !== 0
|
2016-08-07 14:10:27 +00:00
|
|
|
|| !$forum->permission(ForumPerms::VIEW, CurrentSession::$user->id)) {
|
2016-07-31 01:32:37 +00:00
|
|
|
$message = "This post doesn't exist or you don't have access to it!";
|
|
|
|
$redirect = route('forums.index');
|
|
|
|
|
2016-07-31 19:36:13 +00:00
|
|
|
return view('global/information', compact('message', 'redirect'));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check if the topic exists
|
2016-08-07 14:10:27 +00:00
|
|
|
if (!$forum->permission(ForumPerms::REPLY, CurrentSession::$user->id)
|
2016-07-31 01:32:37 +00:00
|
|
|
|| (
|
|
|
|
$topic->status === 1
|
2016-08-07 14:10:27 +00:00
|
|
|
&& !$forum->permission(ForumPerms::LOCK, CurrentSession::$user->id)
|
2016-07-31 01:32:37 +00:00
|
|
|
)) {
|
|
|
|
$message = "You are not allowed to post in this topic!";
|
|
|
|
$redirect = route('forums.topic', $topic->id);
|
|
|
|
|
2016-07-31 19:36:13 +00:00
|
|
|
return view('global/information', compact('message', 'redirect'));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Length
|
|
|
|
$length = strlen($text);
|
|
|
|
$minLen = config('forum.min_post_length');
|
|
|
|
$maxLen = config('forum.max_post_length');
|
|
|
|
$tooShort = $length < $minLen;
|
|
|
|
$tooLong = $length > $maxLen;
|
|
|
|
|
|
|
|
// Check requirments
|
|
|
|
if ($tooShort
|
|
|
|
|| $tooLong) {
|
2016-07-31 19:36:13 +00:00
|
|
|
$route = route('forums.topic', $topic->id);
|
2016-07-31 01:32:37 +00:00
|
|
|
|
|
|
|
$message = "Your post is " . (
|
|
|
|
$tooShort
|
|
|
|
? "too short, add some more text! Make it at least {$minLen}."
|
|
|
|
: "too long, you're gonna have to cut a little! Keep it under {$maxLen}."
|
|
|
|
);
|
|
|
|
$redirect = "{$route}#reply";
|
|
|
|
|
|
|
|
if (!isset($_SESSION['replyText'])) {
|
|
|
|
$_SESSION['replyText'] = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
$_SESSION['replyText']["t{$topic->id}"] = $text;
|
|
|
|
|
2016-07-31 19:36:13 +00:00
|
|
|
return view('global/information', compact('message', 'redirect'));
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
unset($_SESSION['replyText']["t{$topic->id}"]);
|
|
|
|
|
|
|
|
// Create the post
|
|
|
|
$post = Post::create(
|
|
|
|
"Re: {$topic->title}",
|
|
|
|
$text,
|
2016-08-07 14:10:27 +00:00
|
|
|
CurrentSession::$user,
|
2016-07-31 01:32:37 +00:00
|
|
|
$topic->id,
|
|
|
|
$forum->id
|
|
|
|
);
|
|
|
|
|
|
|
|
// Go to the post
|
|
|
|
$postLink = route('forums.post', $post->id);
|
|
|
|
|
|
|
|
// Head to the post
|
2016-09-13 22:05:03 +00:00
|
|
|
redirect($postLink);
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|
2016-07-31 19:36:13 +00:00
|
|
|
|
2016-08-05 02:35:37 +00:00
|
|
|
/**
|
|
|
|
* Create a topic.
|
|
|
|
* @param int $id
|
|
|
|
* @return string
|
|
|
|
*/
|
2016-07-31 19:36:13 +00:00
|
|
|
public function create($id = 0)
|
|
|
|
{
|
|
|
|
$title = $_POST['title'] ?? null;
|
|
|
|
$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
|
2016-08-07 14:10:27 +00:00
|
|
|
|| !$forum->permission(ForumPerms::VIEW, CurrentSession::$user->id)
|
|
|
|
|| !$forum->permission(ForumPerms::REPLY, CurrentSession::$user->id)
|
|
|
|
|| !$forum->permission(ForumPerms::CREATE_THREADS, CurrentSession::$user->id)) {
|
2016-07-31 19:36:13 +00:00
|
|
|
$message = "This forum doesn't exist or you don't have access to it!";
|
|
|
|
$redirect = route('forums.index');
|
|
|
|
|
|
|
|
return view('global/information', compact('message', 'redirect'));
|
|
|
|
}
|
|
|
|
|
|
|
|
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, it has to be longer than {$titleMin} characters!";
|
|
|
|
} elseif ($titleTooLong) {
|
|
|
|
$message = "This title is too long, keep it under {$titleMax} characters!";
|
|
|
|
} elseif ($textTooShort) {
|
|
|
|
$message = "Please make your post a little bit longer, at least {$textMin} characters!";
|
|
|
|
} elseif ($textTooLong) {
|
|
|
|
$message = "Your post is too long, you're gonna have to cut a little!"
|
|
|
|
. " Can't be more than {$textMax} characters.";
|
|
|
|
}
|
|
|
|
|
|
|
|
$redirect = route('forums.new', $forum->id);
|
|
|
|
|
|
|
|
if (!isset($_SESSION['replyText'])) {
|
|
|
|
$_SESSION['replyText'] = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
$_SESSION['replyText']["f{$forum->id}"]["title"] = $title;
|
|
|
|
$_SESSION['replyText']["f{$forum->id}"]["text"] = $text;
|
|
|
|
|
|
|
|
return view('global/information', compact('message', 'redirect'));
|
|
|
|
}
|
|
|
|
|
|
|
|
unset($_SESSION['replyText']["f{$forum->id}"]);
|
|
|
|
|
|
|
|
// Create the post
|
|
|
|
$post = Post::create(
|
|
|
|
$title,
|
|
|
|
$text,
|
2016-08-07 14:10:27 +00:00
|
|
|
CurrentSession::$user,
|
2016-07-31 19:36:13 +00:00
|
|
|
0,
|
|
|
|
$forum->id
|
|
|
|
);
|
|
|
|
|
|
|
|
// Go to the post
|
|
|
|
$postLink = route('forums.post', $post->id);
|
|
|
|
|
|
|
|
// Head to the post
|
2016-09-13 22:05:03 +00:00
|
|
|
redirect($postLink);
|
|
|
|
return;
|
2016-07-31 19:36:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return view('forum/topic', compact('forum'));
|
|
|
|
}
|
2016-07-31 01:32:37 +00:00
|
|
|
}
|