2015-11-07 20:20:11 +00:00
|
|
|
<?php
|
2016-02-03 22:22:56 +00:00
|
|
|
/**
|
|
|
|
* Holds the forum object class.
|
|
|
|
* @package Sakura
|
|
|
|
*/
|
|
|
|
|
2015-11-22 22:10:23 +00:00
|
|
|
namespace Sakura\Forum;
|
2015-11-17 19:30:34 +00:00
|
|
|
|
2016-02-18 23:28:44 +00:00
|
|
|
use Sakura\DB;
|
2015-12-29 21:52:19 +00:00
|
|
|
use Sakura\Perms;
|
2015-11-07 20:20:11 +00:00
|
|
|
|
|
|
|
/**
|
2016-02-02 21:04:15 +00:00
|
|
|
* Used to serve forums.
|
2015-11-07 20:20:11 +00:00
|
|
|
* @package Sakura
|
2016-02-02 21:04:15 +00:00
|
|
|
* @author Julian van de Groep <me@flash.moe>
|
2015-11-07 20:20:11 +00:00
|
|
|
*/
|
|
|
|
class Forum
|
|
|
|
{
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* The ID of the forum.
|
|
|
|
* @var int
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $id = 0;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The order of the forum.
|
|
|
|
* @var int
|
|
|
|
*/
|
2016-01-01 04:30:27 +00:00
|
|
|
public $order = 0;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The name of the forum.
|
|
|
|
* @var string
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $name = "Forum";
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The description of the forum.
|
|
|
|
* @var string
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $description = "";
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The link of the forum (if the type is 2).
|
|
|
|
* @var string
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $link = "";
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The ID of the parent forum.
|
|
|
|
* @var int
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $category = 0;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The type of forum.
|
|
|
|
* @var int
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $type = 0;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The icon of this forum.
|
|
|
|
* @var string
|
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public $icon = "";
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A cached instance of the first post in this forum.
|
|
|
|
* @var Post
|
|
|
|
*/
|
2016-07-29 19:31:36 +00:00
|
|
|
private $firstPostCache = null;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A cached instance of the last post in this forum.
|
|
|
|
* @var Post
|
|
|
|
*/
|
2016-07-29 19:31:36 +00:00
|
|
|
private $lastPostCache = null;
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Cached instances of the subforums.
|
|
|
|
* @var array
|
|
|
|
*/
|
2016-07-29 19:31:36 +00:00
|
|
|
private $forumsCache = [];
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
2016-07-30 13:48:09 +00:00
|
|
|
* Cached instances of the topics in this forum.
|
2016-02-02 21:04:15 +00:00
|
|
|
* @var array
|
|
|
|
*/
|
2016-07-30 13:48:09 +00:00
|
|
|
private $topicsCache = [];
|
2016-02-02 21:04:15 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The permission container.
|
|
|
|
* @var Perms
|
|
|
|
*/
|
2016-07-29 19:31:36 +00:00
|
|
|
private $permissionsCache;
|
2015-11-13 23:11:55 +00:00
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Constructor.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @param int $forumId
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2016-07-31 01:32:37 +00:00
|
|
|
public function __construct(int $forumId = 0)
|
2015-11-13 23:11:55 +00:00
|
|
|
{
|
|
|
|
// Get the row from the database
|
2016-02-25 16:06:29 +00:00
|
|
|
$forumRow = DB::table('forums')
|
|
|
|
->where('forum_id', $forumId)
|
|
|
|
->get();
|
2015-11-13 23:11:55 +00:00
|
|
|
|
2015-12-29 21:52:19 +00:00
|
|
|
// Create permissions object
|
2016-07-29 19:31:36 +00:00
|
|
|
$this->permissionsCache = new Perms(Perms::FORUM);
|
2015-12-29 21:52:19 +00:00
|
|
|
|
2015-11-13 23:11:55 +00:00
|
|
|
// Populate the variables
|
2015-11-15 14:29:26 +00:00
|
|
|
if ($forumRow) {
|
2016-02-25 16:06:29 +00:00
|
|
|
$forumRow = $forumRow[0];
|
2016-07-31 01:32:37 +00:00
|
|
|
$this->id = intval($forumRow->forum_id);
|
|
|
|
$this->order = intval($forumRow->forum_order);
|
2016-02-18 23:28:44 +00:00
|
|
|
$this->name = $forumRow->forum_name;
|
|
|
|
$this->description = $forumRow->forum_desc;
|
|
|
|
$this->link = $forumRow->forum_link;
|
2016-07-31 01:32:37 +00:00
|
|
|
$this->category = intval($forumRow->forum_category);
|
|
|
|
$this->type = intval($forumRow->forum_type);
|
2016-02-18 23:28:44 +00:00
|
|
|
$this->icon = $forumRow->forum_icon;
|
2016-07-31 01:32:37 +00:00
|
|
|
} elseif ($forumId !== 0) {
|
2015-11-15 14:29:26 +00:00
|
|
|
$this->id = -1;
|
2015-11-13 23:11:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Checking a permission flag.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @param int $flag
|
|
|
|
* @param int $user
|
|
|
|
* @param bool $raw
|
|
|
|
* @return bool|int
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2016-01-02 17:55:31 +00:00
|
|
|
public function permission($flag, $user, $raw = false)
|
|
|
|
{
|
2015-12-29 21:52:19 +00:00
|
|
|
// Set default permission value
|
|
|
|
$perm = 0;
|
|
|
|
|
|
|
|
// Get the permissions of the parent forum if there is one
|
|
|
|
if ($this->category) {
|
2016-01-02 17:55:31 +00:00
|
|
|
$perm = $perm | (new Forum($this->category))->permission($flag, $user, true);
|
2015-12-29 21:52:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Bitwise OR it with the permissions for this forum
|
2016-07-29 19:31:36 +00:00
|
|
|
$perm = $perm | $this->permissionsCache->user($user, ['forum_id' => [$this->id, '=']]);
|
2015-12-29 21:52:19 +00:00
|
|
|
|
2016-07-29 19:31:36 +00:00
|
|
|
return $raw ? $perm : $this->permissionsCache->check($flag, $perm);
|
2015-12-29 21:52:19 +00:00
|
|
|
}
|
|
|
|
|
2016-02-03 22:22:56 +00:00
|
|
|
/**
|
|
|
|
* Gets all subforums of this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return array
|
2016-02-03 22:22:56 +00:00
|
|
|
*/
|
2015-12-10 20:55:51 +00:00
|
|
|
public function forums()
|
2015-11-13 23:11:55 +00:00
|
|
|
{
|
2016-07-29 19:31:36 +00:00
|
|
|
// Check if forumsCache is populated
|
|
|
|
if (!count($this->forumsCache)) {
|
2015-12-10 20:55:51 +00:00
|
|
|
// Get all rows with the category id set to the forum id
|
2016-02-25 16:06:29 +00:00
|
|
|
$forumRows = DB::table('forums')
|
|
|
|
->where('forum_category', $this->id)
|
|
|
|
->orderBy('forum_order')
|
|
|
|
->get(['forum_id']);
|
2015-11-13 23:11:55 +00:00
|
|
|
|
2015-12-10 20:55:51 +00:00
|
|
|
// Create a storage array
|
|
|
|
$forums = [];
|
2015-11-13 23:11:55 +00:00
|
|
|
|
2015-12-10 20:55:51 +00:00
|
|
|
// Create new objects for each forum
|
|
|
|
foreach ($forumRows as $forum) {
|
2016-02-18 23:28:44 +00:00
|
|
|
$forums[$forum->forum_id] = new Forum($forum->forum_id);
|
2015-12-10 20:55:51 +00:00
|
|
|
}
|
|
|
|
|
2016-07-29 19:31:36 +00:00
|
|
|
$this->forumsCache = $forums;
|
2015-12-10 20:55:51 +00:00
|
|
|
} else {
|
2016-07-29 19:31:36 +00:00
|
|
|
$forums = $this->forumsCache;
|
2015-11-13 23:11:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Return the forum objects
|
|
|
|
return $forums;
|
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
2016-07-30 13:48:09 +00:00
|
|
|
* Gets the topics in this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return array
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2016-07-30 13:48:09 +00:00
|
|
|
public function topics()
|
2015-11-15 14:29:26 +00:00
|
|
|
{
|
2016-07-30 13:48:09 +00:00
|
|
|
// Check if topicsCache is populated
|
|
|
|
if (!count($this->topicsCache)) {
|
2015-12-10 20:55:51 +00:00
|
|
|
// Get all rows with the forum id for this forum
|
2016-07-30 13:48:09 +00:00
|
|
|
$topicRows = DB::table('topics')
|
2016-02-25 16:06:29 +00:00
|
|
|
->where('forum_id', $this->id)
|
|
|
|
->orderBy('topic_type', 'desc')
|
|
|
|
->orderBy('topic_last_reply', 'desc')
|
|
|
|
->get(['topic_id']);
|
2015-12-10 20:55:51 +00:00
|
|
|
|
|
|
|
// Create a storage array
|
2016-07-30 13:48:09 +00:00
|
|
|
$topics = [];
|
2015-12-10 20:55:51 +00:00
|
|
|
|
2016-07-30 13:48:09 +00:00
|
|
|
// Create new objects for each topic
|
|
|
|
foreach ($topicRows as $topic) {
|
|
|
|
$topics[$topic->topic_id] = new Topic($topic->topic_id);
|
2015-12-10 20:55:51 +00:00
|
|
|
}
|
2015-11-15 14:29:26 +00:00
|
|
|
|
2016-07-30 13:48:09 +00:00
|
|
|
$this->topicsCache = $topics;
|
2015-12-10 20:55:51 +00:00
|
|
|
} else {
|
2016-07-30 13:48:09 +00:00
|
|
|
$topics = $this->topicsCache;
|
2015-11-15 14:29:26 +00:00
|
|
|
}
|
|
|
|
|
2016-07-30 13:48:09 +00:00
|
|
|
// Return the topic objects
|
|
|
|
return $topics;
|
2015-11-15 14:29:26 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Gets the first post in this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return Post
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2015-12-10 20:55:51 +00:00
|
|
|
public function firstPost()
|
2015-11-15 14:29:26 +00:00
|
|
|
{
|
2016-07-29 19:31:36 +00:00
|
|
|
// Check if firstPostCache is set
|
|
|
|
if ($this->firstPostCache === null) {
|
2015-12-10 20:55:51 +00:00
|
|
|
// Get the row
|
2016-02-25 16:06:29 +00:00
|
|
|
$firstPost = DB::table('posts')
|
|
|
|
->where('forum_id', $this->id)
|
|
|
|
->orderBy('post_id')
|
|
|
|
->limit(1)
|
|
|
|
->get(['post_id']);
|
2015-11-15 14:29:26 +00:00
|
|
|
|
2015-12-10 20:55:51 +00:00
|
|
|
// Create the post object
|
2016-02-25 16:06:29 +00:00
|
|
|
$post = new Post(empty($firstPost) ? 0 : $firstPost[0]->post_id);
|
2015-11-15 14:29:26 +00:00
|
|
|
|
2015-12-10 20:55:51 +00:00
|
|
|
// Assign it to a "cache" variable
|
2016-07-29 19:31:36 +00:00
|
|
|
$this->firstPostCache = $post;
|
2015-12-10 20:55:51 +00:00
|
|
|
|
|
|
|
// Return the post object
|
|
|
|
return $post;
|
|
|
|
} else {
|
2016-07-29 19:31:36 +00:00
|
|
|
return $this->firstPostCache;
|
2015-12-10 20:55:51 +00:00
|
|
|
}
|
2015-11-15 14:29:26 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Gets the last post in this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return Post
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2015-12-10 20:55:51 +00:00
|
|
|
public function lastPost()
|
2015-11-13 23:11:55 +00:00
|
|
|
{
|
2016-07-29 19:31:36 +00:00
|
|
|
// Check if lastPostCache is set
|
|
|
|
if ($this->lastPostCache === null) {
|
2015-12-10 20:55:51 +00:00
|
|
|
// Get the row
|
2016-02-25 16:06:29 +00:00
|
|
|
$lastPost = DB::table('posts')
|
|
|
|
->where('forum_id', $this->id)
|
|
|
|
->orderBy('post_id', 'desc')
|
|
|
|
->limit(1)
|
|
|
|
->get(['post_id']);
|
2015-12-10 20:55:51 +00:00
|
|
|
|
|
|
|
// Create the post object
|
2016-02-25 16:06:29 +00:00
|
|
|
$post = new Post(empty($lastPost) ? 0 : $lastPost[0]->post_id);
|
2016-01-01 04:30:27 +00:00
|
|
|
|
2015-12-10 20:55:51 +00:00
|
|
|
// Assign it to a "cache" variable
|
2016-07-29 19:31:36 +00:00
|
|
|
$this->lastPostCache = $post;
|
2015-12-10 20:55:51 +00:00
|
|
|
|
|
|
|
// Return the post object
|
|
|
|
return $post;
|
|
|
|
} else {
|
2016-07-29 19:31:36 +00:00
|
|
|
return $this->lastPostCache;
|
2015-12-10 20:55:51 +00:00
|
|
|
}
|
2015-11-13 23:11:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
2016-07-30 13:48:09 +00:00
|
|
|
* Counts the amount of topics in this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return int
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2016-07-30 13:48:09 +00:00
|
|
|
public function topicCount()
|
2015-11-13 23:11:55 +00:00
|
|
|
{
|
2016-02-25 16:06:29 +00:00
|
|
|
return DB::table('topics')
|
|
|
|
->where('forum_id', $this->id)
|
|
|
|
->count();
|
2015-11-13 23:11:55 +00:00
|
|
|
}
|
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Counts the amount of posts in this forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @return int
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2015-11-13 23:11:55 +00:00
|
|
|
public function postCount()
|
|
|
|
{
|
2016-02-25 16:06:29 +00:00
|
|
|
return DB::table('posts')
|
|
|
|
->where('forum_id', $this->id)
|
|
|
|
->count();
|
2015-11-13 23:11:55 +00:00
|
|
|
}
|
2015-11-16 22:05:45 +00:00
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
|
|
|
* Checks if a user has read every post in the specified forum.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @param int $user
|
|
|
|
* @return bool
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2015-11-16 22:05:45 +00:00
|
|
|
public function unread($user)
|
|
|
|
{
|
2015-11-21 15:27:37 +00:00
|
|
|
// Return false if the user id is less than 1
|
|
|
|
if ($user < 1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check forums
|
2015-12-10 20:55:51 +00:00
|
|
|
foreach ($this->forums() as $forum) {
|
2015-11-21 15:27:37 +00:00
|
|
|
if ($forum->unread($user)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-30 13:48:09 +00:00
|
|
|
// Check each topic
|
|
|
|
foreach ($this->topics() as $topic) {
|
|
|
|
if ($topic->unread($user)) {
|
2015-11-16 22:05:45 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return false if negative
|
|
|
|
return false;
|
|
|
|
}
|
2015-11-21 15:27:37 +00:00
|
|
|
|
2016-02-02 21:04:15 +00:00
|
|
|
/**
|
2016-07-30 13:48:09 +00:00
|
|
|
* Update the read status of all topics in this forum at once.
|
2016-08-05 02:35:37 +00:00
|
|
|
* @param int $user
|
2016-02-02 21:04:15 +00:00
|
|
|
*/
|
2015-11-21 15:27:37 +00:00
|
|
|
public function trackUpdateAll($user)
|
|
|
|
{
|
|
|
|
// Iterate over every forum
|
2015-12-10 20:55:51 +00:00
|
|
|
foreach ($this->forums() as $forum) {
|
2015-11-21 15:27:37 +00:00
|
|
|
// Update every forum
|
|
|
|
$forum->trackUpdateAll($user);
|
|
|
|
}
|
|
|
|
|
2016-07-30 13:48:09 +00:00
|
|
|
// Iterate over every topic
|
|
|
|
foreach ($this->topics() as $topic) {
|
|
|
|
// Update every topic
|
|
|
|
$topic->trackUpdate($user);
|
2015-11-21 15:27:37 +00:00
|
|
|
}
|
|
|
|
}
|
2015-11-07 20:20:11 +00:00
|
|
|
}
|