takin out the trash
This commit is contained in:
parent
3b2df3b96c
commit
1962ff99a6
50 changed files with 585 additions and 592 deletions
|
@ -1,60 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the ban manager.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
/**
|
||||
* User banishment management.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Bans
|
||||
{
|
||||
/**
|
||||
* Checks if a user is banned.
|
||||
*
|
||||
* @param int $uid The ID of the user that is being checked.
|
||||
*
|
||||
* @return array|bool Either false or an array containing information about the ban.
|
||||
*/
|
||||
public static function checkBan($uid)
|
||||
{
|
||||
|
||||
// Attempt to get a ban from this user
|
||||
$bans = DB::table('bans')
|
||||
->where('user_id', $uid)
|
||||
->get();
|
||||
|
||||
// Reverse the array so new bans are listed first
|
||||
$bans = array_reverse($bans);
|
||||
|
||||
// Go over each ban
|
||||
foreach ($bans as $ban) {
|
||||
// Check if it hasn't expired
|
||||
if ($ban->ban_end != 0 && $ban->ban_end < time()) {
|
||||
// If it has delete the entry and continue
|
||||
DB::table('bans')
|
||||
->where('ban_id', $ban->ban_id)
|
||||
->delete();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Return the ban if all checks were passed
|
||||
return [
|
||||
'user' => $ban->user_id,
|
||||
'issuer' => $ban->ban_moderator,
|
||||
'issued' => $ban->ban_begin,
|
||||
'expires' => $ban->ban_end,
|
||||
'reason' => $ban->ban_reason,
|
||||
];
|
||||
}
|
||||
|
||||
// Else just return false
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -24,6 +24,7 @@ class Comment
|
|||
public $upvotes = 0;
|
||||
public $downvotes = 0;
|
||||
private $replyCache = [];
|
||||
private $parsedCache = "";
|
||||
|
||||
public function __construct($id = 0)
|
||||
{
|
||||
|
@ -69,6 +70,19 @@ class Comment
|
|||
}
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
foreach ($this->replies() as $reply) {
|
||||
$reply->delete();
|
||||
}
|
||||
|
||||
DB::table('comments')
|
||||
->where('comment_id', $this->id)
|
||||
->delete();
|
||||
|
||||
$this->id = 0;
|
||||
}
|
||||
|
||||
private function getVotes()
|
||||
{
|
||||
$votes = DB::table('comment_votes')
|
||||
|
@ -77,20 +91,30 @@ class Comment
|
|||
|
||||
foreach ($votes as $vote) {
|
||||
if ($vote->vote_state) {
|
||||
$upvotes += 1;
|
||||
$this->upvotes += 1;
|
||||
} else {
|
||||
$downvotes += 1;
|
||||
$this->downvotes += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function parsed()
|
||||
{
|
||||
if (!$this->parsedCache) {
|
||||
$this->parsedCache = BBcode::parseEmoticons(Utils::cleanString($this->text));
|
||||
}
|
||||
|
||||
return $this->parsedCache;
|
||||
}
|
||||
|
||||
public function replies()
|
||||
{
|
||||
if (!$this->replyCache) {
|
||||
$commentIds = DB::table('comments')
|
||||
->where('comment_reply_to', $this->id)
|
||||
->orderBy('comment_id', 'desc')
|
||||
->get(['comment_id']);
|
||||
$commentIds = array_column($comments, 'comment_id');
|
||||
$commentIds = array_column($commentIds, 'comment_id');
|
||||
|
||||
foreach ($commentIds as $comment) {
|
||||
$this->replyCache[$comment] = new Comment($comment);
|
||||
|
|
38
libraries/Controllers/CommentsController.php
Normal file
38
libraries/Controllers/CommentsController.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the comments controller.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Controllers;
|
||||
|
||||
use Sakura\Comment;
|
||||
|
||||
/**
|
||||
* Handles comment stuff.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class CommentsController extends Controller
|
||||
{
|
||||
public function post($category = '', $reply = 0)
|
||||
{
|
||||
global $currentUser;
|
||||
|
||||
// todo: make not shit
|
||||
|
||||
$text = isset($_POST['text']) ? $_POST['text'] : '';
|
||||
|
||||
$comment = new Comment;
|
||||
|
||||
$comment->category = $category;
|
||||
$comment->time = time();
|
||||
$comment->reply = (int) $reply;
|
||||
$comment->user = $currentUser->id;
|
||||
$comment->text = $text;
|
||||
|
||||
$comment->save();
|
||||
}
|
||||
}
|
|
@ -85,8 +85,7 @@ class FileController extends Controller
|
|||
return $this->serve($deactive['data'], $deactive['mime'], $deactive['name']);
|
||||
}
|
||||
|
||||
if ($user->checkBan()
|
||||
|| $user->permission(Site::RESTRICTED)) {
|
||||
if ($user->permission(Site::RESTRICTED)) {
|
||||
return $this->serve($banned['data'], $banned['mime'], $banned['name']);
|
||||
}
|
||||
|
||||
|
@ -126,7 +125,6 @@ class FileController extends Controller
|
|||
$user = User::construct($id);
|
||||
|
||||
if ($user->permission(Site::DEACTIVATED)
|
||||
|| $user->checkBan()
|
||||
|| $user->permission(Site::RESTRICTED)
|
||||
|| !$user->background) {
|
||||
return $this->serve($none['data'], $none['mime'], $none['name']);
|
||||
|
@ -164,7 +162,6 @@ class FileController extends Controller
|
|||
$user = User::construct($id);
|
||||
|
||||
if ($user->permission(Site::DEACTIVATED)
|
||||
|| $user->checkBan()
|
||||
|| $user->permission(Site::RESTRICTED)
|
||||
|| !$user->header) {
|
||||
return $this->serve($none['data'], $none['mime'], $none['name']);
|
||||
|
|
|
@ -184,7 +184,7 @@ class ForumController extends Controller
|
|||
]);
|
||||
|
||||
// Print page contents
|
||||
return Template::render('forum/viewforum');
|
||||
return Template::render('forum/forum');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -295,7 +295,7 @@ class ForumController extends Controller
|
|||
Template::vars(compact('forum', 'thread'));
|
||||
|
||||
// Print page contents
|
||||
return Template::render('forum/viewtopic');
|
||||
return Template::render('forum/thread');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -699,7 +699,7 @@ class ForumController extends Controller
|
|||
|
||||
Template::vars(compact('forum'));
|
||||
|
||||
return Template::render('forum/viewtopic');
|
||||
return Template::render('forum/thread');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace Sakura\Controllers;
|
|||
|
||||
use Sakura\Config;
|
||||
use Sakura\DB;
|
||||
use Sakura\News;
|
||||
use Sakura\News\Category;
|
||||
use Sakura\Template;
|
||||
use Sakura\User;
|
||||
|
||||
|
@ -60,10 +60,12 @@ class MetaController extends Controller
|
|||
$onlineUsers[$user->id] = $user;
|
||||
}
|
||||
|
||||
// Get news
|
||||
$news = new Category(Config::get('site_news_category'));
|
||||
|
||||
// Merge index specific stuff with the global render data
|
||||
Template::vars([
|
||||
'news' => new News(Config::get('site_news_category')),
|
||||
'newsCount' => Config::get('front_page_news_posts'),
|
||||
'news' => $news->posts(Config::get('front_page_news_posts')),
|
||||
'stats' => [
|
||||
'userCount' => DB::table('users')
|
||||
->where('password_algo', '!=', 'disabled')
|
||||
|
@ -81,36 +83,7 @@ class MetaController extends Controller
|
|||
]);
|
||||
|
||||
// Return the compiled page
|
||||
return Template::render('main/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the news pages.
|
||||
*
|
||||
* @return mixed HTML for the correct news section.
|
||||
*/
|
||||
public function news()
|
||||
{
|
||||
// Get arguments
|
||||
$args = func_get_args();
|
||||
$category = isset($args[0]) && !is_numeric($args[0]) ? $args[0] : Config::get('site_news_category');
|
||||
$post = isset($args[1]) && is_numeric($args[1]) ? $args[1] : (
|
||||
isset($args[0]) && is_numeric($args[0]) ? $args[0] : 0
|
||||
);
|
||||
|
||||
// Create news object
|
||||
$news = new News($category);
|
||||
|
||||
// Set parse variables
|
||||
Template::vars([
|
||||
'news' => $news,
|
||||
'postsPerPage' => Config::get('news_posts_per_page'),
|
||||
'viewPost' => $post != 0,
|
||||
'postExists' => $news->postExists($post),
|
||||
]);
|
||||
|
||||
// Print page contents
|
||||
return Template::render('main/news');
|
||||
return Template::render('meta/index');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -134,7 +107,7 @@ class MetaController extends Controller
|
|||
]);
|
||||
|
||||
// Print page contents
|
||||
return Template::render('main/faq');
|
||||
return Template::render('meta/faq');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,7 +147,7 @@ class MetaController extends Controller
|
|||
}
|
||||
|
||||
// Return the compiled page
|
||||
return Template::render('main/infopage');
|
||||
return Template::render('meta/infopage');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -184,6 +157,6 @@ class MetaController extends Controller
|
|||
*/
|
||||
public function search()
|
||||
{
|
||||
return Template::render('main/search');
|
||||
return Template::render('meta/search');
|
||||
}
|
||||
}
|
||||
|
|
64
libraries/Controllers/NewsController.php
Normal file
64
libraries/Controllers/NewsController.php
Normal file
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the news controller.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Controllers;
|
||||
|
||||
use Sakura\Config;
|
||||
use Sakura\News\Category;
|
||||
use Sakura\News\Post;
|
||||
use Sakura\Template;
|
||||
|
||||
/**
|
||||
* News controller.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class NewsController extends Controller
|
||||
{
|
||||
public function category($category = '')
|
||||
{
|
||||
// Check if the category is set
|
||||
if ($category === '') {
|
||||
// Fetch the default category from the config
|
||||
$category = Config::get('site_news_category');
|
||||
}
|
||||
|
||||
// Create the category object
|
||||
$category = new Category($category);
|
||||
|
||||
if (!$category->posts()) {
|
||||
$message = "This news category doesn't exist!";
|
||||
|
||||
Template::vars(compact('message'));
|
||||
|
||||
return Template::render('global/information');
|
||||
}
|
||||
|
||||
Template::vars(compact('category'));
|
||||
|
||||
return Template::render('news/category');
|
||||
}
|
||||
|
||||
public function post($id = 0)
|
||||
{
|
||||
// Create the post object
|
||||
$post = new Post($id);
|
||||
|
||||
if (!$post->id) {
|
||||
$message = "This news post doesn't exist!";
|
||||
|
||||
Template::vars(compact('message'));
|
||||
|
||||
return Template::render('global/information');
|
||||
}
|
||||
|
||||
Template::vars(compact('post'));
|
||||
|
||||
return Template::render('news/post');
|
||||
}
|
||||
}
|
71
libraries/Controllers/NotificationsController.php
Normal file
71
libraries/Controllers/NotificationsController.php
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the notification controllers.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\Controllers;
|
||||
|
||||
use Sakura\Notification;
|
||||
use Sakura\Perms\Site;
|
||||
use Sakura\User;
|
||||
|
||||
/**
|
||||
* Notification stuff.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class NotificationsController extends Controller
|
||||
{
|
||||
/**
|
||||
* Get the notification JSON object for the currently authenticated user.
|
||||
*
|
||||
* @return string The JSON object.
|
||||
*/
|
||||
public function notifications()
|
||||
{
|
||||
// TODO: add friend on/offline messages
|
||||
global $currentUser;
|
||||
|
||||
// Set json content type
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
return json_encode(
|
||||
$currentUser->notifications(),
|
||||
JSON_FORCE_OBJECT | JSON_NUMERIC_CHECK | JSON_BIGINT_AS_STRING
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a notification as read.
|
||||
*
|
||||
* @param int The ID of the notification.
|
||||
*
|
||||
* @return string Not entirely set on this one yet but 1 for success and 0 for fail.
|
||||
*/
|
||||
public function mark($id = 0)
|
||||
{
|
||||
global $currentUser;
|
||||
|
||||
// Check permission
|
||||
if ($currentUser->permission(Site::DEACTIVATED)) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
// Create the notification object
|
||||
$alert = new Notification($id);
|
||||
|
||||
// Verify that the currently authed user is the one this alert is for
|
||||
if ($alert->user !== $currentUser->id) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
// Toggle the read status and save
|
||||
$alert->toggleRead();
|
||||
$alert->save();
|
||||
|
||||
return '1';
|
||||
}
|
||||
}
|
|
@ -49,7 +49,7 @@ class PremiumController extends Controller
|
|||
|
||||
Template::vars(compact('price', 'amountLimit'));
|
||||
|
||||
return Template::render('main/support');
|
||||
return Template::render('premium/index');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -180,6 +180,6 @@ class PremiumController extends Controller
|
|||
*/
|
||||
public function complete()
|
||||
{
|
||||
return Template::render('main/premiumcomplete');
|
||||
return Template::render('premium/complete');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ namespace Sakura\Controllers;
|
|||
|
||||
use Sakura\Config;
|
||||
use Sakura\DB;
|
||||
use Sakura\Notification;
|
||||
use Sakura\Perms\Site;
|
||||
use Sakura\Rank;
|
||||
use Sakura\Router;
|
||||
|
@ -63,7 +62,7 @@ class UserController extends Controller
|
|||
Template::vars(compact('profile'));
|
||||
|
||||
// Print page contents
|
||||
return Template::render('main/profile');
|
||||
return Template::render('user/profile');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -107,56 +106,6 @@ class UserController extends Controller
|
|||
Template::vars(compact('ranks', 'rank', 'membersPerPage'));
|
||||
|
||||
// Render the template
|
||||
return Template::render('main/memberlist');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the notification JSON object for the currently authenticated user.
|
||||
*
|
||||
* @return string The JSON object.
|
||||
*/
|
||||
public function notifications()
|
||||
{
|
||||
// TODO: add friend on/offline messages
|
||||
global $currentUser;
|
||||
|
||||
// Set json content type
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
return json_encode(
|
||||
$currentUser->notifications(),
|
||||
JSON_FORCE_OBJECT | JSON_NUMERIC_CHECK | JSON_BIGINT_AS_STRING
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a notification as read.
|
||||
*
|
||||
* @param int The ID of the notification.
|
||||
*
|
||||
* @return string Not entirely set on this one yet but 1 for success and 0 for fail.
|
||||
*/
|
||||
public function markNotification($id = 0)
|
||||
{
|
||||
global $currentUser;
|
||||
|
||||
// Check permission
|
||||
if ($currentUser->permission(Site::DEACTIVATED)) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
// Create the notification object
|
||||
$alert = new Notification($id);
|
||||
|
||||
// Verify that the currently authed user is the one this alert is for
|
||||
if ($alert->user !== $currentUser->id) {
|
||||
return '0';
|
||||
}
|
||||
|
||||
// Toggle the read status and save
|
||||
$alert->toggleRead();
|
||||
$alert->save();
|
||||
|
||||
return '1';
|
||||
return Template::render('user/members');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Holds the news handler.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura;
|
||||
|
||||
/**
|
||||
* Used to serve news posts.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class News
|
||||
{
|
||||
/**
|
||||
* Array containing news posts.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $posts = [];
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param mixed $category ID of the category that should be constructed.
|
||||
*/
|
||||
public function __construct($category)
|
||||
{
|
||||
|
||||
// Get the news posts and assign them to $posts
|
||||
$posts = DB::table('news')
|
||||
->where('news_category', $category)
|
||||
->orderBy('news_id', 'desc')
|
||||
->get();
|
||||
|
||||
// Attach poster data
|
||||
foreach ($posts as $post) {
|
||||
// See Comments.php
|
||||
$post = get_object_vars($post);
|
||||
|
||||
// Attach the poster
|
||||
$post['news_poster'] = User::construct($post['user_id']);
|
||||
|
||||
// Load comments
|
||||
$post['news_comments'] = $this->comments = new Comments('news-' . $category . '-' . $post['news_id']);
|
||||
|
||||
// Add post to posts array
|
||||
$this->posts[$post['news_id']] = $post;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of news posts.
|
||||
*
|
||||
* @return int Number of posts.
|
||||
*/
|
||||
public function getCount()
|
||||
{
|
||||
return count($this->posts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a post exists in this category.
|
||||
*
|
||||
* @param int $pid The ID of the post.
|
||||
*
|
||||
* @return int If true the post it gets returns, else 0.
|
||||
*/
|
||||
public function postExists($pid)
|
||||
{
|
||||
return array_key_exists($pid, $this->posts) ? $pid : 0;
|
||||
}
|
||||
}
|
|
@ -1 +1,46 @@
|
|||
donderdag
|
||||
<?php
|
||||
/**
|
||||
* Holds the news category object.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\News;
|
||||
|
||||
use Sakura\DB;
|
||||
|
||||
/**
|
||||
* News category object.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Category
|
||||
{
|
||||
public $name = "";
|
||||
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function posts($limit = 0)
|
||||
{
|
||||
$postIds = DB::table('news')
|
||||
->where('news_category', $this->name)
|
||||
->orderBy('news_id', 'desc');
|
||||
if ($limit) {
|
||||
$postIds->limit($limit);
|
||||
}
|
||||
$postIds = $postIds->get(['news_id']);
|
||||
$postIds = array_column($postIds, 'news_id');
|
||||
|
||||
$posts = [];
|
||||
|
||||
foreach ($postIds as $post) {
|
||||
$posts[$post] = new Post($post);
|
||||
}
|
||||
|
||||
return $posts;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +1,117 @@
|
|||
vrijdag
|
||||
<?php
|
||||
/**
|
||||
* Holds the news post object.
|
||||
*
|
||||
* @package Sakura
|
||||
*/
|
||||
|
||||
namespace Sakura\News;
|
||||
|
||||
use Sakura\Comment;
|
||||
use Sakura\DB;
|
||||
use Sakura\User;
|
||||
|
||||
/**
|
||||
* News post object.
|
||||
*
|
||||
* @package Sakura
|
||||
* @author Julian van de Groep <me@flash.moe>
|
||||
*/
|
||||
class Post
|
||||
{
|
||||
const COMMENT_CATEGORY_FORMAT = "news-%s-%u";
|
||||
|
||||
public $id = 0;
|
||||
public $category = "";
|
||||
public $user = 0;
|
||||
public $time = 0;
|
||||
public $title = "";
|
||||
public $text = "";
|
||||
private $commentCountCache = 0;
|
||||
private $commentsCache = [];
|
||||
|
||||
public function __construct($id = 0)
|
||||
{
|
||||
// Get comment data from the database
|
||||
$data = DB::table('news')
|
||||
->where('news_id', $id)
|
||||
->get();
|
||||
|
||||
// Check if anything was returned and assign data
|
||||
if ($data) {
|
||||
$data = $data[0];
|
||||
|
||||
$this->id = $data->news_id;
|
||||
$this->category = $data->news_category;
|
||||
$this->user = $data->user_id;
|
||||
$this->time = $data->news_timestamp;
|
||||
$this->title = $data->news_title;
|
||||
$this->text = $data->news_content;
|
||||
}
|
||||
}
|
||||
|
||||
public function save()
|
||||
{
|
||||
// Create submission data, insert and update take the same format
|
||||
$data = [
|
||||
'news_category' => $this->category,
|
||||
'user_id' => $this->user,
|
||||
'news_timestamp' => $this->time,
|
||||
'news_title' => $this->title,
|
||||
'news_content' => $this->text,
|
||||
];
|
||||
|
||||
// Update if id isn't 0
|
||||
if ($this->id) {
|
||||
DB::table('news')
|
||||
->where('news_id', $this->id)
|
||||
->update($data);
|
||||
} else {
|
||||
$this->id = DB::table('news')
|
||||
->insertGetId($data);
|
||||
}
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
DB::table('news')
|
||||
->where('news_id', $this->id)
|
||||
->delete();
|
||||
|
||||
$this->id = 0;
|
||||
}
|
||||
|
||||
public function userData()
|
||||
{
|
||||
return User::construct($this->user);
|
||||
}
|
||||
|
||||
public function commentCount()
|
||||
{
|
||||
if (!$this->commentCountCache) {
|
||||
$this->commentCountCache = DB::table('comments')
|
||||
->where('comment_category', sprintf(self::COMMENT_CATEGORY_FORMAT, $this->category, $this->id))
|
||||
->count();
|
||||
}
|
||||
|
||||
return $this->commentCountCache;
|
||||
}
|
||||
|
||||
public function comments()
|
||||
{
|
||||
if (!$this->commentsCache) {
|
||||
$commentIds = DB::table('comments')
|
||||
->where('comment_category', sprintf(self::COMMENT_CATEGORY_FORMAT, $this->category, $this->id))
|
||||
->orderBy('comment_id', 'desc')
|
||||
->where('comment_reply_to', 0)
|
||||
->get(['comment_id']);
|
||||
$commentIds = array_column($commentIds, 'comment_id');
|
||||
|
||||
foreach ($commentIds as $comment) {
|
||||
$this->commentsCache[$comment] = new Comment($comment);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->commentsCache;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -73,15 +73,6 @@ class Notification
|
|||
}
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
DB::table('comments')
|
||||
->where('comment_id', $this->id)
|
||||
->delete();
|
||||
|
||||
$this->id = 0;
|
||||
}
|
||||
|
||||
public function toggleRead()
|
||||
{
|
||||
// Set read to the negative value of itself
|
||||
|
|
|
@ -41,13 +41,6 @@ class Template
|
|||
*/
|
||||
private static $templateName;
|
||||
|
||||
/**
|
||||
* The template options.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $templateOptions;
|
||||
|
||||
/**
|
||||
* The file extension used by template files
|
||||
*/
|
||||
|
@ -60,17 +53,6 @@ class Template
|
|||
*/
|
||||
public static function set($name)
|
||||
{
|
||||
// Assign config path to a variable so we don't have to type it out twice
|
||||
$confPath = ROOT . 'templates/' . $name . '/template.ini';
|
||||
|
||||
// Check if the configuration file exists
|
||||
if (!file_exists($confPath)) {
|
||||
trigger_error('Template configuration does not exist', E_USER_ERROR);
|
||||
}
|
||||
|
||||
// Parse and store the configuration
|
||||
self::$templateOptions = parse_ini_file($confPath, true);
|
||||
|
||||
// Set variables
|
||||
self::$templateName = $name;
|
||||
|
||||
|
|
|
@ -741,16 +741,6 @@ class User
|
|||
return $objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the user is banned.
|
||||
*
|
||||
* @return array|bool Ban status.
|
||||
*/
|
||||
public function checkBan()
|
||||
{
|
||||
return Bans::checkBan($this->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the user has a certaing permission flag.
|
||||
*
|
||||
|
@ -774,12 +764,26 @@ class User
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the comments from the user's profile.
|
||||
* Get the comments from the user's profile.
|
||||
*
|
||||
* @return Comments
|
||||
*/
|
||||
public function profileComments()
|
||||
{
|
||||
return new Comments('profile-' . $this->id);
|
||||
$commentIds = DB::table('comments')
|
||||
->where('comment_category', "profile-{$this->id}")
|
||||
->orderBy('comment_id', 'desc')
|
||||
->where('comment_reply_to', 0)
|
||||
->get(['comment_id']);
|
||||
$commentIds = array_column($commentIds, 'comment_id');
|
||||
|
||||
$comments = [];
|
||||
|
||||
foreach ($commentIds as $comment) {
|
||||
$comments[$comment] = new Comment($comment);
|
||||
}
|
||||
|
||||
return $comments;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1528,7 +1528,7 @@ if (Users::checkLogin()) {
|
|||
Template::vars($renderData);
|
||||
|
||||
// Print page contents
|
||||
echo Template::render('main/settings');
|
||||
echo Template::render('meta/settings');
|
||||
} else {
|
||||
// If not allowed print the restricted page
|
||||
Template::vars($renderData);
|
||||
|
|
61
routes.php
61
routes.php
|
@ -56,9 +56,8 @@ Router::group(['before' => 'loginCheck'], function () {
|
|||
|
||||
// News
|
||||
Router::group(['prefix' => 'news'], function () {
|
||||
Router::get('/', 'MetaController@news', 'news.index');
|
||||
Router::get('/{category}', 'MetaController@news', 'news.category');
|
||||
Router::get('/{category}/{id}', 'MetaController@news', 'news.post');
|
||||
Router::get('/{category:c}?', 'NewsController@category', 'news.category');
|
||||
Router::get('/post/{id:i}', 'NewsController@post', 'news.post');
|
||||
});
|
||||
|
||||
// Forum
|
||||
|
@ -66,8 +65,8 @@ Router::group(['prefix' => 'forum'], function () {
|
|||
// Post
|
||||
Router::group(['prefix' => 'post'], function () {
|
||||
Router::get('/{id:i}', 'ForumController@post', 'forums.post');
|
||||
Router::get('/{id:i}/raw', 'ForumController@postRaw', 'forums.post.raw');
|
||||
Router::group(['before' => 'loginCheck'], function () {
|
||||
Router::get('/{id:i}/raw', 'ForumController@postRaw', 'forums.post.raw');
|
||||
Router::get('/{id:i}/delete', 'ForumController@deletePost', 'forums.post.delete');
|
||||
Router::post('/{id:i}/delete', 'ForumController@deletePost', 'forums.post.delete');
|
||||
Router::post('/{id:i}/edit', 'ForumController@editPost', 'forums.post.edit');
|
||||
|
@ -84,13 +83,15 @@ Router::group(['prefix' => 'forum'], function () {
|
|||
// Forum
|
||||
Router::get('/', 'ForumController@index', 'forums.index');
|
||||
Router::get('/{id:i}', 'ForumController@forum', 'forums.forum');
|
||||
Router::get('/{id:i}/mark', 'ForumController@markForumRead', 'forums.mark');
|
||||
Router::get('/{id:i}/new', 'ForumController@createThread', 'forums.new');
|
||||
Router::post('/{id:i}/new', 'ForumController@createThread', 'forums.new');
|
||||
Router::group(['before' => 'loginCheck'], function () {
|
||||
Router::get('/{id:i}/mark', 'ForumController@markForumRead', 'forums.mark');
|
||||
Router::get('/{id:i}/new', 'ForumController@createThread', 'forums.new');
|
||||
Router::post('/{id:i}/new', 'ForumController@createThread', 'forums.new');
|
||||
});
|
||||
});
|
||||
|
||||
// Members
|
||||
Router::group(['prefix' => 'members'], function () {
|
||||
Router::group(['prefix' => 'members', 'before' => 'loginCheck'], function () {
|
||||
Router::get('/', 'UserController@members', 'members.index');
|
||||
Router::get('/{rank:i}', 'UserController@members', 'members.rank');
|
||||
});
|
||||
|
@ -98,8 +99,17 @@ Router::group(['prefix' => 'members'], function () {
|
|||
// User
|
||||
Router::get('/u/{id}', 'UserController@profile', 'user.profile');
|
||||
Router::get('/u/{id}/header', 'FileController@header', 'user.header');
|
||||
Router::get('/notifications', 'UserController@notifications', 'user.notifications');
|
||||
Router::get('/notifications/{id}/mark', 'UserController@markNotification', 'user.notifications.mark');
|
||||
|
||||
// Notifications
|
||||
Router::group(['prefix' => 'notifications'], function () {
|
||||
Router::get('/', 'NotificationsController@notifications', 'notifications.get');
|
||||
Router::get('/{id}/mark', 'NotificationsController@mark', 'notifications.mark');
|
||||
});
|
||||
|
||||
// Comments
|
||||
Router::group(['prefix' => 'comments', 'before' => 'loginCheck'], function () {
|
||||
Router::post('/{category:c}/post/{reply:i}?', 'CommentsController@post', 'comments.post');
|
||||
});
|
||||
|
||||
// Files
|
||||
Router::get('/a/{id}', 'FileController@avatar', 'file.avatar');
|
||||
|
@ -116,7 +126,7 @@ Router::group(['prefix' => 'support', 'before' => 'loginCheck'], function () {
|
|||
// Helpers
|
||||
Router::group(['prefix' => 'helper'], function () {
|
||||
// BBcode
|
||||
Router::group(['prefix' => 'bbcode'], function () {
|
||||
Router::group(['prefix' => 'bbcode', 'before' => 'loginCheck'], function () {
|
||||
Router::post('/parse', 'HelperController@bbcodeParse', 'helper.bbcode.parse');
|
||||
});
|
||||
});
|
||||
|
@ -211,35 +221,6 @@ Router::group(['prefix' => 'settings', 'before' => 'loginCheck'], function () {
|
|||
Router::get('/deactivate', 'Settings.AdvancedController@deactivate', 'settings.advanced.deactivate');
|
||||
});
|
||||
});
|
||||
/*
|
||||
* General
|
||||
* - Home (make this not worthless while you're at it)
|
||||
* - Edit Profile
|
||||
* - Site Options
|
||||
* Friends
|
||||
* - Listing
|
||||
* - Requests
|
||||
* Groups
|
||||
* - Listing
|
||||
* - Invites
|
||||
* Notifications (will probably deprecate this entire section at some point but not relevant yet)
|
||||
* - History
|
||||
* Appearance (possibly combine ava, bg and header down into one menu as well as userpage and signature maybe)
|
||||
* - Avatar
|
||||
* - Background
|
||||
* - Header
|
||||
* - Userpage
|
||||
* - Signature
|
||||
* Account (also down to one section maybe)
|
||||
* - E-mail
|
||||
* - Username
|
||||
* - Usertitle
|
||||
* - Password
|
||||
* - Ranks (except this one i guess)
|
||||
* Advanced
|
||||
* - Session manager
|
||||
* - Deactivate account
|
||||
*/
|
||||
|
||||
// Management
|
||||
/*
|
||||
|
|
31
sakura.php
31
sakura.php
|
@ -8,7 +8,7 @@
|
|||
namespace Sakura;
|
||||
|
||||
// Define Sakura version
|
||||
define('SAKURA_VERSION', 20160327);
|
||||
define('SAKURA_VERSION', 20160328);
|
||||
|
||||
// Define Sakura Path
|
||||
define('ROOT', __DIR__ . '/');
|
||||
|
@ -104,11 +104,7 @@ $currentUser = User::construct($authCheck[0]);
|
|||
$urls = new Urls();
|
||||
|
||||
// Prepare the name of the template to load
|
||||
$templateName =
|
||||
!defined('SAKURA_MANAGE')
|
||||
&& isset($currentUser->optionFields()['useMisaki'])
|
||||
&& $currentUser->optionFields()['useMisaki'] ?
|
||||
'misaki' : Config::get('site_style');
|
||||
$templateName = Config::get('site_style');
|
||||
|
||||
if (!defined('SAKURA_NO_TPL')) {
|
||||
// Start templating engine
|
||||
|
@ -181,32 +177,11 @@ if (!defined('SAKURA_NO_TPL')) {
|
|||
if (Config::get('site_closed')) {
|
||||
// Set parse variables
|
||||
Template::vars([
|
||||
'page' => [
|
||||
'message' => Config::get('site_closed_reason'),
|
||||
],
|
||||
'message' => Config::get('site_closed_reason'),
|
||||
]);
|
||||
|
||||
// Print page contents
|
||||
echo Template::render('global/information');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Ban checking
|
||||
if ($authCheck
|
||||
&& !in_array($_SERVER['PHP_SELF'], [$urls->format('AUTH_ACTION', [], false)])
|
||||
&& $ban = Bans::checkBan($currentUser->id)) {
|
||||
// Additional render data
|
||||
Template::vars([
|
||||
'ban' => [
|
||||
'reason' => $ban['reason'],
|
||||
'issued' => $ban['issued'],
|
||||
'expires' => $ban['expires'],
|
||||
'issuer' => (User::construct($ban['issuer'])),
|
||||
],
|
||||
]);
|
||||
|
||||
// Print page contents
|
||||
echo Template::render('main/banned');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -145,8 +145,6 @@
|
|||
<div class="title">Account Standing</div>
|
||||
{% if profileHidden %}
|
||||
<div class="standing" style="color: #444;">Unknown</div>
|
||||
{% elseif profile.checkBan %}
|
||||
<h2 class="standing" style="color: #811;">Banned</h2>
|
||||
{% elseif profile.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %}
|
||||
<h2 class="standing" style="color: #811;">Restricted</h2>
|
||||
{% else %}
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
<li id="comment-{{ comment.comment_id }}">
|
||||
<li id="comment-{{ comment.id }}">
|
||||
<div class="comment">
|
||||
<a class="comment-avatar clean" href="{{ route('user.profile', comment.comment_poster.id) }}" style="background-image: url('{{ route('file.avatar', comment.comment_poster.id) }}');"><span style="color: {{ comment.comment_poster.colour }};">{{ comment.comment_poster.username }}</span></a>
|
||||
<a class="comment-avatar clean" href="{{ route('user.profile', comment.userData.id) }}" style="background-image: url('{{ route('file.avatar', comment.userData.id) }}');"><span style="color: {{ comment.userData.colour }};">{{ comment.userData.username }}</span></a>
|
||||
<div class="comment-pointer"></div>
|
||||
<div class="comment-content">
|
||||
<div class="comment-controls">
|
||||
<ul>
|
||||
{% if comment.comment_poster.id == user.id %}
|
||||
<li><a href="{{ urls.format('COMMENT_DELETE', [comment.comment_id, comment.comment_category, session_id()])}}" class="clean fa fa-trash-o comment-deletion-link" title="Delete" id="comment-action-delete-{{ comment.comment_id }}"></a></li>
|
||||
{% if comment.userData.id == user.id %}
|
||||
<li><a href="{{ urls.format('COMMENT_DELETE', [comment.id, comment.category, session_id()])}}" class="clean fa fa-trash-o comment-deletion-link" title="Delete" id="comment-action-delete-{{ comment.id }}"></a></li>
|
||||
{% else %}
|
||||
<li><a href="{{ urls.format('USER_REPORT', [comment.comment_poster.id]) }}" class="clean fa fa-exclamation-circle" title="Report" id="comment-action-report-{{ comment.comment_id }}"></a></li>
|
||||
<li><a href="{{ urls.format('USER_REPORT', [comment.userData.id]) }}" class="clean fa fa-exclamation-circle" title="Report" id="comment-action-report-{{ comment.id }}"></a></li>
|
||||
{% endif %}
|
||||
<li><a href="javascript:void(0);" onclick="commentReply({{ comment.comment_id }}, '{{ session_id() }}', '{{ comment.comment_category }}', '{{ urls.format('COMMENT_POST') }}', '{{ route('file.avatar', user.id) }}');" class="clean fa fa-reply" title="Reply" id="comment-action-reply-{{ comment.comment_id }}"></a></li>
|
||||
<li class="shown voting like"><a href="{{ urls.format('COMMENT_VOTE', [comment.comment_id, 1, comment.comment_category, session_id()])}}" class="clean comment-like-link" id="comment-action-like-{{ comment.comment_id }}"><span class="fa fa-thumbs-up"></span> <span id="comment-{{ comment.comment_id }}-likes">{{ comment.comment_likes }}</span></a></li>
|
||||
<li class="shown voting dislike"><a id="comment-action-dislike-{{ comment.comment_id }}" href="{{ urls.format('COMMENT_VOTE', [comment.comment_id, 0, comment.comment_category, session_id()])}}" class="clean comment-dislike-link"><span class="fa fa-thumbs-down"></span> <span id="comment-{{ comment.comment_id }}-dislikes">{{ comment.comment_dislikes }}</span></a></li>
|
||||
<li><a href="javascript:void(0);" onclick="commentReply({{ comment.id }}, '{{ session_id() }}', '{{ comment.category }}', '{{ urls.format('COMMENT_POST') }}', '{{ route('file.avatar', user.id) }}');" class="clean fa fa-reply" title="Reply" id="comment-action-reply-{{ comment.id }}"></a></li>
|
||||
<li class="shown voting like"><a href="{{ urls.format('COMMENT_VOTE', [comment.id, 1, comment.category, session_id()])}}" class="clean comment-like-link" id="comment-action-like-{{ comment.id }}"><span class="fa fa-thumbs-up"></span> <span id="comment-{{ comment.id }}-likes">{{ comment.upvotes }}</span></a></li>
|
||||
<li class="shown voting dislike"><a id="comment-action-dislike-{{ comment.id }}" href="{{ urls.format('COMMENT_VOTE', [comment.id, 0, comment.category, session_id()])}}" class="clean comment-dislike-link"><span class="fa fa-thumbs-down"></span> <span id="comment-{{ comment.id }}-dislikes">{{ comment.downvotes }}</span></a></li>
|
||||
</ul>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
<div class="comment-text">
|
||||
{{ comment.comment_text|raw|nl2br }}
|
||||
{{ comment.parsed|raw|nl2br }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ul>
|
||||
{% for comment in comment.comment_replies %}
|
||||
{% for comment in comment.replies %}
|
||||
{% include 'elements/comment.twig' %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
{% if not (viewPost and postExists) %}<a href="{{ route('news.post', [post.news_category, post.news_id]) }}" class="news-head" id="{{ post.news_category }}_{{ post.news_id }}">{{ post.news_title }}</a>{% endif %}
|
||||
{% if newsHideTitle is not defined %}<a href="{{ route('news.post', post.id) }}" class="news-head" id="p{{ post.id }}">{{ post.title }}</a>{% endif %}
|
||||
<div class="news-body">
|
||||
<a class="no-underline" href="{{ route('user.profile', post.news_poster.id) }}">
|
||||
<a class="no-underline" href="{{ route('user.profile', post.userData.id) }}">
|
||||
<div class="news-poster">
|
||||
<img src="{{ route('file.avatar', post.news_poster.id) }}" alt="{{ post.news_poster.username }}" class="default-avatar-setting" />
|
||||
<h1 style="color: {{ post.news_poster.colour }}; text-shadow: 0 0 7px {% if post.news_poster.colour != 'inherit' %}{{ post.news_poster.colour }}{% else %}#222{% endif %}; padding: 0 0 10px;">{{ post.news_poster.username }}</h1>
|
||||
<img src="{{ route('file.avatar', post.userData.id) }}" alt="{{ post.userData.username }}" class="default-avatar-setting" />
|
||||
<h1 style="color: {{ post.userData.colour }}; text-shadow: 0 0 7px {% if post.userData.colour != 'inherit' %}{{ post.userData.colour }}{% else %}#222{% endif %}; padding: 0 0 10px;">{{ post.userData.username }}</h1>
|
||||
</div>
|
||||
</a>
|
||||
<div class="bbcode">
|
||||
{{ post.news_content|raw }}
|
||||
{{ post.text|raw }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
<div class="news-post-time">
|
||||
Posted <time>{{ post.news_timestamp|date(sakura.dateFormat) }}</time>{% if not (viewPost and postExists) %} <a class="default" href="{{ route('news.post', [post.news_category, post.news_id]) }}#comments">{{ post.news_comments.count }} comment{% if post.news_comments.count != 1 %}s{% endif %}</a>{% endif %}
|
||||
Posted <time>{{ post.time|date(sakura.dateFormat) }}</time>
|
||||
{% if newsHideCommentCount is not defined %}<a class="default" href="{{ route('news.post', post.id) }}#comments">{{ post.commentCount }} comment{% if post.commentCount != 1 %}s{% endif %}</a>{% endif %}
|
||||
</div>
|
||||
|
|
55
templates/yuuno/forum/elements/forumBase.twig
Normal file
55
templates/yuuno/forum/elements/forumBase.twig
Normal file
|
@ -0,0 +1,55 @@
|
|||
<div class="head">{{ title }}</div>
|
||||
<div class="forumList">
|
||||
{% for forum in forum.forums %}
|
||||
{% if forum.type == 1 %}
|
||||
{% if forum.forums|length and forum.permission(constant('Sakura\\Perms\\Forum::VIEW'), user.id) %}
|
||||
<div class="forumCategory">
|
||||
{% if forum.type != 1 %}Subforums{% else %}<a href="{{ route('forums.forum', forum.id) }}" class="clean">{{ forum.name }}</a>{% endif %}
|
||||
</div>
|
||||
{% for forum in forum.forums %}
|
||||
{% include 'forum/elements/forumEntry.twig' %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% include 'forum/elements/forumEntry.twig' %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if not forum.type and forum.id > 0 %}
|
||||
{% set threads = forum.threads|batch(25) %}
|
||||
|
||||
{% set paginationPages = threads %}
|
||||
{% set paginationUrl %}{{ route('forums.forum', forum.id) }}{% endset %}
|
||||
|
||||
{% include 'forum/elements/forumBtns.twig' %}
|
||||
{% if forum.threads %}
|
||||
<table class="topicList">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Topic</th>
|
||||
<th>Author</th>
|
||||
<th></th>
|
||||
<th>Last post</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Topic</th>
|
||||
<th>Author</th>
|
||||
<th></th>
|
||||
<th>Last post</th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
{% for thread in threads[get.page|default(1) - 1] %}
|
||||
{% include 'forum/elements/topicEntry.twig' %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<h1 class="stylised" style="margin: 2em auto; text-align: center;">There are no posts in this forum!</h1>
|
||||
{% endif %}
|
||||
{% include 'forum/elements/forumBtns.twig' %}
|
||||
{% endif %}
|
|
@ -15,7 +15,7 @@
|
|||
<a href="{{ forumMarkRead }}" class="forumbtn"><span class="fa fa-check-square-o"></span> Mark as Read</a>
|
||||
{% endif %}
|
||||
{% if thread.id and showMod %}
|
||||
{% include 'forum/forumMod.twig' %}
|
||||
{% include 'forum/elements/forumMod.twig' %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% include 'elements/pagination.twig' %}
|
|
@ -1,55 +1,17 @@
|
|||
<div class="head">{{ title }}</div>
|
||||
<div class="forumList">
|
||||
{% for forum in forum.forums %}
|
||||
{% if forum.type == 1 %}
|
||||
{% if forum.forums|length and forum.permission(constant('Sakura\\Perms\\Forum::VIEW'), user.id) %}
|
||||
<div class="forumCategory">
|
||||
{% if forum.type != 1 %}Subforums{% else %}<a href="{{ route('forums.forum', forum.id) }}" class="clean">{{ forum.name }}</a>{% endif %}
|
||||
</div>
|
||||
{% for forum in forum.forums %}
|
||||
{% include 'forum/forumEntry.twig' %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% include 'forum/forumEntry.twig' %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if not forum.type and forum.id > 0 %}
|
||||
{% set threads = forum.threads|batch(25) %}
|
||||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% set paginationPages = threads %}
|
||||
{% set paginationUrl %}{{ route('forums.forum', forum.id) }}{% endset %}
|
||||
{% set title %}Forums / {{ forum.name }}{% endset %}
|
||||
|
||||
{% include 'forum/forumBtns.twig' %}
|
||||
{% if forum.threads %}
|
||||
<table class="topicList">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Topic</th>
|
||||
<th>Author</th>
|
||||
<th></th>
|
||||
<th>Last post</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Topic</th>
|
||||
<th>Author</th>
|
||||
<th></th>
|
||||
<th>Last post</th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
{% for thread in threads[get.page|default(1) - 1] %}
|
||||
{% include 'forum/topicEntry.twig' %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<h1 class="stylised" style="margin: 2em auto; text-align: center;">There are no posts in this forum!</h1>
|
||||
{% endif %}
|
||||
{% include 'forum/forumBtns.twig' %}
|
||||
{% endif %}
|
||||
{% set forumBackLink %}{{ route('forums.index') }}{% endset %}
|
||||
{% set forumNewLink %}{{ route('forums.new', forum.id) }}{% endset %}
|
||||
{% set forumMarkRead %}{{ route('forums.mark', forum.id) }}?s={{ session_id() }}{% endset %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content homepage forum viewforum">
|
||||
<div class="content-column">
|
||||
{% include 'forum/elements/forumBase.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="content-left content-column">
|
||||
{% include 'forum/forum.twig' %}
|
||||
{% include 'forum/elements/forumBase.twig' %}
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
<div class="content homepage forum viewtopic">
|
||||
<div class="content-column">
|
||||
<div class="head">{{ forum.name }} / <span id="threadTitle">{{ thread.title }}</span></div>
|
||||
{% include 'forum/forumBtns.twig' %}
|
||||
{% include 'forum/elements/forumBtns.twig' %}
|
||||
<table class="posts">
|
||||
{% if thread is defined %}
|
||||
{% set textCache = session.replyText['t' ~ thread.id] %}
|
||||
|
@ -162,9 +162,9 @@
|
|||
{% endif %}
|
||||
</table>
|
||||
{% if forumReplyLink is defined or thread is not defined %}
|
||||
{% include 'forum/replyForm.twig' %}
|
||||
{% include 'forum/elements/replyForm.twig' %}
|
||||
{% endif %}
|
||||
{% include 'forum/forumBtns.twig' %}
|
||||
{% include 'forum/elements/forumBtns.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1,17 +0,0 @@
|
|||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% set title %}Forums / {{ forum.name }}{% endset %}
|
||||
|
||||
{% set forumBackLink %}{{ route('forums.index') }}{% endset %}
|
||||
{% set forumNewLink %}{{ route('forums.new', forum.id) }}{% endset %}
|
||||
{% set forumMarkRead %}{{ route('forums.mark', forum.id) }}?s={{ session_id() }}{% endset %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content homepage forum viewforum">
|
||||
<div class="content-column">
|
||||
{% include 'forum/forum.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -84,7 +84,7 @@
|
|||
<div class="menu-nav" id="navMenuSite">
|
||||
<!-- Navigation menu, displayed on left side of the bar. -->
|
||||
<a class="menu-item fa-home" href="{{ route('main.index') }}" title="Home"></a>
|
||||
<a class="menu-item fa-newspaper-o" href="{{ route('news.index') }}" title="News"></a>
|
||||
<a class="menu-item fa-newspaper-o" href="{{ route('news.category') }}" title="News"></a>
|
||||
<a class="menu-item fa-commenting" href="{{ route('main.infopage', 'chat') }}" title="Chat"></a>
|
||||
<a class="menu-item fa-list" href="{{ route('forums.index') }}" title="Forums"></a>
|
||||
<a class="menu-item fa-search" href="{{ route('main.search') }}" title="Search"></a>
|
||||
|
@ -178,27 +178,27 @@
|
|||
<div class="copycentre">Powered by <a href="https://github.com/flashwave/sakura/" target="_blank">Sakura</a>{% if sakura.dev.showChangelog %} <a href="https://sakura.flash.moe/#r{{ sakura.versionInfo.version }}" target="_blank">r{{ sakura.versionInfo.version }}</a>{% endif %} © 2013-2016 <a href="http://flash.moe/" target="_blank">Flashwave</a></div>
|
||||
<ul class="ftsection">
|
||||
<li class="fthead">General</li>
|
||||
<li><a href="{{ route('main.index') }}" title="Flashii Frontpage">Home</a></li>
|
||||
<li><a href="{{ route('news.index') }}" title="Flashii News & Updates">News</a></li>
|
||||
<li><a href="{{ route('main.search') }}" title="Do full-site search requests">Search</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'contact') }}" title="Contact our Staff">Contact</a></li>
|
||||
<li><a href="https://sakura.flash.moe" target="_blank" title="All the changes made to Sakura are listed here">Changelog</a></li>
|
||||
<li><a href="{{ route('premium.index') }}" title="Get Tenshi and help us pay the bills">Support us</a></li>
|
||||
<li><a href="{{ route('main.index') }}">Home</a></li>
|
||||
<li><a href="{{ route('news.category') }}">News</a></li>
|
||||
<li><a href="{{ route('main.search') }}">Search</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'contact') }}">Contact</a></li>
|
||||
<li><a href="https://sakura.flash.moe" target="_blank">Changelog</a></li>
|
||||
<li><a href="{{ route('premium.index') }}">Support us</a></li>
|
||||
</ul>
|
||||
<ul class="ftsection">
|
||||
<li class="fthead">Community</li>
|
||||
<li><a href="{{ route('forums.index') }}" title="Read and post on our forums">Forums</a></li>
|
||||
<li><a href="https://twitter.com/_flashii" target="_blank" title="Follow us on Twitter for news messages that are too short for the news page">Twitter</a></li>
|
||||
<li><a href="https://youtube.com/user/flashiinet" target="_blank" title="Our YouTube page where stuff barely ever gets uploaded, mainly used to archive community creations">YouTube</a></li>
|
||||
<li><a href="https://steamcommunity.com/groups/flashiinet" target="_blank" title="Our Steam group, play games with other members on the site">Steam</a></li>
|
||||
<li><a href="https://github.com/flashii" target="_blank" title="Our GitHub organisation">GitHub</a></li>
|
||||
<li><a href="{{ route('forums.index') }}">Forums</a></li>
|
||||
<li><a href="https://twitter.com/_flashii" target="_blank">Twitter</a></li>
|
||||
<li><a href="https://youtube.com/user/flashiinet" target="_blank">YouTube</a></li>
|
||||
<li><a href="https://steamcommunity.com/groups/flashiinet" target="_blank">Steam</a></li>
|
||||
<li><a href="https://github.com/flashii" target="_blank">GitHub</a></li>
|
||||
</ul>
|
||||
<ul class="ftsection">
|
||||
<li class="fthead">Information</li>
|
||||
<li><a href="{{ route('main.faq') }}" title="Questions that get Asked Frequently but not actually">FAQ</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'rules') }}" title="Some Rules and Information kind of summing up the ToS">Rules</a></li>
|
||||
<li><a href="//fiistat.us" target="_blank" title="Check the status on our Servers and related services">Server Status</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'terms') }}" title="Our Terms of Service">Terms of Service</a></li>
|
||||
<li><a href="{{ route('main.faq') }}">FAQ</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'rules') }}">Rules</a></li>
|
||||
<li><a href="//fiistat.us" target="_blank">Server Status</a></li>
|
||||
<li><a href="{{ route('main.infopage', 'terms') }}">Terms of Service</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% set newsPosts = viewPost and postExists ? [news.posts[postExists]] : news.posts|batch(postsPerPage)[get.page|default(1) - 1] %}
|
||||
|
||||
{% if viewPost and postExists %}
|
||||
{% set commentsCategory = 'news-' ~ newsPosts[0].news_category ~ '-' ~ newsPosts[0].news_id %}
|
||||
{% set comments = newsPosts[0].news_comments.comments %}
|
||||
{% else %}
|
||||
{% set paginationPages = news.posts|batch(postsPerPage) %}
|
||||
{% set paginationUrl %}{{ route('news.index') }}{% endset %}
|
||||
{% endif %}
|
||||
|
||||
{% set title %}
|
||||
{% if not (viewPost ? postExists : newsPosts|length) %}Post does not exist!{% elseif viewPost and postExists %}{{ newsPosts[0].news_title }}{% else %}News{% endif %}
|
||||
{% endset %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
<style type="text/css">
|
||||
.pagination {
|
||||
float: right;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content">
|
||||
<div class="content-column news">
|
||||
<div class="head">{{ title }}</div>
|
||||
{% if (viewPost ? postExists : newsPosts|length) %}
|
||||
{% for post in newsPosts %}
|
||||
{% include 'elements/newsPost.twig' %}
|
||||
{% if viewPost and postExists %}
|
||||
{% include 'elements/comments.twig' %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if not (viewPost and postExists) and news.posts|batch(postsPerPage)|length > 1 %}
|
||||
<div>
|
||||
{% include 'elements/pagination.twig' %}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div style="padding: 20px;">
|
||||
<h1>The requested news post does not exist!</h1>
|
||||
There are a few possible reasons for this;
|
||||
<ul style="margin-left: 30px;">
|
||||
<li>The post may have been deleted due to irrelevancy.</li>
|
||||
<li>The post never existed.</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -1,61 +0,0 @@
|
|||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% block title %}Donation Tracker{% endblock %}
|
||||
|
||||
{% set paginationPages = tracker.table|batch(20) %}
|
||||
{% set paginationUrl %}{{ route('premium.tracker') }}{% endset %}
|
||||
|
||||
{% block css %}
|
||||
<style type="text/css">
|
||||
.pagination {
|
||||
float: right;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content support">
|
||||
<div class="head">Donation Tracker</div>
|
||||
<h1 class="stylised" style="margin: 1em auto; text-align: center;">Our current overall balance is €{{ tracker.balance|number_format(2) }}</h1>
|
||||
<div class="sectionHeader">
|
||||
Donation Log
|
||||
</div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Supporter</th>
|
||||
<th>Amount</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<th>Supporter</th>
|
||||
<th>Amount</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody>
|
||||
{% for supporter in tracker.table|batch(20)[get.page|default(1) - 1] %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ route('user.profile', tracker.users[supporter.user_id].id) }}" class="default" style="color: {{ tracker.users[supporter.user_id].colour }}; text-shadow: 0 0 7px {% if tracker.users[supporter.user_id].colour != 'inherit' %}{{ tracker.users[supporter.user_id].colour }}{% else %}#222{% endif %};">{{ tracker.users[supporter.user_id].username }}</a>
|
||||
</td>
|
||||
<td style="color: {% if supporter.transaction_amount > 0 %}#0A0{% else %}#A00{% endif %};">
|
||||
€{{ supporter.transaction_amount|number_format(2) }}
|
||||
</td>
|
||||
<td>
|
||||
{{ supporter.transaction_comment }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% if tracker.table|batch(20)|length > 1 %}
|
||||
<div>
|
||||
{% include 'elements/pagination.twig' %}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -7,7 +7,7 @@
|
|||
</div>
|
||||
<div class="content-left content-column">
|
||||
<div class="head">News</div>
|
||||
{% for post in news.posts|batch(newsCount)[0] %}
|
||||
{% for post in news %}
|
||||
{% include 'elements/newsPost.twig' %}
|
||||
{% endfor %}
|
||||
</div>
|
33
templates/yuuno/news/category.twig
Normal file
33
templates/yuuno/news/category.twig
Normal file
|
@ -0,0 +1,33 @@
|
|||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% block title %}News{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
<style type="text/css">
|
||||
.pagination {
|
||||
float: right;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% set posts = category.posts|batch(3) %}
|
||||
|
||||
{% set paginationPages = posts|keys %}
|
||||
{% set paginationUrl %}{{ route('news.category', category.name) }}{% endset %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content">
|
||||
<div class="content-column news">
|
||||
<div class="head">News</div>
|
||||
{% for post in posts[get.page|default(1) - 1] %}
|
||||
{% include 'elements/newsPost.twig' %}
|
||||
{% endfor %}
|
||||
{% if posts|length > 1 %}
|
||||
<div>
|
||||
{% include 'elements/pagination.twig' %}
|
||||
<div class="clear"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
20
templates/yuuno/news/post.twig
Normal file
20
templates/yuuno/news/post.twig
Normal file
|
@ -0,0 +1,20 @@
|
|||
{% extends 'global/master.twig' %}
|
||||
|
||||
{% block title %}{{ post.title }}{% endblock %}
|
||||
|
||||
{% set commentsCategory = 'news-' ~ post.category ~ '-' ~ post.id %}
|
||||
{% set comments = post.comments %}
|
||||
|
||||
{% set newsHideTitle = true %}
|
||||
{% set newsHideCommentCount = true %}
|
||||
|
||||
{% block content %}
|
||||
<div class="content">
|
||||
<div class="content-column news">
|
||||
<div class="head">{{ post.title }}</div>
|
||||
{% include 'elements/newsPost.twig' %}
|
||||
{% include 'elements/comments.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{% set comments = profile.profileComments.comments %}
|
||||
{% set comments = profile.profileComments %}
|
||||
{% set commentsCategory = 'profile-' ~ profile.id %}
|
||||
<div class="new-profile-mode-title">
|
||||
<h1 class="stylised">Comments</h1>
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
; Sakura Template Configuration
|
||||
|
||||
[meta]
|
||||
; Display name of the style, only used in the admin section of the management panel.
|
||||
name = Yuuno
|
||||
; Author of this template.
|
||||
author = Flashwave
|
||||
; If you set a URL below your name becomes a clickable link in the management panel.
|
||||
author_url = https://flash.moe
|
||||
|
||||
[manage]
|
||||
; This defines whether the template is intended for the management panel.
|
||||
; When it's incorrect Sakura will halt execution of the script.
|
||||
mode = 0
|
|
@ -207,10 +207,8 @@
|
|||
<b>Account Standing</b>
|
||||
{% if profile.permission(constant('Sakura\\Perms\\Site::DEACTIVATED')) %}
|
||||
<h2 style="color: #888; text-shadow: 0 0 7px #888; margin-top: 0;">Deactivated</h2>
|
||||
{% elseif profile.checkBan %}
|
||||
<h2 style="color: #222; text-shadow: 0 0 7px #222; margin-top: 0;">Banned</h2>
|
||||
{% elseif profile.permission(constant('Sakura\\Perms\\Site::RESTRICTED')) %}
|
||||
<h2 style="color: #800; text-shadow: 0 0 7px #800; margin-top: 0;">Restricted</h2>
|
||||
<h2 style="color: #222; text-shadow: 0 0 7px #800; margin-top: 0;">Restricted</h2>
|
||||
{% elseif profile.getWarnings %}
|
||||
<h2 style="color: #A00; text-shadow: 0 0 7px #A00; margin-top: 0;">Bad</h2>
|
||||
{% else %}
|
Reference in a new issue