diff --git a/composer.json b/composer.json index 975782c..d90bf27 100644 --- a/composer.json +++ b/composer.json @@ -1,15 +1,14 @@ { - "minimum-stability": "dev", - "prefer-stable": true, "require": { - "flashwave/index": "dev-master", - "flashwave/sasae": "dev-master", + "flashwave/index": "^0.2408.40014", + "flashwave/sasae": "^1.1", + "flashwave/syokuhou": "^1.2", "erusev/parsedown": "~1.6", "chillerlan/php-qrcode": "^4.3", "symfony/mailer": "^6.0", "matomo/device-detector": "^6.1", "sentry/sdk": "^4.0", - "flashwave/syokuhou": "dev-master" + "nesbot/carbon": "^3.7" }, "autoload": { "classmap": [ @@ -34,6 +33,6 @@ } }, "require-dev": { - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.11" } } diff --git a/composer.lock b/composer.lock index bfa6d3c..4cd2353 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,77 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a21e81f36e0bcc863143a9d85b28c8ff", + "content-hash": "cec099ea3b4fce65aa1b1ff6b0b40f24", "packages": [ + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, { "name": "chillerlan/php-qrcode", "version": "4.4.1", @@ -349,30 +418,26 @@ }, { "name": "flashwave/index", - "version": "dev-master", + "version": "v0.2408.40014", "source": { "type": "git", "url": "https://patchii.net/flash/index.git", - "reference": "e4c8ed711e045cffe840ba10a239ede14b0b171f" + "reference": "fbca708fbd75e8ecc6b36b39c1307a67bf250808" }, "require": { "ext-mbstring": "*", - "php": ">=8.1" + "php": ">=8.3" }, "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.2" + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11.2" }, "suggest": { "ext-mysqli": "Support for the Index\\Data\\MariaDB namespace (both mysqlnd and libmysql are supported).", "ext-sqlite3": "Support for the Index\\Data\\SQLite namespace." }, - "default-branch": true, "type": "library", "autoload": { - "files": [ - "index.php" - ], "psr-4": { "Index\\": "src" } @@ -391,27 +456,26 @@ ], "description": "Composer package for the common library for my projects.", "homepage": "https://railgun.sh/index", - "time": "2024-04-10T23:40:14+00:00" + "time": "2024-08-04T00:14:17+00:00" }, { "name": "flashwave/sasae", - "version": "dev-master", + "version": "v1.1.0", "source": { "type": "git", "url": "https://patchii.net/flash/sasae.git", - "reference": "c8a9f2974e6591215b3f898dd5525de1e8367f66" + "reference": "ad63107a4387aa35c45bce71c2d6262a15b96f9d" }, "require": { - "flashwave/index": "dev-master", - "php": ">=8.2", - "twig/html-extra": "^3.7", - "twig/twig": "^3.7" + "flashwave/index": "^0.2408.40014", + "php": ">=8.3", + "twig/html-extra": "^3.10", + "twig/twig": "^3.10" }, "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.2" + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11.2" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -432,25 +496,24 @@ ], "description": "A wrapper for Twig with added common functionality.", "homepage": "https://railgun.sh/sasae", - "time": "2024-01-04T02:13:42+00:00" + "time": "2024-08-04T00:48:17+00:00" }, { "name": "flashwave/syokuhou", - "version": "dev-master", + "version": "v1.2.0", "source": { "type": "git", "url": "https://patchii.net/flash/syokuhou.git", - "reference": "954a07b95110a43e64dd6e20b2a25f4676c71a08" + "reference": "129a46c0d917382f9bc195cce278be51984eb87d" }, "require": { - "flashwave/index": "dev-master", - "php": ">=8.2" + "flashwave/index": "^0.2408.40014", + "php": ">=8.3" }, "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.4" + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^11.2" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -471,20 +534,20 @@ ], "description": "Configuration library for PHP.", "homepage": "https://railgun.sh/syokuhou", - "time": "2024-06-03T22:59:30+00:00" + "time": "2024-08-04T01:07:23+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -499,8 +562,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -571,7 +634,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -587,7 +650,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "jean85/pretty-package-versions", @@ -771,6 +834,160 @@ }, "time": "2019-09-10T13:16:29+00:00" }, + { + "name": "nesbot/carbon", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cb4374784c87d0a0294e8513a52eb63c0aff3139", + "reference": "cb4374784c87d0a0294e8513a52eb63c0aff3139", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "*", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.57.2", + "kylekatarnls/multi-tester": "^2.5.3", + "ondrejmirtes/better-reflection": "^6.25.0.4", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.11.2", + "phpunit/phpunit": "^10.5.20", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2024-07-16T22:29:20+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -1220,6 +1437,80 @@ ], "time": "2024-07-16T13:45:27+00:00" }, + { + "name": "symfony/clock", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7", + "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, { "name": "symfony/deprecation-contracts", "version": "v3.5.0", @@ -2151,6 +2442,82 @@ ], "time": "2024-05-31T15:07:36+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:35:24+00:00" + }, { "name": "symfony/service-contracts", "version": "v3.5.0", @@ -2234,6 +2601,178 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/translation", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/8d5e50c813ba2859a6dfc99a0765c550507934a1", + "reference": "8d5e50c813ba2859a6dfc99a0765c550507934a1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.18|^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T12:41:01+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, { "name": "twig/html-extra", "version": "v3.10.0", @@ -2385,16 +2924,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.11.7", + "version": "1.11.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d" + "reference": "e370bcddadaede0c1716338b262346f40d296f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e370bcddadaede0c1716338b262346f40d296f82", + "reference": "e370bcddadaede0c1716338b262346f40d296f82", "shasum": "" }, "require": { @@ -2439,17 +2978,13 @@ "type": "github" } ], - "time": "2024-07-06T11:17:41+00:00" + "time": "2024-08-01T16:25:18+00:00" } ], "aliases": [], - "minimum-stability": "dev", - "stability-flags": { - "flashwave/index": 20, - "flashwave/sasae": 20, - "flashwave/syokuhou": 20 - }, - "prefer-stable": true, + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, "prefer-lowest": false, "platform": [], "platform-dev": [], diff --git a/misuzu.php b/misuzu.php index 15632e2..dd57a25 100644 --- a/misuzu.php +++ b/misuzu.php @@ -1,7 +1,6 @@ getAuthInfo(); if(!$authInfo->isLoggedIn()) @@ -152,11 +153,11 @@ if(!empty($_POST)) { if($mode === 'create') { $postTimeout = $cfg->getInteger('forum.posting.timeout', 5); if($postTimeout > 0) { - $postTimeoutThreshold = DateTime::now()->modify(sprintf('-%d seconds', $postTimeout)); + $postTimeoutThreshold = new CarbonImmutable(sprintf('-%d seconds', $postTimeout)); $lastPostCreatedAt = $forumPosts->getUserLastPostCreatedAt($currentUser); - if($lastPostCreatedAt->isMoreThan($postTimeoutThreshold)) { - $waitSeconds = $postTimeout + ($lastPostCreatedAt->getUnixTimeSeconds() - time()); + if(XDateTime::compare($lastPostCreatedAt, $postTimeoutThreshold) > 0) { + $waitSeconds = $postTimeout + ((int)$lastPostCreatedAt->format('U') - time()); $notices[] = sprintf("You're posting too quickly! Please wait %s seconds before posting again.", number_format($waitSeconds)); $notices[] = "It's possible that your post went through successfully and you pressed the submit button twice by accident."; diff --git a/public-legacy/manage/changelog/change.php b/public-legacy/manage/changelog/change.php index 5633fb6..981b295 100644 --- a/public-legacy/manage/changelog/change.php +++ b/public-legacy/manage/changelog/change.php @@ -3,9 +3,9 @@ namespace Misuzu; use DateTimeInterface; use RuntimeException; -use Index\DateTime; -use Index\XArray; use Misuzu\Changelog\Changelog; +use Carbon\CarbonImmutable; +use Index\{XArray,XDateTime}; $authInfo = $msz->getAuthInfo(); if(!$authInfo->getPerms('global')->check(Perm::G_CL_CHANGES_MANAGE)) @@ -58,8 +58,8 @@ while($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) { if(empty($createdAt)) $createdAt = null; else { - $createdAt = DateTime::createFromFormat(DateTimeInterface::ATOM, $createdAt . ':00Z'); - if($createdAt->getUnixTimeSeconds() < 0) + $createdAt = CarbonImmutable::createFromFormat(DateTimeInterface::ATOM, $createdAt . ':00Z'); + if((int)$createdAt->format('U') < 0) $createdAt = null; } @@ -72,7 +72,7 @@ while($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) { $summary = null; if($body === $changeInfo->getBody()) $body = null; - if($createdAt !== null && $createdAt->equals($changeInfo->getCreatedAt())) + if($createdAt !== null && XDateTime::compare($createdAt, $changeInfo->getCreatedAt()) === 0) $createdAt = null; $updateUserInfo = $userId !== $changeInfo->getUserId(); diff --git a/public-legacy/manage/users/ban.php b/public-legacy/manage/users/ban.php index 3cea458..b537e0e 100644 --- a/public-legacy/manage/users/ban.php +++ b/public-legacy/manage/users/ban.php @@ -3,7 +3,7 @@ namespace Misuzu; use DateTimeInterface; use RuntimeException; -use Index\DateTime; +use Carbon\CarbonImmutable; $authInfo = $msz->getAuthInfo(); if(!$authInfo->getPerms('user')->check(Perm::U_BANS_MANAGE)) @@ -56,7 +56,7 @@ while($_SERVER['REQUEST_METHOD'] === 'POST' && CSRF::validateRequest()) { if($expires === -1) { $expires = null; } elseif($expires === -2) { - $expires = DateTime::createFromFormat(DateTimeInterface::ATOM, $expiresCustom . ':00Z'); + $expires = CarbonImmutable::createFromFormat(DateTimeInterface::ATOM, $expiresCustom . ':00Z'); } else { echo 'Invalid duration specified.'; break; diff --git a/public-legacy/profile.php b/public-legacy/profile.php index 46ef3bc..ae1f444 100644 --- a/public-legacy/profile.php +++ b/public-legacy/profile.php @@ -5,7 +5,6 @@ use stdClass; use InvalidArgumentException; use RuntimeException; use Index\ByteFormat; -use Index\DateTime; use Misuzu\Parsers\Parser; use Misuzu\Users\User; use Misuzu\Users\Assets\UserAvatarAsset; diff --git a/src/AuditLog/AuditLogInfo.php b/src/AuditLog/AuditLogInfo.php index 4b2f654..41f0e74 100644 --- a/src/AuditLog/AuditLogInfo.php +++ b/src/AuditLog/AuditLogInfo.php @@ -2,7 +2,7 @@ namespace Misuzu\AuditLog; use ValueError; -use Index\DateTime; +use Carbon\CarbonImmutable; use Index\Data\IDbResult; use Index\Net\IPAddress; @@ -47,8 +47,8 @@ class AuditLogInfo { return $this->created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getRemoteAddressRaw(): string { diff --git a/src/Auth/AuthInfo.php b/src/Auth/AuthInfo.php index 0769997..d5ec157 100644 --- a/src/Auth/AuthInfo.php +++ b/src/Auth/AuthInfo.php @@ -1,7 +1,6 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getUserAgentString(): string { diff --git a/src/Auth/LoginAttempts.php b/src/Auth/LoginAttempts.php index 24d2170..6ebda9c 100644 --- a/src/Auth/LoginAttempts.php +++ b/src/Auth/LoginAttempts.php @@ -1,7 +1,6 @@ getId(); if($remoteAddr instanceof IPAddress) $remoteAddr = (string)$remoteAddr; - if($timeRange instanceof TimeSpan) - $timeRange = (int)$timeRange->totalSeconds(); $hasSuccess = $success !== null; $hasUserInfo = $userInfo !== null; @@ -81,15 +78,13 @@ class LoginAttempts { ?bool $success = null, UserInfo|string|null $userInfo = null, IPAddress|string|null $remoteAddr = null, - TimeSpan|int|null $timeRange = null, + int|null $timeRange = null, ?Pagination $pagination = null ): iterable { if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); if($remoteAddr instanceof IPAddress) $remoteAddr = (string)$remoteAddr; - if($timeRange instanceof TimeSpan) - $timeRange = (int)$timeRange->totalSeconds(); $hasSuccess = $success !== null; $hasUserInfo = $userInfo !== null; diff --git a/src/Auth/RecoveryTokenInfo.php b/src/Auth/RecoveryTokenInfo.php index 46a342b..70b0e92 100644 --- a/src/Auth/RecoveryTokenInfo.php +++ b/src/Auth/RecoveryTokenInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getExpiresTime(): int { return $this->created + self::LIFETIME; } - public function getExpiresAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created + self::LIFETIME); + public function getExpiresAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->getExpiresTime()); } public function hasExpired(): bool { diff --git a/src/Auth/RecoveryTokens.php b/src/Auth/RecoveryTokens.php index 213e8a6..72a255d 100644 --- a/src/Auth/RecoveryTokens.php +++ b/src/Auth/RecoveryTokens.php @@ -3,10 +3,10 @@ namespace Misuzu\Auth; use InvalidArgumentException; use RuntimeException; +use Index\Base32; use Index\Data\DbStatementCache; use Index\Data\IDbConnection; use Index\Net\IPAddress; -use Index\Serialisation\Base32; use Misuzu\ClientInfo; use Misuzu\Pagination; use Misuzu\Users\UserInfo; diff --git a/src/Auth/SessionInfo.php b/src/Auth/SessionInfo.php index 4fa9ecd..13e1ff1 100644 --- a/src/Auth/SessionInfo.php +++ b/src/Auth/SessionInfo.php @@ -1,10 +1,10 @@ expires; } - public function getExpiresAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->expires); + public function getExpiresAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->expires); } public function shouldBumpExpires(): bool { @@ -107,8 +107,8 @@ class SessionInfo { return $this->created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function hasLastActive(): bool { @@ -119,7 +119,7 @@ class SessionInfo { return $this->lastActive; } - public function getLastActiveAt(): ?DateTime { - return $this->lastActive === null ? null : DateTime::fromUnixTimeSeconds($this->lastActive); + public function getLastActiveAt(): ?CarbonImmutable { + return $this->lastActive === null ? null : CarbonImmutable::createFromTimestampUTC($this->lastActive); } } diff --git a/src/CSRF.php b/src/CSRF.php index 37b0b45..d4e065f 100644 --- a/src/CSRF.php +++ b/src/CSRF.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getDate(): string { diff --git a/src/Changelog/ChangeTagInfo.php b/src/Changelog/ChangeTagInfo.php index 4d8ddf7..3ad14a0 100644 --- a/src/Changelog/ChangeTagInfo.php +++ b/src/Changelog/ChangeTagInfo.php @@ -2,7 +2,7 @@ namespace Misuzu\Changelog; use Stringable; -use Index\DateTime; +use Carbon\CarbonImmutable; use Index\Data\IDbResult; class ChangeTagInfo implements Stringable { @@ -38,16 +38,16 @@ class ChangeTagInfo implements Stringable { return $this->created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getArchivedTime(): int { return $this->archived; } - public function getArchivedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getArchivedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->archived); } public function isArchived(): bool { diff --git a/src/Changelog/Changelog.php b/src/Changelog/Changelog.php index 1dc4a06..f663415 100644 --- a/src/Changelog/Changelog.php +++ b/src/Changelog/Changelog.php @@ -3,7 +3,7 @@ namespace Misuzu\Changelog; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; +use DateTimeInterface; use Index\Data\DbStatementCache; use Index\Data\DbTools; use Index\Data\IDbConnection; @@ -66,13 +66,13 @@ class Changelog { public function countChanges( UserInfo|string|null $userInfo = null, - DateTime|int|null $dateTime = null, + DateTimeInterface|int|null $dateTime = null, ?array $tags = null ): int { if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($dateTime instanceof DateTime) - $dateTime = $dateTime->getUnixTimeSeconds(); + if($dateTime instanceof DateTimeInterface) + $dateTime = (int)$dateTime->format('U'); $args = 0; $hasUserInfo = $userInfo !== null; @@ -118,14 +118,14 @@ class Changelog { public function getChanges( UserInfo|string|null $userInfo = null, - DateTime|int|null $dateTime = null, + DateTimeInterface|int|null $dateTime = null, ?array $tags = null, ?Pagination $pagination = null ): iterable { if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($dateTime instanceof DateTime) - $dateTime = $dateTime->getUnixTimeSeconds(); + if($dateTime instanceof DateTimeInterface) + $dateTime = (int)$dateTime->format('U'); $args = 0; $hasUserInfo = $userInfo !== null; @@ -189,14 +189,14 @@ class Changelog { string $summary, string $body = '', UserInfo|string|null $userInfo = null, - DateTime|int|null $createdAt = null + DateTimeInterface|int|null $createdAt = null ): ChangeInfo { if(is_string($action)) $action = self::convertToActionId($action); if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($createdAt instanceof DateTime) - $createdAt = $createdAt->getUnixTimeSeconds(); + if($createdAt instanceof DateTimeInterface) + $createdAt = (int)$createdAt->format('U'); $summary = trim($summary); if(empty($summary)) @@ -233,7 +233,7 @@ class Changelog { ?string $body = null, bool $updateUserInfo = false, UserInfo|string|null $userInfo = null, - DateTime|int|null $createdAt = null + DateTimeInterface|int|null $createdAt = null ): void { if($infoOrId instanceof ChangeInfo) $infoOrId = $infoOrId->getId(); @@ -242,8 +242,8 @@ class Changelog { $action = self::convertToActionId($action); if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($createdAt instanceof DateTime) - $createdAt = $createdAt->getUnixTimeSeconds(); + if($createdAt instanceof DateTimeInterface) + $createdAt = (int)$createdAt->format('U'); if($summary !== null) { $summary = trim($summary); diff --git a/src/Comments/CommentsCategoryInfo.php b/src/Comments/CommentsCategoryInfo.php index df3f0d1..afd2df7 100644 --- a/src/Comments/CommentsCategoryInfo.php +++ b/src/Comments/CommentsCategoryInfo.php @@ -1,9 +1,9 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); + } public function getLockedTime(): ?int { return $this->locked; } - public function getLockedAt(): ?DateTime { - return $this->locked === null ? null : DateTime::fromUnixTimeSeconds($this->locked); + public function getLockedAt(): ?CarbonImmutable { + return $this->locked === null ? null : CarbonImmutable::createFromTimestampUTC($this->locked); } public function isLocked(): bool { diff --git a/src/Comments/CommentsPostInfo.php b/src/Comments/CommentsPostInfo.php index 1a2595e..c3e811a 100644 --- a/src/Comments/CommentsPostInfo.php +++ b/src/Comments/CommentsPostInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getPinnedTime(): ?int { return $this->pinned; } - public function getPinnedAt(): DateTime { - return $this->pinned === null ? null : DateTime::fromUnixTimeSeconds($this->pinned); + public function getPinnedAt(): ?CarbonImmutable { + return $this->pinned === null ? null : CarbonImmutable::createFromTimestampUTC($this->pinned); } public function isPinned(): bool { @@ -106,8 +106,8 @@ class CommentsPostInfo { return $this->updated; } - public function getUpdatedAt(): DateTime { - return $this->updated === null ? null : DateTime::fromUnixTimeSeconds($this->updated); + public function getUpdatedAt(): ?CarbonImmutable { + return $this->updated === null ? null : CarbonImmutable::createFromTimestampUTC($this->updated); } public function isEdited(): bool { @@ -118,8 +118,8 @@ class CommentsPostInfo { return $this->deleted; } - public function getDeletedAt(): DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } public function isDeleted(): bool { diff --git a/src/Counters/CounterInfo.php b/src/Counters/CounterInfo.php index d277b7c..66967b6 100644 --- a/src/Counters/CounterInfo.php +++ b/src/Counters/CounterInfo.php @@ -1,7 +1,7 @@ updated; } - public function getUpdatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->updated); + public function getUpdatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->updated); } } diff --git a/src/Forum/ForumCategoryInfo.php b/src/Forum/ForumCategoryInfo.php index a758517..8925921 100644 --- a/src/Forum/ForumCategoryInfo.php +++ b/src/Forum/ForumCategoryInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function isArchived(): bool { diff --git a/src/Forum/ForumPostInfo.php b/src/Forum/ForumPostInfo.php index e1948cc..85d4014 100644 --- a/src/Forum/ForumPostInfo.php +++ b/src/Forum/ForumPostInfo.php @@ -1,10 +1,11 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } - private static ?DateTime $markAsEditedThreshold = null; + private static ?CarbonImmutable $markAsEditedThreshold = null; + public function shouldMarkAsEdited(): bool { if(self::$markAsEditedThreshold === null) - self::$markAsEditedThreshold = DateTime::now()->modify('-5 minutes'); + self::$markAsEditedThreshold = new CarbonImmutable('-5 minutes'); - return $this->getCreatedAt()->isLessThan(self::$markAsEditedThreshold); + return XDateTime::compare($this->getCreatedAt(), self::$markAsEditedThreshold) < 0; } public function isEdited(): bool { @@ -113,16 +115,17 @@ class ForumPostInfo { return $this->edited; } - public function getEditedAt(): ?DateTime { - return $this->edited === null ? null : DateTime::fromUnixTimeSeconds($this->edited); + public function getEditedAt(): ?CarbonImmutable { + return $this->edited === null ? null : CarbonImmutable::createFromTimestampUTC($this->edited); } - private static ?DateTime $canBeDeletedThreshold = null; + private static ?CarbonImmutable $canBeDeletedThreshold = null; + public function canBeDeleted(): bool { if(self::$canBeDeletedThreshold === null) - self::$canBeDeletedThreshold = DateTime::now()->modify('-1 week'); + self::$canBeDeletedThreshold = new CarbonImmutable('-1 week'); - return $this->getCreatedAt()->isMoreThanOrEqual(self::$canBeDeletedThreshold); + return XDateTime::compare($this->getCreatedAt(), self::$canBeDeletedThreshold) >= 0; } public function isDeleted(): bool { @@ -133,7 +136,7 @@ class ForumPostInfo { return $this->deleted; } - public function getDeletedAt(): ?DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } } diff --git a/src/Forum/ForumPosts.php b/src/Forum/ForumPosts.php index 6c71c1e..7fe4e8a 100644 --- a/src/Forum/ForumPosts.php +++ b/src/Forum/ForumPosts.php @@ -4,7 +4,7 @@ namespace Misuzu\Forum; use InvalidArgumentException; use RuntimeException; use stdClass; -use Index\DateTime; +use Carbon\CarbonImmutable; use Index\Data\DbStatementCache; use Index\Data\DbTools; use Index\Data\IDbConnection; @@ -395,8 +395,8 @@ class ForumPosts { return $result->getInteger(0); } - public function getUserLastPostCreatedAt(UserInfo|string $userInfo): DateTime { - return DateTime::fromUnixTimeSeconds($this->getUserLastPostCreatedTime($userInfo)); + public function getUserLastPostCreatedAt(UserInfo|string $userInfo): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->getUserLastPostCreatedTime($userInfo)); } public function generatePostRankings( diff --git a/src/Forum/ForumTopicInfo.php b/src/Forum/ForumTopicInfo.php index c0d0e2c..2376af6 100644 --- a/src/Forum/ForumTopicInfo.php +++ b/src/Forum/ForumTopicInfo.php @@ -1,7 +1,8 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } - private static ?DateTime $lastActiveAt = null; + private static ?CarbonImmutable $lastActiveAt = null; public function isActive(): bool { if(self::$lastActiveAt === null) - self::$lastActiveAt = DateTime::now()->modify('-1 month'); + self::$lastActiveAt = new CarbonImmutable('-1 month'); - return $this->getBumpedAt()->isMoreThanOrEqual(self::$lastActiveAt); + return XDateTime::compare($this->getBumpedAt(), self::$lastActiveAt) >= 0; } public function getBumpedTime(): int { return $this->bumped; } - public function getBumpedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->bumped); + public function getBumpedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->bumped); } public function isDeleted(): bool { @@ -165,8 +166,8 @@ class ForumTopicInfo { return $this->deleted; } - public function getDeletedAt(): ?DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } public function isLocked(): bool { @@ -177,7 +178,7 @@ class ForumTopicInfo { return $this->locked; } - public function getLockedAt(): ?DateTime { - return $this->locked === null ? null : DateTime::fromUnixTimeSeconds($this->locked); + public function getLockedAt(): ?CarbonImmutable { + return $this->locked === null ? null : CarbonImmutable::createFromTimestampUTC($this->locked); } } diff --git a/src/Forum/ForumTopicRedirectInfo.php b/src/Forum/ForumTopicRedirectInfo.php index 7e465b0..74aeeae 100644 --- a/src/Forum/ForumTopicRedirectInfo.php +++ b/src/Forum/ForumTopicRedirectInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } } diff --git a/src/Hanyuu/HanyuuRoutes.php b/src/Hanyuu/HanyuuRoutes.php index bc4e06b..af51134 100644 --- a/src/Hanyuu/HanyuuRoutes.php +++ b/src/Hanyuu/HanyuuRoutes.php @@ -3,9 +3,9 @@ namespace Misuzu\Hanyuu; use stdClass; use RuntimeException; +use Index\UriBase64; use Index\Colour\Colour; use Index\Http\Routing\{HttpGet,HttpMiddleware,HttpPost,RouteHandler}; -use Index\Serialisation\UriBase64; use Syokuhou\IConfig; use Misuzu\CSRF; use Misuzu\Auth\{AuthContext,AuthInfo,Sessions}; @@ -18,8 +18,7 @@ final class HanyuuRoutes extends RouteHandler { private IConfig $impersonateConfig, // this sucks lol private URLRegistry $urls, private UsersContext $usersCtx, - private AuthContext $authCtx, - private AuthInfo $authInfo + private AuthContext $authCtx ) {} private function getEndpoint(): string { diff --git a/src/Home/HomeRoutes.php b/src/Home/HomeRoutes.php index 68f960a..6fa9807 100644 --- a/src/Home/HomeRoutes.php +++ b/src/Home/HomeRoutes.php @@ -2,7 +2,7 @@ namespace Misuzu\Home; use RuntimeException; -use Index\DateTime; +use Index\XDateTime; use Index\Data\{DbTools,IDbConnection}; use Index\Http\Routing\{HttpGet,RouteHandler}; use Syokuhou\IConfig; @@ -167,7 +167,7 @@ class HomeRoutes extends RouteHandler { $stats['users:online:recent'] = count($onlineUserInfos); $birthdays = []; - $birthdayInfos = $this->usersCtx->getUsers()->getUsers(deleted: false, birthdate: DateTime::now(), orderBy: 'random'); + $birthdayInfos = $this->usersCtx->getUsers()->getUsers(deleted: false, birthdate: XDateTime::now(), orderBy: 'random'); foreach($birthdayInfos as $birthdayInfo) $birthdays[] = [ 'info' => $birthdayInfo, diff --git a/src/Messages/MessageInfo.php b/src/Messages/MessageInfo.php index 9562fa5..60c96a1 100644 --- a/src/Messages/MessageInfo.php +++ b/src/Messages/MessageInfo.php @@ -1,9 +1,9 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function isSent(): bool { @@ -110,8 +110,8 @@ class MessageInfo { return $this->sent; } - public function getSentAt(): ?DateTime { - return $this->sent === null ? null : DateTime::fromUnixTimeSeconds($this->sent); + public function getSentAt(): ?CarbonImmutable { + return $this->sent === null ? null : CarbonImmutable::createFromTimestampUTC($this->sent); } public function isRead(): bool { @@ -122,8 +122,8 @@ class MessageInfo { return $this->read; } - public function getReadAt(): ?DateTime { - return $this->read === null ? null : DateTime::fromUnixTimeSeconds($this->read); + public function getReadAt(): ?CarbonImmutable { + return $this->read === null ? null : CarbonImmutable::createFromTimestampUTC($this->read); } public function isDeleted(): bool { @@ -134,8 +134,8 @@ class MessageInfo { return $this->deleted; } - public function getDeletedAt(): ?DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } public function getDisplayTime(): int { @@ -144,7 +144,7 @@ class MessageInfo { return $this->getCreatedTime(); } - public function getDisplayAt(): DateTime { + public function getDisplayAt(): CarbonImmutable { if($this->isSent()) return $this->getSentAt(); return $this->getCreatedAt(); diff --git a/src/Messages/MessagesDatabase.php b/src/Messages/MessagesDatabase.php index 78d4c14..a3b0ce4 100644 --- a/src/Messages/MessagesDatabase.php +++ b/src/Messages/MessagesDatabase.php @@ -3,7 +3,7 @@ namespace Misuzu\Messages; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; +use DateTimeInterface; use Index\Data\{DbStatementCache,DbTools,IDbConnection}; use Misuzu\Pagination; use Misuzu\Users\UserInfo; @@ -189,8 +189,8 @@ class MessagesDatabase { string $body, int $parser, MessageInfo|string|null $replyTo = null, - DateTime|int|null $sentAt = null, - DateTime|int|null $readAt = null + DateTimeInterface|int|null $sentAt = null, + DateTimeInterface|int|null $readAt = null ): MessageInfo { $stmt = $this->cache->get('INSERT INTO msz_messages (msg_id, msg_owner_id, msg_author_id, msg_recipient_id, msg_reply_to, msg_title, msg_body, msg_parser, msg_sent, msg_read) VALUES (?, ?, ?, ?, ?, TO_BASE64(?), TO_BASE64(?), ?, FROM_UNIXTIME(?), FROM_UNIXTIME(?))'); $stmt->addParameter(1, $messageId); @@ -201,8 +201,8 @@ class MessagesDatabase { $stmt->addParameter(6, $title); $stmt->addParameter(7, $body); $stmt->addParameter(8, $parser); - $stmt->addParameter(9, $sentAt instanceof DateTime ? $sentAt->getUnixTimeSeconds() : $sentAt); - $stmt->addParameter(10, $readAt instanceof DateTime ? $readAt->getUnixTimeSeconds() : $readAt); + $stmt->addParameter(9, $sentAt instanceof DateTimeInterface ? (int)$sentAt->format('U') : $sentAt); + $stmt->addParameter(10, $readAt instanceof DateTimeInterface ? (int)$readAt->format('U') : $readAt); $stmt->execute(); return $this->getMessageInfo($ownerInfo, $messageId); @@ -214,8 +214,8 @@ class MessagesDatabase { ?string $title = null, ?string $body = null, ?int $parser = null, - DateTime|int|null|false $sentAt = false, - DateTime|int|null|false $readAt = false + DateTimeInterface|int|null|false $sentAt = false, + DateTimeInterface|int|null|false $readAt = false ): void { $setQuery = []; $setValues = []; @@ -249,12 +249,12 @@ class MessagesDatabase { if($sentAt !== false) { $setQuery[] = 'msg_sent = FROM_UNIXTIME(?)'; - $setValues[] = $sentAt instanceof DateTime ? $sentAt->getUnixTimeSeconds() : $sentAt; + $setValues[] = $sentAt instanceof DateTimeInterface ? (int)$sentAt->format('U') : $sentAt; } if($readAt !== false) { $setQuery[] = 'msg_read = FROM_UNIXTIME(?)'; - $setValues[] = $readAt instanceof DateTime ? $readAt->getUnixTimeSeconds() : $readAt; + $setValues[] = $readAt instanceof DateTimeInterface ? (int)$readAt->format('U') : $readAt; } if(empty($whereQuery)) diff --git a/src/MisuzuContext.php b/src/MisuzuContext.php index a598070..6b887f3 100644 --- a/src/MisuzuContext.php +++ b/src/MisuzuContext.php @@ -1,7 +1,6 @@ siteInfo; $globals['auth_info'] = $this->authInfo; $globals['active_ban_info'] = $this->usersCtx->tryGetActiveBan($this->authInfo->getUserInfo()); @@ -283,8 +282,7 @@ class MisuzuContext { $this->config->scopeTo('impersonate'), $this->urls, $this->usersCtx, - $this->authCtx, - $this->authInfo + $this->authCtx )); $routingCtx->register(new LegacyRoutes($this->urls)); diff --git a/src/MisuzuSasaeExtension.php b/src/MisuzuSasaeExtension.php index 527dfdb..c92c466 100644 --- a/src/MisuzuSasaeExtension.php +++ b/src/MisuzuSasaeExtension.php @@ -1,10 +1,11 @@ assets?->{$name} ?? ''; } - public function timeFormat(DateTime|string|int|null $dateTime): string { + public function timeFormat(DateTimeInterface|string|int|null $dateTime): string { if($dateTime === null) return 'never'; if(is_string($dateTime)) - $dateTime = new DateTime($dateTime); + $dateTime = new CarbonImmutable($dateTime); elseif(is_int($dateTime)) - $dateTime = DateTime::fromUnixTimeSeconds($dateTime); + $dateTime = CarbonImmutable::createFromTimestampUTC($dateTime); + elseif(!($dateTime instanceof CarbonImmutable)) + $dateTime = new CarbonImmutable($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; + return $dateTime->diffForHumans(); } public function getHeaderMenu(): array { diff --git a/src/News/News.php b/src/News/News.php index 37d4327..877ac8b 100644 --- a/src/News/News.php +++ b/src/News/News.php @@ -3,7 +3,7 @@ namespace Misuzu\News; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; +use DateTimeInterface; use Index\Data\DbStatementCache; use Index\Data\IDbConnection; use Index\Data\IDbResult; @@ -286,14 +286,14 @@ class News { string $body, bool $featured = false, UserInfo|string|null $userInfo = null, - DateTime|int|null $schedule = null + DateTimeInterface|int|null $schedule = null ): NewsPostInfo { if($categoryInfo instanceof NewsCategoryInfo) $categoryInfo = $categoryInfo->getId(); if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($schedule instanceof DateTime) - $schedule = $schedule->getUnixTimeSeconds(); + if($schedule instanceof DateTimeInterface) + $schedule = (int)$schedule->format('U'); $title = trim($title); if(empty($title)) @@ -351,7 +351,7 @@ class News { ?bool $featured = null, bool $updateUserInfo = false, UserInfo|string|null $userInfo = null, - DateTime|int|null $schedule = null + DateTimeInterface|int|null $schedule = null ): void { if($postInfo instanceof NewsPostInfo) $postInfo = $postInfo->getId(); @@ -359,8 +359,8 @@ class News { $categoryInfo = $categoryInfo->getId(); if($userInfo instanceof UserInfo) $userInfo = $userInfo->getId(); - if($schedule instanceof DateTime) - $schedule = $schedule->getUnixTimeSeconds(); + if($schedule instanceof DateTimeInterface) + $schedule = (int)$schedule->format('U'); if($title !== null) { $title = trim($title); diff --git a/src/News/NewsCategoryInfo.php b/src/News/NewsCategoryInfo.php index f3d07fa..eb49989 100644 --- a/src/News/NewsCategoryInfo.php +++ b/src/News/NewsCategoryInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getPostsCount(): int { diff --git a/src/News/NewsPostInfo.php b/src/News/NewsPostInfo.php index 81e0d9a..c2da950 100644 --- a/src/News/NewsPostInfo.php +++ b/src/News/NewsPostInfo.php @@ -1,7 +1,7 @@ scheduled; } - public function getScheduledAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->scheduled); + public function getScheduledAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->scheduled); } public function isPublished(): bool { @@ -96,16 +96,16 @@ class NewsPostInfo { return $this->created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getUpdatedTime(): int { return $this->updated; } - public function getUpdatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->updated); + public function getUpdatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->updated); } public function isEdited(): bool { @@ -120,7 +120,7 @@ class NewsPostInfo { return $this->deleted; } - public function getDeletedAt(): ?DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } } diff --git a/src/News/NewsRoutes.php b/src/News/NewsRoutes.php index 95f7bb0..fa1bd49 100644 --- a/src/News/NewsRoutes.php +++ b/src/News/NewsRoutes.php @@ -2,7 +2,6 @@ namespace Misuzu\News; use RuntimeException; -use Index\DateTime; use Index\Data\{DbTools,IDbConnection}; use Index\Http\Routing\{HttpGet,RouteHandler}; use Misuzu\{Pagination,SiteInfo,Template}; diff --git a/src/Perms/Permissions.php b/src/Perms/Permissions.php index 64a0b1c..e5677ba 100644 --- a/src/Perms/Permissions.php +++ b/src/Perms/Permissions.php @@ -4,8 +4,7 @@ namespace Misuzu\Perms; use stdClass; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; -use Index\Environment; +use Index\XDateTime; use Index\Data\DbStatementCache; use Index\Data\DbTools; use Index\Data\IDbConnection; @@ -371,10 +370,10 @@ class Permissions { } private static function precalculatePermissionsLog(string $fmt, ...$args): void { - if(!Environment::isConsole()) + if(!MSZ_CLI) return; - echo DateTime::now()->format('[H:i:s.u] '); + echo XDateTime::now()->format('[H:i:s.u] '); vprintf($fmt, $args); echo PHP_EOL; } diff --git a/src/TOTPGenerator.php b/src/TOTPGenerator.php index 393f30c..2e2f8fd 100644 --- a/src/TOTPGenerator.php +++ b/src/TOTPGenerator.php @@ -2,7 +2,7 @@ namespace Misuzu; use InvalidArgumentException; -use Index\Serialisation\Base32; +use Index\Base32; class TOTPGenerator { public const DIGITS = 6; diff --git a/src/Users/BanInfo.php b/src/Users/BanInfo.php index 9e9eee9..6db545c 100644 --- a/src/Users/BanInfo.php +++ b/src/Users/BanInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function isPermanent(): bool { @@ -81,8 +81,8 @@ class BanInfo { return $this->expires; } - public function getExpiresAt(): ?DateTime { - return $this->expires === null ? null : DateTime::fromUnixTimeSeconds($this->expires); + public function getExpiresAt(): ?CarbonImmutable { + return $this->expires === null ? null : CarbonImmutable::createFromTimestampUTC($this->expires); } public function isActive(): bool { diff --git a/src/Users/Bans.php b/src/Users/Bans.php index be7c5c8..f251b81 100644 --- a/src/Users/Bans.php +++ b/src/Users/Bans.php @@ -3,11 +3,11 @@ namespace Misuzu\Users; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; +use DateTimeInterface; +use Misuzu\Pagination; use Index\Data\DbStatementCache; use Index\Data\DbTools; use Index\Data\IDbConnection; -use Misuzu\Pagination; class Bans { public const SEVERITY_MAX = 10; @@ -152,7 +152,7 @@ class Bans { public function createBan( UserInfo|string $userInfo, - DateTime|int|null $expires, + DateTimeInterface|int|null $expires, string $publicReason, string $privateReason, int $severity = self::SEVERITY_DEFAULT, @@ -164,8 +164,8 @@ class Bans { $userInfo = $userInfo->getId(); if($modInfo instanceof UserInfo) $modInfo = $modInfo->getId(); - if($expires instanceof DateTime) - $expires = $expires->getUnixTimeSeconds(); + if($expires instanceof DateTimeInterface) + $expires = (int)$expires->format('U'); $stmt = $this->cache->get('INSERT INTO msz_users_bans (user_id, mod_id, ban_severity, ban_reason_public, ban_reason_private, ban_expires) VALUES (?, ?, ?, ?, ?, FROM_UNIXTIME(?))'); $stmt->addParameter(1, $userInfo); diff --git a/src/Users/ModNoteInfo.php b/src/Users/ModNoteInfo.php index c25b621..4a4c2f9 100644 --- a/src/Users/ModNoteInfo.php +++ b/src/Users/ModNoteInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function getTitle(): string { diff --git a/src/Users/RoleInfo.php b/src/Users/RoleInfo.php index 5367cad..db479a6 100644 --- a/src/Users/RoleInfo.php +++ b/src/Users/RoleInfo.php @@ -2,7 +2,7 @@ namespace Misuzu\Users; use Stringable; -use Index\DateTime; +use Carbon\CarbonImmutable; use Index\Colour\Colour; use Index\Data\IDbResult; @@ -89,8 +89,8 @@ class RoleInfo implements Stringable { return $this->created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function __toString(): string { diff --git a/src/Users/UserInfo.php b/src/Users/UserInfo.php index 5484a21..0604d97 100644 --- a/src/Users/UserInfo.php +++ b/src/Users/UserInfo.php @@ -1,12 +1,11 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } public function hasLastActive(): bool { @@ -143,8 +142,8 @@ class UserInfo { return $this->lastActive; } - public function getLastActiveAt(): ?DateTime { - return $this->lastActive === null ? null : DateTime::fromUnixTimeSeconds($this->lastActive); + public function getLastActiveAt(): ?CarbonImmutable { + return $this->lastActive === null ? null : CarbonImmutable::createFromTimestampUTC($this->lastActive); } public function isDeleted(): bool { @@ -155,8 +154,8 @@ class UserInfo { return $this->deleted; } - public function getDeletedAt(): ?DateTime { - return $this->deleted === null ? null : DateTime::fromUnixTimeSeconds($this->deleted); + public function getDeletedAt(): ?CarbonImmutable { + return $this->deleted === null ? null : CarbonImmutable::createFromTimestampUTC($this->deleted); } public function hasDisplayRoleId(): bool { @@ -231,15 +230,15 @@ class UserInfo { return $this->birthdate; } - public function getBirthdate(): ?DateTime { - return $this->birthdate === null ? null : DateTime::createFromFormat('Y-m-d', $this->birthdate, TimeZoneInfo::utc()); + public function getBirthdate(): ?CarbonImmutable { + return $this->birthdate === null ? null : CarbonImmutable::createFromFormat('Y-m-d', $this->birthdate, 'UTC'); } public function getAge(): int { $birthdate = $this->getBirthdate(); - if($birthdate === null || $birthdate->getYear() < 1900) + if($birthdate === null || (int)$birthdate->format('Y') < 1900) return -1; - return (int)$birthdate->diff(DateTime::now())->format('%y'); + return (int)$birthdate->diff(CarbonImmutable::now())->format('%y'); } public function hasBackgroundSettings(): bool { diff --git a/src/Users/Users.php b/src/Users/Users.php index 93f107e..c110f3f 100644 --- a/src/Users/Users.php +++ b/src/Users/Users.php @@ -3,7 +3,7 @@ namespace Misuzu\Users; use InvalidArgumentException; use RuntimeException; -use Index\DateTime; +use DateTimeInterface; use Index\XString; use Index\Colour\Colour; use Index\Data\DbStatementCache; @@ -46,7 +46,7 @@ class Users { UserInfo|string|null $after = null, ?int $lastActiveInMinutes = null, ?int $newerThanDays = null, - ?DateTime $birthdate = null, + ?DateTimeInterface $birthdate = null, ?bool $deleted = null ): int { if($roleInfo instanceof RoleInfo) @@ -106,7 +106,7 @@ class Users { UserInfo|string|null $after = null, ?int $lastActiveInMinutes = null, ?int $newerThanDays = null, - ?DateTime $birthdate = null, + ?DateTimeInterface $birthdate = null, ?bool $deleted = null, ?string $orderBy = null, ?bool $reverseOrder = null, diff --git a/src/Users/WarningInfo.php b/src/Users/WarningInfo.php index 3f4d7e1..61eaa73 100644 --- a/src/Users/WarningInfo.php +++ b/src/Users/WarningInfo.php @@ -1,7 +1,7 @@ created; } - public function getCreatedAt(): DateTime { - return DateTime::fromUnixTimeSeconds($this->created); + public function getCreatedAt(): CarbonImmutable { + return CarbonImmutable::createFromTimestampUTC($this->created); } }