ロール
諏訪子 <suwako@076.moe>、2025-12-29 16:25
コミット 863bdabf591ecf09101aabd8c54e33969e693a24
・親 8c76fe2
・ファイルを見る
6個のファイル、+99 -13
変更
route.php
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | <?php |
| 2 | -/* error_reporting(E_ALL); */ | |
| 3 | -/* ini_set('display_errors', 1); */ | |
| 2 | +error_reporting(E_ALL); | |
| 3 | +ini_set('display_errors', 1); | |
| 4 | 4 | |
| 5 | 5 | require_once __DIR__.DIRECTORY_SEPARATOR.'/autoload.php'; |
| 6 | 6 | |
| @@ -45,6 +45,9 @@ | ||
| 45 | 45 | } |
| 46 | 46 | $routes[] = Route::add('GET', 'logout', User::class.'@logout'); |
| 47 | 47 | $routes[] = Route::add('GET', 'profile/{name}', User::class.'@profile'); |
| 48 | + | |
| 49 | + $routes[] = Route::add('GET', 'memberonly', Page::class.'@memberonly'); | |
| 50 | + $routes[] = Route::add('GET', 'staffonly', Page::class.'@staffonly'); | |
| 48 | 51 | } |
| 49 | 52 | |
| 50 | 53 | /* if (RSS_ENABLED) {} */ |
| @@ -10,8 +10,8 @@ | ||
| 10 | 10 | public function getPosts(string $section, ?\stdClass $user): array { |
| 11 | 11 | $path = ROOT.$section; |
| 12 | 12 | $posts = []; |
| 13 | - $isMember = $user !== NULL; | |
| 14 | - $isStaff = $user !== NULL && $user->role === 1; | |
| 13 | + $isMember = $user !== NULL && $user->role !== \Roles::BANNED; | |
| 14 | + $isStaff = $user !== NULL && $user->role & (\Roles::ADMIN | \Roles::STAFF); | |
| 15 | 15 | |
| 16 | 16 | if (!is_dir($path)) return $posts; |
| 17 | 17 | $files = glob($path.'/*.md'); |
| @@ -113,8 +113,8 @@ | ||
| 113 | 113 | // ユーザー |
| 114 | 114 | $auth = new Auth(); |
| 115 | 115 | $user = $auth->getLoggedInUser(); |
| 116 | - $isMember = $user !== NULL; | |
| 117 | - $isStaff = $user !== NULL && $user->role === 1; | |
| 116 | + $isMember = $user !== NULL && $user->role !== \Roles::BANNED; | |
| 117 | + $isStaff = $user !== NULL && $user->role & (\Roles::ADMIN | \Roles::STAFF); | |
| 118 | 118 | $tmpl->assign('user', $user); |
| 119 | 119 | |
| 120 | 120 | $tmpl->assign('pagetit', $pagetit); |
| @@ -96,7 +96,7 @@ | ||
| 96 | 96 | $tmpl->assign('menu', $this->getMenu()); |
| 97 | 97 | $tmpl->assign('description', $description); |
| 98 | 98 | |
| 99 | - if ($user && $user->role != -1) $tmpl->render('memberonly'); | |
| 99 | + if ($user && $user->role !== \Roles::BANNED) $tmpl->render('memberonly'); | |
| 100 | 100 | else $tmpl->render('nopermission'); |
| 101 | 101 | } catch (\Exception $e) { |
| 102 | 102 | throw new \Exception($e->getMessage()); |
| @@ -121,7 +121,7 @@ | ||
| 121 | 121 | $tmpl->assign('menu', $this->getMenu()); |
| 122 | 122 | $tmpl->assign('description', $description); |
| 123 | 123 | |
| 124 | - if ($user && $user->role == 1) $tmpl->render('staffonly'); | |
| 124 | + if ($user && $user->role & (\Roles::ADMIN | \Roles::STAFF)) $tmpl->render('staffonly'); | |
| 125 | 125 | else $tmpl->render('nopermission'); |
| 126 | 126 | } catch (\Exception $e) { |
| 127 | 127 | throw new \Exception($e->getMessage()); |
| @@ -40,13 +40,13 @@ | ||
| 40 | 40 | unset($user->password); |
| 41 | 41 | unset($user->tokens); |
| 42 | 42 | $myself = $this->getUserData(); |
| 43 | - if ($myself->role === 1) { | |
| 43 | + if ($myself->role & (\Roles::PLAYSTATIONNDA | \Roles::NINTENDONDA | \Roles::MEMBER | \Roles::BANNED)) { | |
| 44 | 44 | unset($user->email); |
| 45 | 45 | } |
| 46 | 46 | $user->name = namecolor($user); |
| 47 | 47 | $user->regDate = date('Y年m月d日', $user->regDate); |
| 48 | 48 | $user->gender = $user->gender === 0 ? '男' : ($user->gender === 1 ? '女' : '不明'); |
| 49 | - $user->role = $user->role === 1 ? '管理者' : ($user->role === -1 ? 'BANされた' : 'ユーザー'); | |
| 49 | + $user->role = $user->role & (\Roles::ADMIN | \Roles::STAFF) ? '管理者' : ($user->role === \Roles::BANNED ? 'BANされた' : 'ユーザー'); | |
| 50 | 50 | $user->avatar = '/static/user/'.($user->avatar === '' ? 'noicon.png' : $user->username.'/'.$user->avatar); |
| 51 | 51 | $user->altName = $user->displayname ?: $user->username; |
| 52 | 52 | unset($user->username); |
| @@ -199,7 +199,7 @@ | ||
| 199 | 199 | $user->namecolor = ''; |
| 200 | 200 | $user->displayname = ''; |
| 201 | 201 | $user->gender = -1; |
| 202 | - $user->role = 0; | |
| 202 | + $user->role = \Roles::MEMBER; | |
| 203 | 203 | $user->tokens = []; |
| 204 | 204 | |
| 205 | 205 | $path = "{$this->dataDir}{$lastId}.{$username}.json"; |
変更
util.php
| @@ -27,6 +27,89 @@ | ||
| 27 | 27 | } |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | +class Roles { | |
| 31 | + // 例: if ($user->role & (Roles::STAFF | Roles::NINTENDONDA)) | |
| 32 | + public const int BANNED = 0; | |
| 33 | + public const int MEMBER = 1 << 0; // 1 | |
| 34 | + public const int NINTENDONDA = 1 << 1; // 2 | |
| 35 | + public const int PLAYSTATIONNDA = 1 << 2; // 4 | |
| 36 | + public const int STAFF = 1 << 3; // 8 | |
| 37 | + public const int ADMIN = 1 << 7; // 128 | |
| 38 | +} | |
| 39 | + | |
| 40 | +$colorPalette = [ | |
| 41 | + 'ultradark' => [ | |
| 42 | + 'black' => '#020102', | |
| 43 | + 'white' => '#b3b1b3', | |
| 44 | + 'grey' => '#5c535c', | |
| 45 | + 'yellow' => '#8d8b0d', | |
| 46 | + 'orange' => '#724e0b', | |
| 47 | + 'green' => '#1e6907', | |
| 48 | + 'purple' => '#410a5a', | |
| 49 | + 'lime' => '#198d5b', | |
| 50 | + 'pink' => '#9e0ea3', | |
| 51 | + 'cyan' => '#1e8c9b', | |
| 52 | + 'red' => '#861623', | |
| 53 | + 'blue' => '#164a85', | |
| 54 | + ], | |
| 55 | + 'dark' => [ | |
| 56 | + 'black' => '#120f12', | |
| 57 | + 'white' => '#cfcbcf', | |
| 58 | + 'grey' => '#746c75', | |
| 59 | + 'yellow' => '#b8b515', | |
| 60 | + 'orange' => '#ac7718', | |
| 61 | + 'green' => '#2c980c', | |
| 62 | + 'purple' => '#550f75', | |
| 63 | + 'lime' => '#10c074', | |
| 64 | + 'pink' => '#c016c6', | |
| 65 | + 'cyan' => '#1cbcd0', | |
| 66 | + 'red' => '#bc1729', | |
| 67 | + 'blue' => '#1a6ecf', | |
| 68 | + ], | |
| 69 | + 'medium' => [ | |
| 70 | + 'black' => '#232023', | |
| 71 | + 'white' => '#f6f6f6', | |
| 72 | + 'grey' => '#988f98', | |
| 73 | + 'yellow' => '#f1ed25', | |
| 74 | + 'orange' => '#f7a717', | |
| 75 | + 'green' => '#2de12c', | |
| 76 | + 'purple' => '#b421f8', | |
| 77 | + 'lime' => '#20f398', | |
| 78 | + 'pink' => '#f545f5', | |
| 79 | + 'cyan' => '#29d3ff', | |
| 80 | + 'red' => '#ee4030', | |
| 81 | + 'blue' => '#2687f7', | |
| 82 | + ], | |
| 83 | + 'light' => [ | |
| 84 | + 'black' => '#443b44', | |
| 85 | + 'white' => '#fcfcfc', | |
| 86 | + 'grey' => '#bdb4bd', | |
| 87 | + 'yellow' => '#ecea71', | |
| 88 | + 'orange' => '#f8c56a', | |
| 89 | + 'green' => '#6cf344', | |
| 90 | + 'purple' => '#ae6bdb', | |
| 91 | + 'lime' => '#88ecc1', | |
| 92 | + 'pink' => '#ea79d8', | |
| 93 | + 'cyan' => '#8ae5ff', | |
| 94 | + 'red' => '#f35869', | |
| 95 | + 'blue' => '#6aa6eb', | |
| 96 | + ], | |
| 97 | + 'ultralight' => [ | |
| 98 | + 'black' => '#574d57', | |
| 99 | + 'white' => '#ffffff', | |
| 100 | + 'grey' => '#d6cfd6', | |
| 101 | + 'yellow' => '#f5f4cf', | |
| 102 | + 'orange' => '#f3d6a3', | |
| 103 | + 'green' => '#baf3a8', | |
| 104 | + 'purple' => '#d2bae2', | |
| 105 | + 'lime' => '#b6e9d3', | |
| 106 | + 'pink' => '#e6b9de', | |
| 107 | + 'cyan' => '#c2e8f3', | |
| 108 | + 'red' => '#ecb0b7', | |
| 109 | + 'blue' => '#bbd4f0', | |
| 110 | + ], | |
| 111 | +]; | |
| 112 | + | |
| 30 | 113 | function uuid(): string { |
| 31 | 114 | $data = random_bytes(16); |
| 32 | 115 | $data[6] = chr(ord($data[6]) & 0x0f | 0x40); |
| @@ -214,12 +297,12 @@ | ||
| 214 | 297 | $ungender = "#7C60B0"; |
| 215 | 298 | |
| 216 | 299 | $gender = 'color: '.($userData->gender === 0 ? $male : ($userData->gender === 1 ? $female : $ungender)).';'; |
| 217 | - $style = $userData->namecolor ?: ($userData->role >= 0 ? $gender : $ban); | |
| 300 | + $style = $userData->namecolor ?: ($userData->role !== Roles::BANNED ? $gender : 'color: '.$ban.';'); | |
| 218 | 301 | |
| 219 | 302 | $showname = $userData->displayname ?: $userData->username; |
| 220 | 303 | |
| 221 | 304 | $color = "<span style=\"{$style}\">{$showname}</span>"; |
| 222 | - 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>"; | |
| 305 | + 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>"; | |
| 223 | 306 | |
| 224 | 307 | $suffix = $userData->gender === 0 ? 'くん' : ($userData->gender === 1 ? 'ちゃん' : 'さん'); |
| 225 | 308 |