2015-05-03 16:25:57 +00:00
< ? php
/*
* Discussion Board
*/
namespace Sakura ;
2015-09-14 22:51:23 +02:00
class Forum
{
2015-06-27 21:29:37 +02:00
// Empty forum template
public static $emptyForum = [
2015-09-14 22:51:23 +02:00
'forum_id' => 0 ,
'forum_name' => 'Forum' ,
'forum_desc' => '' ,
'forum_link' => '' ,
'forum_category' => 0 ,
'forum_type' => 1 ,
'forum_posts' => 0 ,
'forum_topics' => 0 ,
2015-06-27 21:29:37 +02:00
];
// Getting the forum list
2015-09-14 22:51:23 +02:00
public static function getForumList ()
{
2015-05-06 13:42:02 +00:00
// Get the content from the database
$forums = Database :: fetch ( 'forums' );
// Create return array
$return = [
0 => [
2015-06-27 21:29:37 +02:00
'forum' => self :: $emptyForum ,
2015-09-14 22:51:23 +02:00
'forums' => [],
],
2015-05-06 13:42:02 +00:00
];
// Resort the forums
2015-09-14 22:51:23 +02:00
foreach ( $forums as $forum ) {
2015-05-06 13:42:02 +00:00
// If the forum type is a category create a new one
2015-09-14 22:51:23 +02:00
if ( $forum [ 'forum_type' ] == 1 ) {
2015-06-27 21:29:37 +02:00
$return [ $forum [ 'forum_id' ]][ 'forum' ] = $forum ;
} else {
2015-05-06 13:42:02 +00:00
// For link and reg. forum add it to the category
$return [ $forum [ 'forum_category' ]][ 'forums' ][ $forum [ 'forum_id' ]] = $forum ;
2015-07-05 02:03:15 +02:00
// Get the topic count
2015-09-14 23:41:43 +02:00
$return [ $forum [ 'forum_category' ]][ 'forums' ][ $forum [ 'forum_id' ]][ 'topic_count' ] =
Database :: count ( 'topics' , [
2015-09-14 22:51:23 +02:00
'forum_id' => [ $forum [ 'forum_id' ], '=' ],
2015-07-05 02:03:15 +02:00
])[ 0 ];
// Get the post count
2015-09-14 23:41:43 +02:00
$return [ $forum [ 'forum_category' ]][ 'forums' ][ $forum [ 'forum_id' ]][ 'post_count' ] =
Database :: count ( 'posts' , [
2015-09-14 22:51:23 +02:00
'forum_id' => [ $forum [ 'forum_id' ], '=' ],
2015-07-05 02:03:15 +02:00
])[ 0 ];
2015-07-03 19:33:02 +02:00
// Get last post in forum
$lastPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'forum_id' => [ $forum [ 'forum_id' ], '=' ],
2015-07-03 19:33:02 +02:00
], [ 'post_id' , true ]);
2015-05-06 13:42:02 +00:00
// Add last poster data and the details about the post as well
2015-09-16 22:34:36 +02:00
$return [ $forum [ 'forum_category' ]][ 'forums' ][ $forum [ 'forum_id' ]][ 'last_poster' ] = new User ( $lastPost [ 'poster_id' ]);
// Add last poster data and the details about the post as well
$return [ $forum [ 'forum_category' ]][ 'forums' ][ $forum [ 'forum_id' ]][ 'last_post' ] = array_merge (
empty ( $lastPost ) ? [] : $lastPost ,
[ 'elapsed' => Main :: timeElapsed ( $lastPost [ 'post_time' ])]
);
2015-05-06 13:42:02 +00:00
}
}
// Return the resorted data
return $return ;
}
2015-05-03 16:25:57 +00:00
2015-06-27 21:29:37 +02:00
// Get a forum or category
2015-09-14 22:51:23 +02:00
public static function getForum ( $id )
{
2015-06-27 21:29:37 +02:00
// Get the forumlist from the database
$forums = Database :: fetch ( 'forums' );
// Sneak the template in the array
$forums [ 'fb' ] = self :: $emptyForum ;
// Create an array to store the forum once we found it
$forum = [];
// Try to find the requested forum
2015-09-14 22:51:23 +02:00
foreach ( $forums as $list ) {
2015-06-27 21:29:37 +02:00
// Once found set $forum to $list and break the loop
2015-09-14 22:51:23 +02:00
if ( $list [ 'forum_id' ] == $id ) {
2015-06-27 21:29:37 +02:00
$forum [ 'forum' ] = $list ;
break ;
}
}
// If $forum is still empty after the foreach return false
2015-09-14 22:51:23 +02:00
if ( empty ( $forum )) {
2015-06-27 21:29:37 +02:00
return false ;
2015-09-14 22:51:23 +02:00
}
2015-06-27 21:29:37 +02:00
// Create conditions for fetching the forums
$conditions [ 'forum_category' ] = [ $id , '=' ];
// If the current category is 0 (the built in fallback) prevent getting categories
2015-09-14 22:51:23 +02:00
if ( $id == 0 ) {
2015-06-27 21:29:37 +02:00
$conditions [ 'forum_type' ] = [ '1' , '!=' ];
2015-09-14 22:51:23 +02:00
}
2015-06-27 21:29:37 +02:00
// Check if this forum/category has any subforums
$forum [ 'forums' ] = Database :: fetch ( 'forums' , true , $conditions );
// Get the userdata related to last posts
2015-09-14 22:51:23 +02:00
foreach ( $forum [ 'forums' ] as $key => $sub ) {
2015-07-03 19:33:02 +02:00
// Get last post in forum
$lastPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'forum_id' => [ $sub [ 'forum_id' ], '=' ],
2015-07-03 19:33:02 +02:00
], [ 'post_id' , true ]);
2015-09-16 22:34:36 +02:00
$forum [ 'forums' ][ $key ][ 'last_poster' ] = new User ( $lastPost [ 'poster_id' ]);
$forum [ 'forums' ][ $key ][ 'last_post' ] = array_merge (
empty ( $lastPost ) ? [] : $lastPost ,
[ 'elapsed' => Main :: timeElapsed ( $lastPost [ 'post_time' ])]
);
2015-06-27 21:29:37 +02:00
}
// Lastly grab the topics for this forum
2015-07-05 02:03:15 +02:00
$forum [ 'topics' ] = self :: getTopics ( $forum [ 'forum' ][ 'forum_id' ]);
2015-06-27 21:29:37 +02:00
// Return the forum/category
return $forum ;
}
// Getting all topics from a forum
2015-09-14 22:51:23 +02:00
public static function getTopics ( $id )
{
2015-06-27 21:29:37 +02:00
2015-06-28 16:43:46 +02:00
// Get the topics from the database
2015-06-27 21:29:37 +02:00
$topics = Database :: fetch ( 'topics' , true , [
2015-09-14 22:51:23 +02:00
'forum_id' => [ $id , '=' ],
2015-06-27 21:29:37 +02:00
]);
// Get the userdata related to last posts
2015-09-14 22:51:23 +02:00
foreach ( $topics as $key => $topic ) {
2015-07-05 02:03:15 +02:00
// Get the reply count
$topics [ $key ][ 'reply_count' ] = Database :: count ( 'posts' , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $topic [ 'topic_id' ], '=' ],
2015-07-05 02:03:15 +02:00
])[ 0 ];
// Get first post in topics
$firstPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $topic [ 'topic_id' ], '=' ],
2015-07-05 02:03:15 +02:00
]);
2015-09-16 22:34:36 +02:00
$topics [ $key ][ 'first_poster' ] = new User ( $firstPost [ 'poster_id' ]);
$topics [ $key ][ 'first_post' ] = array_merge (
empty ( $firstPost ) ? [] : $firstPost ,
[ 'elapsed' => Main :: timeElapsed ( $firstPost [ 'post_time' ])]
);
2015-06-27 21:29:37 +02:00
2015-07-05 02:03:15 +02:00
// Get last post in topics
$lastPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $topic [ 'topic_id' ], '=' ],
2015-07-05 02:03:15 +02:00
], [ 'post_id' , true ]);
2015-09-16 22:34:36 +02:00
$topics [ $key ][ 'last_poster' ] = new User ( $lastPost [ 'poster_id' ]);
$topics [ $key ][ 'last_post' ] = array_merge (
empty ( $lastPost ) ? [] : $lastPost ,
[ 'elapsed' => Main :: timeElapsed ( $lastPost [ 'post_time' ])]
);
2015-06-27 21:29:37 +02:00
}
return $topics ;
}
2015-06-28 16:43:46 +02:00
// Get posts of a thread
2015-09-14 22:51:23 +02:00
public static function getTopic ( $id , $ignoreView = false )
{
2015-06-28 16:43:46 +02:00
// Get the topic data from the database
$topicInfo = Database :: fetch ( 'topics' , false , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $id , '=' ],
2015-06-28 16:43:46 +02:00
]);
// Check if there actually is anything
2015-09-14 22:51:23 +02:00
if ( empty ( $topicInfo )) {
2015-06-28 16:43:46 +02:00
return false ;
2015-09-14 22:51:23 +02:00
}
2015-06-28 16:43:46 +02:00
2015-07-05 17:03:58 +02:00
// Up the view count
2015-09-14 22:51:23 +02:00
if ( ! $ignoreView ) {
2015-07-05 17:03:58 +02:00
// Get the new count
$topicInfo [ 'topic_views' ] = $topicInfo [ 'topic_views' ] + 1 ;
// Update the count
Database :: update ( 'topics' , [
[
2015-09-14 22:51:23 +02:00
'topic_views' => $topicInfo [ 'topic_views' ],
2015-07-05 17:03:58 +02:00
],
[
2015-09-14 22:51:23 +02:00
'topic_id' => [ $id , '=' ],
],
2015-07-05 17:03:58 +02:00
]);
}
2015-06-28 16:43:46 +02:00
// Get the posts from the database
$rawPosts = Database :: fetch ( 'posts' , true , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $id , '=' ],
2015-06-28 16:43:46 +02:00
]);
// Create storage array
$topic = [];
// Add forum data
$topic [ 'forum' ] = self :: getForum ( $topicInfo [ 'forum_id' ]);
// Store the topic info
$topic [ 'topic' ] = $topicInfo ;
2015-07-05 02:03:15 +02:00
// Get first post in topics
$firstPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $topic [ 'topic' ][ 'topic_id' ], '=' ],
2015-07-05 02:03:15 +02:00
]);
2015-09-16 22:34:36 +02:00
$topic [ 'topic' ][ 'first_poster' ] = new User ( $firstPost [ 'poster_id' ]);
$topic [ 'topic' ][ 'first_post' ] = array_merge (
empty ( $firstPost ) ? [] : $firstPost ,
[ 'elapsed' => Main :: timeElapsed ( $firstPost [ 'post_time' ])]
);
2015-06-28 16:43:46 +02:00
2015-07-05 02:03:15 +02:00
// Get last post in topics
$lastPost = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'topic_id' => [ $topic [ 'topic' ][ 'topic_id' ], '=' ],
2015-07-05 02:03:15 +02:00
], [ 'post_id' , true ]);
2015-09-16 22:34:36 +02:00
$topic [ 'topic' ][ 'last_poster' ] = new User ( $lastPost [ 'poster_id' ]);
$topic [ 'topic' ][ 'last_post' ] = array_merge (
empty ( $lastPost ) ? [] : $lastPost ,
[ 'elapsed' => Main :: timeElapsed ( $lastPost [ 'post_time' ])]
);
2015-06-28 16:43:46 +02:00
// Create space for posts
$topic [ 'posts' ] = [];
// Parse the data of every post
2015-09-14 22:51:23 +02:00
foreach ( $rawPosts as $post ) {
2015-06-28 16:43:46 +02:00
// Add post and metadata to the global storage array
$topic [ 'posts' ][ $post [ 'post_id' ]] = array_merge ( $post , [
2015-09-16 22:34:36 +02:00
'user' => ( new User ( $post [ 'poster_id' ])),
'elapsed' => Main :: timeElapsed ( $post [ 'post_time' ]),
2015-09-14 22:51:23 +02:00
'is_op' => ( $post [ 'poster_id' ] == $firstPost [ 'poster_id' ] ? '1' : '0' ),
'parsed_post' => self :: parseMarkUp ( $post [ 'post_text' ], $post [ 'parse_mode' ], $post [ 'enable_emotes' ]),
2015-09-14 23:41:43 +02:00
'signature' => empty ( $_POSTER [ 'userData' ][ 'signature' ]) ?
'' :
self :: parseMarkUp (
$_POSTER [ 'userData' ][ 'signature' ][ 'text' ],
$_POSTER [ 'userData' ][ 'signature' ][ 'mode' ]
),
2015-06-28 16:43:46 +02:00
]);
// Just in case
unset ( $_POSTER );
}
// Return the compiled topic data
return $topic ;
}
// Get a topic ID from a post ID
2015-09-14 22:51:23 +02:00
public static function getTopicIdFromPostId ( $id )
{
2015-06-28 16:43:46 +02:00
// Get the post
$post = Database :: fetch ( 'posts' , false , [
2015-09-14 22:51:23 +02:00
'post_id' => [ $id , '=' ],
2015-06-28 16:43:46 +02:00
]);
// Return false if nothing was returned
2015-09-14 22:51:23 +02:00
if ( empty ( $post )) {
2015-06-28 16:43:46 +02:00
return false ;
2015-09-14 22:51:23 +02:00
}
2015-06-28 16:43:46 +02:00
// Return the topic id
return $post [ 'topic_id' ];
}
// Parse different markup flavours
2015-09-14 22:51:23 +02:00
public static function parseMarkUp ( $text , $mode , $emotes = 1 )
{
2015-06-28 16:43:46 +02:00
2015-06-29 14:40:00 +02:00
// Clean string
$text = Main :: cleanString ( $text );
2015-07-05 17:03:58 +02:00
// Parse emotes
2015-09-14 22:51:23 +02:00
if ( $emotes ) {
2015-07-05 17:03:58 +02:00
$text = Main :: parseEmotes ( $text );
2015-09-14 22:51:23 +02:00
}
2015-07-05 17:03:58 +02:00
2015-06-28 16:43:46 +02:00
// Switch between modes
2015-09-14 22:51:23 +02:00
switch ( $mode ) {
2015-06-28 16:43:46 +02:00
case 1 :
return Main :: bbParse ( $text );
2015-09-14 22:51:23 +02:00
2015-06-28 16:43:46 +02:00
case 2 :
return Main :: mdParse ( $text );
2015-06-29 14:40:00 +02:00
2015-06-28 16:43:46 +02:00
case 0 :
default :
return $text ;
}
}
2015-07-08 15:09:57 +02:00
// Get forum statistics of a user
2015-09-14 22:51:23 +02:00
public static function getUserStats ( $uid )
{
2015-07-08 15:09:57 +02:00
// Collect the stats
return [
2015-09-14 23:41:43 +02:00
'posts' => Database :: count (
'posts' ,
[ 'poster_id' => [ $uid , '=' ]]
)[ 0 ],
2015-09-14 23:52:17 +02:00
'topics' => count ( Database :: fetch (
2015-09-14 23:41:43 +02:00
'posts' ,
true ,
[ 'poster_id' => [ $uid , '=' ]],
[ 'post_time' ],
null ,
[ 'topic_id' ]
2015-09-14 23:52:17 +02:00
)),
2015-07-08 15:09:57 +02:00
];
}
2015-05-23 03:31:42 +00:00
// Creating a new post
2015-09-14 22:51:23 +02:00
public static function createPost ( $subject , $text , $enableMD , $enableSig , $forum , $type = 0 , $status = 0 , $topic = 0 )
{
2015-05-23 03:31:42 +00:00
// Check if this post is OP
2015-09-14 22:51:23 +02:00
if ( ! $topic ) {
2015-05-23 03:31:42 +00:00
// If so create a new topic
Database :: insert ( 'topics' , [
2015-09-14 22:51:23 +02:00
'forum_id' => $forum ,
'topic_hidden' => 0 ,
'topic_title' => $subject ,
'topic_time' => time (),
'topic_time_limit' => 0 ,
'topic_last_reply' => 0 ,
'topic_views' => 0 ,
'topic_replies' => 0 ,
'topic_status' => $status ,
'topic_status_change' => 0 ,
'topic_type' => $type ,
'topic_first_post_id' => 0 ,
'topic_first_poster_id' => Session :: $userId ,
2015-05-23 03:31:42 +00:00
]);
}
}
2015-05-03 16:25:57 +00:00
}