2023-08-31 21:33:34 +00:00
|
|
|
<?php
|
|
|
|
namespace Misuzu;
|
|
|
|
|
|
|
|
use Index\DateTime;
|
|
|
|
use Misuzu\MisuzuContext;
|
|
|
|
use Misuzu\Tools;
|
|
|
|
use Misuzu\Parsers\Parser;
|
|
|
|
use Twig\Extension\AbstractExtension;
|
|
|
|
use Twig\TwigFilter;
|
|
|
|
use Twig\TwigFunction;
|
|
|
|
|
|
|
|
final class MisuzuSasaeExtension extends AbstractExtension {
|
|
|
|
private MisuzuContext $ctx;
|
|
|
|
|
|
|
|
public function __construct(MisuzuContext $ctx) {
|
|
|
|
$this->ctx = $ctx;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getFilters() {
|
|
|
|
return [
|
|
|
|
new TwigFilter('country_name', Tools::countryName(...)),
|
|
|
|
new TwigFilter('parse_text', fn(string $text, int $parser): string => Parser::instance($parser)->parseText($text)),
|
|
|
|
new TwigFilter('time_format', $this->timeFormat(...)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getFunctions() {
|
|
|
|
return [
|
|
|
|
new TwigFunction('url_construct', 'url_construct'),
|
|
|
|
new TwigFunction('url', 'url'),
|
|
|
|
new TwigFunction('csrf_token', CSRF::token(...)),
|
|
|
|
new TwigFunction('git_commit_hash', GitInfo::hash(...)),
|
|
|
|
new TwigFunction('git_tag', GitInfo::tag(...)),
|
|
|
|
new TwigFunction('git_branch', GitInfo::branch(...)),
|
|
|
|
new TwigFunction('startup_time', fn(float $time = MSZ_STARTUP) => microtime(true) - $time),
|
|
|
|
new TwigFunction('sql_query_count', $this->ctx->getDbQueryCount(...)),
|
|
|
|
new TwigFunction('msz_header_menu', $this->getHeaderMenu(...)),
|
|
|
|
new TwigFunction('msz_user_menu', $this->getUserMenu(...)),
|
|
|
|
new TwigFunction('msz_manage_menu', $this->getManageMenu(...)),
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function timeFormat(DateTime|string|int|null $dateTime): string {
|
|
|
|
if($dateTime === null)
|
|
|
|
return 'never';
|
|
|
|
|
|
|
|
if(is_string($dateTime))
|
|
|
|
$dateTime = new DateTime($dateTime);
|
|
|
|
elseif(is_int($dateTime))
|
|
|
|
$dateTime = DateTime::fromUnixTimeSeconds($dateTime);
|
|
|
|
|
|
|
|
$string = '';
|
|
|
|
$now = DateTime::now();
|
|
|
|
|
|
|
|
$isDiffYear = $now->getYear() !== $dateTime->getYear();
|
|
|
|
if($isDiffYear || $now->getMonth() !== $dateTime->getMonth() || $now->getDay() !== $dateTime->getDay()) {
|
|
|
|
$string .= $dateTime->format('M jS');
|
|
|
|
if($isDiffYear)
|
|
|
|
$string .= $dateTime->format(' Y');
|
|
|
|
$string .= ', ';
|
|
|
|
}
|
|
|
|
|
|
|
|
$string .= $dateTime->format('G:i ');
|
|
|
|
$string .= $dateTime->isUTC() ? 'UTC' : $dateTime->format('T');
|
|
|
|
|
|
|
|
return $string;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getHeaderMenu(): array {
|
|
|
|
$menu = [];
|
|
|
|
$authInfo = $this->ctx->getAuthInfo();
|
|
|
|
|
|
|
|
$home = [
|
|
|
|
'title' => 'Home',
|
|
|
|
'url' => url('index'),
|
|
|
|
'menu' => [],
|
|
|
|
];
|
|
|
|
|
|
|
|
if($authInfo->isLoggedIn())
|
|
|
|
$home['menu'][] = [
|
|
|
|
'title' => 'Members',
|
|
|
|
'url' => url('user-list'),
|
|
|
|
];
|
|
|
|
|
|
|
|
$home['menu'][] = [
|
|
|
|
'title' => 'Changelog',
|
|
|
|
'url' => url('changelog-index'),
|
|
|
|
];
|
|
|
|
$home['menu'][] = [
|
|
|
|
'title' => 'Contact',
|
|
|
|
'url' => url('info', ['title' => 'contact']),
|
|
|
|
];
|
|
|
|
$home['menu'][] = [
|
|
|
|
'title' => 'Rules',
|
|
|
|
'url' => url('info', ['title' => 'rules']),
|
|
|
|
];
|
|
|
|
|
|
|
|
$menu[] = $home;
|
|
|
|
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'News',
|
|
|
|
'url' => url('news-index'),
|
|
|
|
];
|
|
|
|
|
|
|
|
$forum = [
|
|
|
|
'title' => 'Forum',
|
|
|
|
'url' => url('forum-index'),
|
|
|
|
'menu' => [],
|
|
|
|
];
|
|
|
|
|
|
|
|
if($authInfo->getPerms('global')->check(Perm::G_FORUM_LEADERBOARD_VIEW))
|
|
|
|
$forum['menu'][] = [
|
|
|
|
'title' => 'Leaderboard',
|
|
|
|
'url' => url('forum-leaderboard'),
|
|
|
|
];
|
|
|
|
|
|
|
|
$menu[] = $forum;
|
|
|
|
|
|
|
|
$chatPath = $this->ctx->getChatURL();
|
|
|
|
if(!empty($chatPath))
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Chat',
|
|
|
|
'url' => $chatPath,
|
|
|
|
];
|
|
|
|
|
|
|
|
return $menu;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getUserMenu(bool $inBroomCloset, string $manageUrl = ''): array {
|
|
|
|
$menu = [];
|
|
|
|
$authInfo = $this->ctx->getAuthInfo();
|
2023-09-06 20:06:07 +00:00
|
|
|
$usersCtx = $this->ctx->getUsersContext();
|
2023-08-31 21:33:34 +00:00
|
|
|
|
|
|
|
if($authInfo->isLoggedIn()) {
|
|
|
|
$userInfo = $authInfo->getUserInfo();
|
|
|
|
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Profile',
|
|
|
|
'url' => url('user-profile', ['user' => $userInfo->getId()]),
|
|
|
|
'icon' => 'fas fa-user fa-fw',
|
|
|
|
];
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Settings',
|
|
|
|
'url' => url('settings-index'),
|
|
|
|
'icon' => 'fas fa-cog fa-fw',
|
|
|
|
];
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Search',
|
|
|
|
'url' => url('search-index'),
|
|
|
|
'icon' => 'fas fa-search fa-fw',
|
|
|
|
];
|
|
|
|
|
2023-09-06 20:06:07 +00:00
|
|
|
if(!$usersCtx->hasActiveBan($userInfo) && $authInfo->getPerms('global')->check(Perm::G_IS_JANITOR)) {
|
2023-08-31 21:33:34 +00:00
|
|
|
// restore behaviour where clicking this button switches between
|
|
|
|
// site version and broom version
|
|
|
|
if($inBroomCloset)
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Exit Broom Closet',
|
|
|
|
'url' => $manageUrl === '' ? url('index') : $manageUrl,
|
|
|
|
'icon' => 'fas fa-door-open fa-fw',
|
|
|
|
];
|
|
|
|
else
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Enter Broom Closet',
|
|
|
|
'url' => $manageUrl === '' ? url('manage-index') : $manageUrl,
|
|
|
|
'icon' => 'fas fa-door-closed fa-fw',
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Log out',
|
|
|
|
'url' => url('auth-logout'),
|
|
|
|
'icon' => 'fas fa-sign-out-alt fa-fw',
|
|
|
|
];
|
|
|
|
} else {
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Register',
|
|
|
|
'url' => url('auth-register'),
|
|
|
|
'icon' => 'fas fa-user-plus fa-fw',
|
|
|
|
];
|
|
|
|
$menu[] = [
|
|
|
|
'title' => 'Log in',
|
|
|
|
'url' => url('auth-login'),
|
|
|
|
'icon' => 'fas fa-sign-in-alt fa-fw',
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
return $menu;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getManageMenu(): array {
|
|
|
|
$authInfo = $this->ctx->getAuthInfo();
|
|
|
|
$globalPerms = $authInfo->getPerms('global');
|
|
|
|
if(!$authInfo->isLoggedIn() || !$globalPerms->check(Perm::G_IS_JANITOR))
|
|
|
|
return [];
|
|
|
|
|
|
|
|
$menu = [
|
|
|
|
'General' => [
|
|
|
|
'Overview' => url('manage-general-overview'),
|
|
|
|
],
|
|
|
|
];
|
|
|
|
|
|
|
|
if($globalPerms->check(Perm::G_LOGS_VIEW))
|
|
|
|
$menu['General']['Logs'] = url('manage-general-logs');
|
|
|
|
if($globalPerms->check(Perm::G_EMOTES_MANAGE))
|
|
|
|
$menu['General']['Emoticons'] = url('manage-general-emoticons');
|
|
|
|
if($globalPerms->check(Perm::G_CONFIG_MANAGE))
|
|
|
|
$menu['General']['Settings'] = url('manage-general-settings');
|
|
|
|
|
|
|
|
$userPerms = $authInfo->getPerms('user');
|
|
|
|
if($userPerms->check(Perm::U_USERS_MANAGE))
|
|
|
|
$menu['Users & Roles']['Users'] = url('manage-users');
|
|
|
|
if($userPerms->check(Perm::U_ROLES_MANAGE))
|
|
|
|
$menu['Users & Roles']['Roles'] = url('manage-roles');
|
|
|
|
if($userPerms->check(Perm::U_NOTES_MANAGE))
|
|
|
|
$menu['Users & Roles']['Notes'] = url('manage-users-notes');
|
|
|
|
if($userPerms->check(Perm::U_WARNINGS_MANAGE))
|
|
|
|
$menu['Users & Roles']['Warnings'] = url('manage-users-warnings');
|
|
|
|
if($userPerms->check(Perm::U_BANS_MANAGE))
|
|
|
|
$menu['Users & Roles']['Bans'] = url('manage-users-bans');
|
|
|
|
|
|
|
|
if($globalPerms->check(Perm::G_NEWS_POSTS_MANAGE))
|
|
|
|
$menu['News']['Posts'] = url('manage-news-posts');
|
|
|
|
if($globalPerms->check(Perm::G_NEWS_CATEGORIES_MANAGE))
|
|
|
|
$menu['News']['Categories'] = url('manage-news-categories');
|
|
|
|
|
|
|
|
if($globalPerms->check(Perm::G_FORUM_CATEGORIES_MANAGE))
|
|
|
|
$menu['Forum']['Permission Calculator'] = url('manage-forum-categories');
|
|
|
|
if($globalPerms->check(Perm::G_FORUM_TOPIC_REDIRS_MANAGE))
|
|
|
|
$menu['Forum']['Topic Redirects'] = url('manage-forum-topic-redirs');
|
|
|
|
|
|
|
|
if($globalPerms->check(Perm::G_CL_CHANGES_MANAGE))
|
|
|
|
$menu['Changelog']['Changes'] = url('manage-changelog-changes');
|
|
|
|
if($globalPerms->check(Perm::G_CL_TAGS_MANAGE))
|
|
|
|
$menu['Changelog']['Tags'] = url('manage-changelog-tags');
|
|
|
|
|
|
|
|
return $menu;
|
|
|
|
}
|
|
|
|
}
|