ロール

This commit is contained in:
2025-12-29 16:25:29 +09:00
parent 8c76fe2733
commit 863bdabf59
6 changed files with 99 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
<?php <?php
/* error_reporting(E_ALL); */ error_reporting(E_ALL);
/* ini_set('display_errors', 1); */ ini_set('display_errors', 1);
require_once __DIR__.DIRECTORY_SEPARATOR.'/autoload.php'; require_once __DIR__.DIRECTORY_SEPARATOR.'/autoload.php';
@@ -45,6 +45,9 @@ if (AUTH_ENABLED) {
} }
$routes[] = Route::add('GET', 'logout', User::class.'@logout'); $routes[] = Route::add('GET', 'logout', User::class.'@logout');
$routes[] = Route::add('GET', 'profile/{name}', User::class.'@profile'); $routes[] = Route::add('GET', 'profile/{name}', User::class.'@profile');
$routes[] = Route::add('GET', 'memberonly', Page::class.'@memberonly');
$routes[] = Route::add('GET', 'staffonly', Page::class.'@staffonly');
} }
/* if (RSS_ENABLED) {} */ /* if (RSS_ENABLED) {} */

View File

@@ -10,8 +10,8 @@ class BlogPost {
public function getPosts(string $section, ?\stdClass $user): array { public function getPosts(string $section, ?\stdClass $user): array {
$path = ROOT.$section; $path = ROOT.$section;
$posts = []; $posts = [];
$isMember = $user !== NULL; $isMember = $user !== NULL && $user->role !== \Roles::BANNED;
$isStaff = $user !== NULL && $user->role === 1; $isStaff = $user !== NULL && $user->role & (\Roles::ADMIN | \Roles::STAFF);
if (!is_dir($path)) return $posts; if (!is_dir($path)) return $posts;
$files = glob($path.'/*.md'); $files = glob($path.'/*.md');

View File

@@ -113,8 +113,8 @@ class Home extends BlogPost {
// ユーザー // ユーザー
$auth = new Auth(); $auth = new Auth();
$user = $auth->getLoggedInUser(); $user = $auth->getLoggedInUser();
$isMember = $user !== NULL; $isMember = $user !== NULL && $user->role !== \Roles::BANNED;
$isStaff = $user !== NULL && $user->role === 1; $isStaff = $user !== NULL && $user->role & (\Roles::ADMIN | \Roles::STAFF);
$tmpl->assign('user', $user); $tmpl->assign('user', $user);
$tmpl->assign('pagetit', $pagetit); $tmpl->assign('pagetit', $pagetit);

View File

@@ -96,7 +96,7 @@ class Page {
$tmpl->assign('menu', $this->getMenu()); $tmpl->assign('menu', $this->getMenu());
$tmpl->assign('description', $description); $tmpl->assign('description', $description);
if ($user && $user->role != -1) $tmpl->render('memberonly'); if ($user && $user->role !== \Roles::BANNED) $tmpl->render('memberonly');
else $tmpl->render('nopermission'); else $tmpl->render('nopermission');
} catch (\Exception $e) { } catch (\Exception $e) {
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());
@@ -121,7 +121,7 @@ class Page {
$tmpl->assign('menu', $this->getMenu()); $tmpl->assign('menu', $this->getMenu());
$tmpl->assign('description', $description); $tmpl->assign('description', $description);
if ($user && $user->role == 1) $tmpl->render('staffonly'); if ($user && $user->role & (\Roles::ADMIN | \Roles::STAFF)) $tmpl->render('staffonly');
else $tmpl->render('nopermission'); else $tmpl->render('nopermission');
} catch (\Exception $e) { } catch (\Exception $e) {
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());

View File

@@ -40,13 +40,13 @@ class Auth {
unset($user->password); unset($user->password);
unset($user->tokens); unset($user->tokens);
$myself = $this->getUserData(); $myself = $this->getUserData();
if ($myself->role === 1) { if ($myself->role & (\Roles::PLAYSTATIONNDA | \Roles::NINTENDONDA | \Roles::MEMBER | \Roles::BANNED)) {
unset($user->email); unset($user->email);
} }
$user->name = namecolor($user); $user->name = namecolor($user);
$user->regDate = date('Y年m月d日', $user->regDate); $user->regDate = date('Y年m月d日', $user->regDate);
$user->gender = $user->gender === 0 ? '男' : ($user->gender === 1 ? '女' : '不明'); $user->gender = $user->gender === 0 ? '男' : ($user->gender === 1 ? '女' : '不明');
$user->role = $user->role === 1 ? '管理者' : ($user->role === -1 ? 'BANされた' : 'ユーザー'); $user->role = $user->role & (\Roles::ADMIN | \Roles::STAFF) ? '管理者' : ($user->role === \Roles::BANNED ? 'BANされた' : 'ユーザー');
$user->avatar = '/static/user/'.($user->avatar === '' ? 'noicon.png' : $user->username.'/'.$user->avatar); $user->avatar = '/static/user/'.($user->avatar === '' ? 'noicon.png' : $user->username.'/'.$user->avatar);
$user->altName = $user->displayname ?: $user->username; $user->altName = $user->displayname ?: $user->username;
unset($user->username); unset($user->username);
@@ -199,7 +199,7 @@ class Auth {
$user->namecolor = ''; $user->namecolor = '';
$user->displayname = ''; $user->displayname = '';
$user->gender = -1; $user->gender = -1;
$user->role = 0; $user->role = \Roles::MEMBER;
$user->tokens = []; $user->tokens = [];
$path = "{$this->dataDir}{$lastId}.{$username}.json"; $path = "{$this->dataDir}{$lastId}.{$username}.json";

View File

@@ -27,6 +27,89 @@ class Result {
} }
} }
class Roles {
// 例: if ($user->role & (Roles::STAFF | Roles::NINTENDONDA))
public const int BANNED = 0;
public const int MEMBER = 1 << 0; // 1
public const int NINTENDONDA = 1 << 1; // 2
public const int PLAYSTATIONNDA = 1 << 2; // 4
public const int STAFF = 1 << 3; // 8
public const int ADMIN = 1 << 7; // 128
}
$colorPalette = [
'ultradark' => [
'black' => '#020102',
'white' => '#b3b1b3',
'grey' => '#5c535c',
'yellow' => '#8d8b0d',
'orange' => '#724e0b',
'green' => '#1e6907',
'purple' => '#410a5a',
'lime' => '#198d5b',
'pink' => '#9e0ea3',
'cyan' => '#1e8c9b',
'red' => '#861623',
'blue' => '#164a85',
],
'dark' => [
'black' => '#120f12',
'white' => '#cfcbcf',
'grey' => '#746c75',
'yellow' => '#b8b515',
'orange' => '#ac7718',
'green' => '#2c980c',
'purple' => '#550f75',
'lime' => '#10c074',
'pink' => '#c016c6',
'cyan' => '#1cbcd0',
'red' => '#bc1729',
'blue' => '#1a6ecf',
],
'medium' => [
'black' => '#232023',
'white' => '#f6f6f6',
'grey' => '#988f98',
'yellow' => '#f1ed25',
'orange' => '#f7a717',
'green' => '#2de12c',
'purple' => '#b421f8',
'lime' => '#20f398',
'pink' => '#f545f5',
'cyan' => '#29d3ff',
'red' => '#ee4030',
'blue' => '#2687f7',
],
'light' => [
'black' => '#443b44',
'white' => '#fcfcfc',
'grey' => '#bdb4bd',
'yellow' => '#ecea71',
'orange' => '#f8c56a',
'green' => '#6cf344',
'purple' => '#ae6bdb',
'lime' => '#88ecc1',
'pink' => '#ea79d8',
'cyan' => '#8ae5ff',
'red' => '#f35869',
'blue' => '#6aa6eb',
],
'ultralight' => [
'black' => '#574d57',
'white' => '#ffffff',
'grey' => '#d6cfd6',
'yellow' => '#f5f4cf',
'orange' => '#f3d6a3',
'green' => '#baf3a8',
'purple' => '#d2bae2',
'lime' => '#b6e9d3',
'pink' => '#e6b9de',
'cyan' => '#c2e8f3',
'red' => '#ecb0b7',
'blue' => '#bbd4f0',
],
];
function uuid(): string { function uuid(): string {
$data = random_bytes(16); $data = random_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40); $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
@@ -214,12 +297,12 @@ function namecolor(\stdClass $userData): string {
$ungender = "#7C60B0"; $ungender = "#7C60B0";
$gender = 'color: '.($userData->gender === 0 ? $male : ($userData->gender === 1 ? $female : $ungender)).';'; $gender = 'color: '.($userData->gender === 0 ? $male : ($userData->gender === 1 ? $female : $ungender)).';';
$style = $userData->namecolor ?: ($userData->role >= 0 ? $gender : $ban); $style = $userData->namecolor ?: ($userData->role !== Roles::BANNED ? $gender : 'color: '.$ban.';');
$showname = $userData->displayname ?: $userData->username; $showname = $userData->displayname ?: $userData->username;
$color = "<span style=\"{$style}\">{$showname}</span>"; $color = "<span style=\"{$style}\">{$showname}</span>";
if ($userData->role === 1) $color .= "<span style=\"font-size: x-small; background: #10c074; border: 1px solid #fcfcfc; border-radius: 10px; padding: 0 0.5em;\">✓</span>"; if ($userData->role & (Roles::ADMIN | Roles::STAFF)) $color .= "<span style=\"font-size: x-small; background: #10c074; border: 1px solid #fcfcfc; border-radius: 10px; padding: 0 0.5em;\">✓</span>";
$suffix = $userData->gender === 0 ? 'くん' : ($userData->gender === 1 ? 'ちゃん' : 'さん'); $suffix = $userData->gender === 0 ? 'くん' : ($userData->gender === 1 ? 'ちゃん' : 'さん');