Index updates + floatval, intval -> casts.
This commit is contained in:
parent
aef7297bee
commit
525ced6e4e
19 changed files with 94 additions and 36 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -9,6 +9,7 @@
|
||||||
/config/github.ini
|
/config/github.ini
|
||||||
/.debug
|
/.debug
|
||||||
/.migrating
|
/.migrating
|
||||||
|
/lib/index-dev
|
||||||
|
|
||||||
# Storage
|
# Storage
|
||||||
/store
|
/store
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit ac2255d24d7dd39ac91fa50d3a7aa71ce0a92188
|
Subproject commit d16642872948d348f1bed805e1ce96175917aaa0
|
19
misuzu.php
19
misuzu.php
|
@ -4,6 +4,8 @@ namespace Misuzu;
|
||||||
use PDO;
|
use PDO;
|
||||||
use Index\Autoloader;
|
use Index\Autoloader;
|
||||||
use Index\Environment;
|
use Index\Environment;
|
||||||
|
use Index\Data\ConnectionFailedException;
|
||||||
|
use Index\Data\DbTools;
|
||||||
use Misuzu\Net\GeoIP;
|
use Misuzu\Net\GeoIP;
|
||||||
use Misuzu\Net\IPAddress;
|
use Misuzu\Net\IPAddress;
|
||||||
use Misuzu\Users\User;
|
use Misuzu\Users\User;
|
||||||
|
@ -15,14 +17,16 @@ define('MSZ_STARTUP', microtime(true));
|
||||||
define('MSZ_ROOT', __DIR__);
|
define('MSZ_ROOT', __DIR__);
|
||||||
define('MSZ_CLI', PHP_SAPI === 'cli');
|
define('MSZ_CLI', PHP_SAPI === 'cli');
|
||||||
define('MSZ_DEBUG', is_file(MSZ_ROOT . '/.debug'));
|
define('MSZ_DEBUG', is_file(MSZ_ROOT . '/.debug'));
|
||||||
define('MSZ_PHP_MIN_VER', '7.4.0');
|
|
||||||
define('MSZ_PUBLIC', MSZ_ROOT . '/public');
|
define('MSZ_PUBLIC', MSZ_ROOT . '/public');
|
||||||
define('MSZ_SOURCE', MSZ_ROOT . '/src');
|
define('MSZ_SOURCE', MSZ_ROOT . '/src');
|
||||||
define('MSZ_LIBRARIES', MSZ_ROOT . '/lib');
|
define('MSZ_LIBRARIES', MSZ_ROOT . '/lib');
|
||||||
define('MSZ_CONFIG', MSZ_ROOT . '/config');
|
define('MSZ_CONFIG', MSZ_ROOT . '/config');
|
||||||
define('MSZ_TEMPLATES', MSZ_ROOT . '/templates');
|
define('MSZ_TEMPLATES', MSZ_ROOT . '/templates');
|
||||||
|
|
||||||
require_once MSZ_LIBRARIES . '/index/index.php';
|
define('MSZ_NDX_PATH', MSZ_LIBRARIES . '/index');
|
||||||
|
define('MSZ_NDX_PATH_DEV', MSZ_LIBRARIES . '/index-dev');
|
||||||
|
|
||||||
|
require_once (MSZ_DEBUG && is_dir(MSZ_NDX_PATH_DEV) ? MSZ_NDX_PATH_DEV : MSZ_NDX_PATH) . '/index.php';
|
||||||
|
|
||||||
Autoloader::addNamespace(__NAMESPACE__, MSZ_SOURCE);
|
Autoloader::addNamespace(__NAMESPACE__, MSZ_SOURCE);
|
||||||
Environment::setDebug(MSZ_DEBUG);
|
Environment::setDebug(MSZ_DEBUG);
|
||||||
|
@ -74,9 +78,14 @@ if(empty($dbConfig)) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dbConfig = $dbConfig['Database'] ?? $dbConfig['Database.mysql-main'] ?? [];
|
define('MSZ_DB_INIT', 'SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';');
|
||||||
|
|
||||||
|
$db = DbTools::create($dbConfig['dsn']);
|
||||||
|
$db->execute(MSZ_DB_INIT);
|
||||||
|
|
||||||
|
$dbConfig = $dbConfig['Database'] ?? $dbConfig['Database.mysql-main'] ?? [];
|
||||||
DB::init(DB::buildDSN($dbConfig), $dbConfig['username'] ?? '', $dbConfig['password'] ?? '', DB::ATTRS);
|
DB::init(DB::buildDSN($dbConfig), $dbConfig['username'] ?? '', $dbConfig['password'] ?? '', DB::ATTRS);
|
||||||
|
DB::exec(MSZ_DB_INIT);
|
||||||
|
|
||||||
Config::init();
|
Config::init();
|
||||||
Mailer::init(Config::get('mail.method', Config::TYPE_STR), [
|
Mailer::init(Config::get('mail.method', Config::TYPE_STR), [
|
||||||
|
@ -104,7 +113,7 @@ if(MSZ_CLI) { // Temporary backwards compatibility measure, remove this later
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$ctx = new MszContext(DB::getInstance());
|
$ctx = new MszContext($db);
|
||||||
|
|
||||||
// Everything below here should eventually be moved to index.php, probably only initialised when required.
|
// Everything below here should eventually be moved to index.php, probably only initialised when required.
|
||||||
// Serving things like the css/js doesn't need to initialise sessions.
|
// Serving things like the css/js doesn't need to initialise sessions.
|
||||||
|
@ -133,7 +142,7 @@ if(!MSZ_DEBUG) {
|
||||||
mkdir($twigCache, 0775, true);
|
mkdir($twigCache, 0775, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
Template::init($twigCache ?? null, MSZ_DEBUG);
|
Template::init($ctx, $twigCache ?? null, MSZ_DEBUG);
|
||||||
|
|
||||||
Template::set('globals', [
|
Template::set('globals', [
|
||||||
'site_name' => Config::get('site.name', Config::TYPE_STR, 'Misuzu'),
|
'site_name' => Config::get('site.name', Config::TYPE_STR, 'Misuzu'),
|
||||||
|
|
|
@ -74,7 +74,7 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
if(str_starts_with($fv, 's:')) {
|
if(str_starts_with($fv, 's:')) {
|
||||||
$fv = substr($fv, 2);
|
$fv = substr($fv, 2);
|
||||||
} elseif(str_starts_with($fv, 'i:')) {
|
} elseif(str_starts_with($fv, 'i:')) {
|
||||||
$fv = intval(substr($fv, 2));
|
$fv = (int)substr($fv, 2);
|
||||||
} elseif(str_starts_with($fv, 'b:')) {
|
} elseif(str_starts_with($fv, 'b:')) {
|
||||||
$fv = strtolower(substr($fv, 2));
|
$fv = strtolower(substr($fv, 2));
|
||||||
$fv = $fv !== 'false' && $fv !== '0' && $fv !== '';
|
$fv = $fv !== 'false' && $fv !== '0' && $fv !== '';
|
||||||
|
@ -88,7 +88,7 @@ if($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
} else {
|
} else {
|
||||||
$sValue = (string)filter_input(INPUT_POST, 'conf_value');
|
$sValue = (string)filter_input(INPUT_POST, 'conf_value');
|
||||||
if($sType === 'integer')
|
if($sType === 'integer')
|
||||||
$sValue = intval($sValue);
|
$sValue = (int)$sValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sVar['value'] = $sValue;
|
$sVar['value'] = $sValue;
|
||||||
|
|
|
@ -24,7 +24,7 @@ if(!empty($_POST['session']) && CSRF::validateRequest()) {
|
||||||
|
|
||||||
if(is_array($_POST['session'])) {
|
if(is_array($_POST['session'])) {
|
||||||
foreach($_POST['session'] as $sessionId) {
|
foreach($_POST['session'] as $sessionId) {
|
||||||
$sessionId = intval($sessionId);
|
$sessionId = (int)$sessionId;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$sessionInfo = UserSession::byId($sessionId);
|
$sessionInfo = UserSession::byId($sessionId);
|
||||||
|
|
|
@ -23,8 +23,6 @@ final class DB {
|
||||||
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
|
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
|
||||||
PDO::ATTR_STRINGIFY_FETCHES => false,
|
PDO::ATTR_STRINGIFY_FETCHES => false,
|
||||||
PDO::ATTR_EMULATE_PREPARES => false,
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION time_zone = \'+00:00\''
|
|
||||||
. ', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\'',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
public static function init(...$args) {
|
public static function init(...$args) {
|
||||||
|
|
|
@ -102,7 +102,7 @@ final class AssetsHandler extends Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function serveAvatar($response, $request, string $fileName) {
|
public function serveAvatar($response, $request, string $fileName) {
|
||||||
$userId = intval(pathinfo($fileName, PATHINFO_FILENAME));
|
$userId = (int)pathinfo($fileName, PATHINFO_FILENAME);
|
||||||
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
if($type !== '' && $type !== 'png')
|
if($type !== '' && $type !== 'png')
|
||||||
|
@ -124,7 +124,7 @@ final class AssetsHandler extends Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function serveProfileBackground($response, $request, string $fileName) {
|
public function serveProfileBackground($response, $request, string $fileName) {
|
||||||
$userId = intval(pathinfo($fileName, PATHINFO_FILENAME));
|
$userId = (int)pathinfo($fileName, PATHINFO_FILENAME);
|
||||||
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
if($type !== '' && $type !== 'png')
|
if($type !== '' && $type !== 'png')
|
||||||
|
|
|
@ -25,7 +25,7 @@ class ChangelogHandler extends Handler {
|
||||||
if($filterDate !== null)
|
if($filterDate !== null)
|
||||||
try {
|
try {
|
||||||
$dateParts = explode('-', $filterDate, 3);
|
$dateParts = explode('-', $filterDate, 3);
|
||||||
$filterDate = gmmktime(12, 0, 0, intval($dateParts[1]), intval($dateParts[2]), intval($dateParts[0]));
|
$filterDate = gmmktime(12, 0, 0, (int)$dateParts[1], (int)$dateParts[2], (int)$dateParts[0]);
|
||||||
} catch(ErrorException $ex) {
|
} catch(ErrorException $ex) {
|
||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ final class NewsHandler extends Handler {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function viewCategory($response, $request, string $fileName) {
|
public function viewCategory($response, $request, string $fileName) {
|
||||||
$categoryId = intval(pathinfo($fileName, PATHINFO_FILENAME));
|
$categoryId = (int)pathinfo($fileName, PATHINFO_FILENAME);
|
||||||
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
$type = pathinfo($fileName, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -40,8 +40,8 @@ abstract class Image {
|
||||||
$targetHeight = $originalHeight * $dimensions / $originalWidth;
|
$targetHeight = $originalHeight * $dimensions / $originalWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
$targetWidth = intval($targetWidth);
|
$targetWidth = (int)$targetWidth;
|
||||||
$targetHeight = intval($targetHeight);
|
$targetHeight = (int)$targetHeight;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
$this->resize($targetWidth, $targetHeight);
|
$this->resize($targetWidth, $targetHeight);
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
namespace Misuzu;
|
namespace Misuzu;
|
||||||
|
|
||||||
use Misuzu\Template;
|
use Misuzu\Template;
|
||||||
use Misuzu\Database\Database;
|
|
||||||
use Misuzu\SharpChat\SharpChatRoutes;
|
use Misuzu\SharpChat\SharpChatRoutes;
|
||||||
use Misuzu\Users\Users;
|
use Misuzu\Users\Users;
|
||||||
|
use Index\Data\IDbConnection;
|
||||||
use Index\Http\HttpFx;
|
use Index\Http\HttpFx;
|
||||||
use Index\Http\HttpRequest;
|
use Index\Http\HttpRequest;
|
||||||
use Index\Routing\Router;
|
use Index\Routing\Router;
|
||||||
|
@ -13,13 +13,18 @@ use Index\Routing\Router;
|
||||||
// no more magical static classes that are just kind of assumed to exist
|
// no more magical static classes that are just kind of assumed to exist
|
||||||
// it currently looks Pretty Messy, but most everything else will be holding instances of other classes
|
// it currently looks Pretty Messy, but most everything else will be holding instances of other classes
|
||||||
class MszContext {
|
class MszContext {
|
||||||
private Database $database;
|
private IDbConnection $dbConn;
|
||||||
//private Users $users;
|
private Users $users;
|
||||||
private HttpFx $router;
|
private HttpFx $router;
|
||||||
|
|
||||||
public function __construct(Database $database) {
|
public function __construct(IDbConnection $dbConn) {
|
||||||
$this->database = $database;
|
$this->dbConn = $dbConn;
|
||||||
//$this->users = new Users($this->database);
|
$this->users = new Users($this->dbConn);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDbQueryCount(): int {
|
||||||
|
$result = $this->dbConn->query('SHOW SESSION STATUS LIKE "Questions"');
|
||||||
|
return $result->next() ? $result->getInteger(0) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRouter(): Router {
|
public function getRouter(): Router {
|
||||||
|
|
|
@ -70,7 +70,7 @@ final class Pagination {
|
||||||
$source ??= $_GET;
|
$source ??= $_GET;
|
||||||
|
|
||||||
if(isset($source[$name]) && is_string($source[$name]) && ctype_digit($source[$name]))
|
if(isset($source[$name]) && is_string($source[$name]) && ctype_digit($source[$name]))
|
||||||
return intval($source[$name]);
|
return (int)$source[$name];
|
||||||
|
|
||||||
return $default;
|
return $default;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ use InvalidArgumentException;
|
||||||
use Twig\Environment as TwigEnvironment;
|
use Twig\Environment as TwigEnvironment;
|
||||||
use Twig_Extensions_Extension_Date;
|
use Twig_Extensions_Extension_Date;
|
||||||
use Twig\Loader\FilesystemLoader as TwigLoaderFilesystem;
|
use Twig\Loader\FilesystemLoader as TwigLoaderFilesystem;
|
||||||
|
use Misuzu\MszContext;
|
||||||
|
|
||||||
final class Template {
|
final class Template {
|
||||||
private const FILE_EXT = '.twig';
|
private const FILE_EXT = '.twig';
|
||||||
|
@ -13,7 +14,7 @@ final class Template {
|
||||||
private static $env;
|
private static $env;
|
||||||
private static $vars = [];
|
private static $vars = [];
|
||||||
|
|
||||||
public static function init(?string $cache = null, bool $debug = false): void {
|
public static function init(MszContext $ctx, ?string $cache = null, bool $debug = false): void {
|
||||||
self::$loader = new TwigLoaderFilesystem;
|
self::$loader = new TwigLoaderFilesystem;
|
||||||
self::$env = new TwigEnvironment(self::$loader, [
|
self::$env = new TwigEnvironment(self::$loader, [
|
||||||
'cache' => $cache ?? false,
|
'cache' => $cache ?? false,
|
||||||
|
@ -21,8 +22,7 @@ final class Template {
|
||||||
'auto_reload' => $debug,
|
'auto_reload' => $debug,
|
||||||
'debug' => $debug,
|
'debug' => $debug,
|
||||||
]);
|
]);
|
||||||
//self::$env->addExtension(new Twig_Extensions_Extension_Date);
|
self::$env->addExtension(new TwigMisuzu($ctx));
|
||||||
self::$env->addExtension(new TwigMisuzu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function addPath(string $path): void {
|
public static function addPath(string $path): void {
|
||||||
|
|
|
@ -6,9 +6,16 @@ use Twig\TwigFilter;
|
||||||
use Twig\TwigFunction;
|
use Twig\TwigFunction;
|
||||||
use Twig\Environment as TwigEnvironment;
|
use Twig\Environment as TwigEnvironment;
|
||||||
use Misuzu\Parsers\Parser;
|
use Misuzu\Parsers\Parser;
|
||||||
|
use Misuzu\MszContext;
|
||||||
use Index\Environment;
|
use Index\Environment;
|
||||||
|
|
||||||
final class TwigMisuzu extends AbstractExtension {
|
final class TwigMisuzu extends AbstractExtension {
|
||||||
|
private MszContext $ctx;
|
||||||
|
|
||||||
|
public function __construct(MszContext $ctx) {
|
||||||
|
$this->ctx = $ctx;
|
||||||
|
}
|
||||||
|
|
||||||
public function getFilters() {
|
public function getFilters() {
|
||||||
return [
|
return [
|
||||||
new TwigFilter('html_colour', 'html_colour'),
|
new TwigFilter('html_colour', 'html_colour'),
|
||||||
|
@ -34,7 +41,7 @@ final class TwigMisuzu extends AbstractExtension {
|
||||||
new TwigFunction('git_tag', fn() => GitInfo::tag()),
|
new TwigFunction('git_tag', fn() => GitInfo::tag()),
|
||||||
new TwigFunction('git_branch', fn() => GitInfo::branch()),
|
new TwigFunction('git_branch', fn() => GitInfo::branch()),
|
||||||
new TwigFunction('startup_time', fn(float $time = MSZ_STARTUP) => microtime(true) - $time),
|
new TwigFunction('startup_time', fn(float $time = MSZ_STARTUP) => microtime(true) - $time),
|
||||||
new TwigFunction('sql_query_count', fn() => DB::queries()),
|
new TwigFunction('sql_query_count', fn() => DB::queries() + $this->ctx->getDbQueryCount()),
|
||||||
new TwigFunction('ndx_version', fn() => Environment::getIndexVersion()),
|
new TwigFunction('ndx_version', fn() => Environment::getIndexVersion()),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -323,12 +323,12 @@ class User implements HasRankInterface, JsonSerializable {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
public function hasAge(): bool {
|
public function hasAge(): bool {
|
||||||
return $this->hasBirthdate() && intval($this->getBirthdate()->format('Y')) > 1900;
|
return $this->hasBirthdate() && (int)$this->getBirthdate()->format('Y') > 1900;
|
||||||
}
|
}
|
||||||
public function getAge(): int {
|
public function getAge(): int {
|
||||||
if(!$this->hasAge())
|
if(!$this->hasAge())
|
||||||
return -1;
|
return -1;
|
||||||
return intval($this->getBirthdate()->diff(new DateTime('now', new DateTimeZone('UTC')))->format('%y'));
|
return (int)$this->getBirthdate()->diff(new DateTime('now', new DateTimeZone('UTC')))->format('%y');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function profileFields(bool $filterEmpty = true): array {
|
public function profileFields(bool $filterEmpty = true): array {
|
||||||
|
|
38
src/Users/UserInfo.php
Normal file
38
src/Users/UserInfo.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
namespace Misuzu\Users;
|
||||||
|
|
||||||
|
use Index\DateTime;
|
||||||
|
|
||||||
|
abstract class UserInfo {
|
||||||
|
abstract public function getId(): string;
|
||||||
|
abstract public function getName(): string;
|
||||||
|
abstract public function getCountryCode(): string;
|
||||||
|
|
||||||
|
abstract public function isGuest(): bool;
|
||||||
|
abstract public function isSystem(): bool;
|
||||||
|
abstract public function isSuper(): bool;
|
||||||
|
|
||||||
|
abstract public function getDisplayRoleId(): string;
|
||||||
|
|
||||||
|
// need Index colour type
|
||||||
|
//abstract public function getColour(): ?int;
|
||||||
|
|
||||||
|
abstract public function getCreatedDate(): DateTime;
|
||||||
|
abstract public function getLastActiveDate(): DateTime;
|
||||||
|
abstract public function getDeletedDate(): DateTime;
|
||||||
|
|
||||||
|
public function hasColour(): bool {
|
||||||
|
return $this->getColour() !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DateTime $epoch;
|
||||||
|
public function isDeleted(): bool {
|
||||||
|
return self::$epoch->diff($this->getDeletedDate())->totalSeconds() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function init(): void {
|
||||||
|
self::$epoch = DateTime::fromUnixTimeSeconds(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UserInfo::init();
|
|
@ -2,15 +2,15 @@
|
||||||
namespace Misuzu\Users;
|
namespace Misuzu\Users;
|
||||||
|
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use Misuzu\Database\Database;
|
use Index\Data\IDbConnection;
|
||||||
|
|
||||||
final class Users {
|
final class Users {
|
||||||
private Database $db;
|
private IDbConnection $dbConn;
|
||||||
|
|
||||||
private array $cached = [];
|
private array $cached = [];
|
||||||
|
|
||||||
public function __construct(Database $db) {
|
public function __construct(IDbConnection $dbConn) {
|
||||||
$this->db = $db;
|
$this->dbConn = $dbConn;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getById(string $userId): User {
|
public function getById(string $userId): User {
|
||||||
|
|
|
@ -19,7 +19,7 @@ define('MSZ_PERM_USER_MANAGE_ROLES', 0x00200000);
|
||||||
define('MSZ_PERM_USER_MANAGE_PERMS', 0x00400000);
|
define('MSZ_PERM_USER_MANAGE_PERMS', 0x00400000);
|
||||||
define('MSZ_PERM_USER_MANAGE_REPORTS', 0x00800000);
|
define('MSZ_PERM_USER_MANAGE_REPORTS', 0x00800000);
|
||||||
define('MSZ_PERM_USER_MANAGE_WARNINGS', 0x01000000);
|
define('MSZ_PERM_USER_MANAGE_WARNINGS', 0x01000000);
|
||||||
//define('MSZ_PERM_USER_MANAGE_BLACKLISTS', 0x02000000); // Replaced with MSZ_PERM_MANAGE_BLACKLIST
|
//define('MSZ_PERM_USER_MANAGE_BLACKLISTS', 0x02000000); // Replaced with MSZ_PERM_GENERAL_MANAGE_BLACKLIST
|
||||||
|
|
||||||
define('MSZ_PERMS_CHANGELOG', 'changelog');
|
define('MSZ_PERMS_CHANGELOG', 'changelog');
|
||||||
define('MSZ_PERM_CHANGELOG_MANAGE_CHANGES', 0x00000001);
|
define('MSZ_PERM_CHANGELOG_MANAGE_CHANGES', 0x00000001);
|
||||||
|
|
|
@ -30,7 +30,7 @@ function array_find(array $array, callable $callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function clamp($num, int $min, int $max): int {
|
function clamp($num, int $min, int $max): int {
|
||||||
return max($min, min($max, intval($num)));
|
return max($min, min($max, (int)$num));
|
||||||
}
|
}
|
||||||
|
|
||||||
function starts_with(string $string, string $text): bool {
|
function starts_with(string $string, string $text): bool {
|
||||||
|
|
Loading…
Reference in a new issue