Compare commits

..
36 Commits
Author SHA1 Message Date
Hide_D e1c5113d1b fix: g65 접경귀환도 수정 2024-01-02 11:15:07 +09:00
Hide_D 617d3b86db fix: 접경귀환시 rawCity도 초기화 2024-01-02 11:13:29 +09:00
Hide_D 88206354f1 fix: onCalcOpposeStat이 제대로 전파되지 않았음 2023-12-30 04:14:57 +00:00
Hide_D 8ea85dd155 feat: 세력장수에 개인 전략 예약 상태 표기 2023-12-30 04:01:53 +00:00
Hide_D f0feb9a91c fix: 신산귀모 문구 수정 2023-12-28 05:22:43 +00:00
Hide_D a893da6a5c game: 필중계략->신산귀모 2023-12-27 15:19:29 +00:00
Hide_D 2cdb00aac6 fix: 전투순위 2023-12-27 15:03:57 +00:00
Hide_D a8e26b5f60 fix: 수정 2023-12-27 15:03:12 +00:00
Hide_D 94b1de7cd7 game: g65_계략성공은 도시로 나누는 값이 있어 많이 보정 필요 2023-12-27 14:40:53 +00:00
Hide_D 1c1b0de415 fix: battleOrder의 attacker는 General이어야함 2023-12-27 14:04:16 +00:00
Hide_D b29c4742a0 misc: dummy 개인전략 시나리오 2023-12-27 14:03:26 +00:00
Hide_D 997223031e feat: g65_약점간파
- 1턴동안 전투 상성 우위 적 상대
2023-12-27 13:09:27 +00:00
Hide_D a508d5b903 game: 전투순위보정에서 동일병종이면 더 잘 나오도록 2023-12-27 13:05:38 +00:00
Hide_D 616c37d09c feat: g65_전투순위보정 2023-12-27 11:54:42 +00:00
Hide_D d5e9639767 feat: onCalcStat, onCalcOpposeStat에 battleOrder 추가 2023-12-27 11:54:31 +00:00
Hide_D bd0b20a737 fix: 버프의 만료 기간을 다음턴 직전까지로 변경
- 전투 버프 등에서 장수 턴시간에 따라 효과보는 시간을 동일하게.
2023-12-27 11:19:48 +00:00
Jinhyun KimandHide_D 5f130139b3 fix: 수정된 턴 시간 변경 로직에서 바뀌기 이전 턴을 시드로 계속 사용하는 문제 수정 2023-12-27 11:04:04 +00:00
Hide_D 5a6088ae5c game: 필중계략에 초반3년 제한추가 2023-12-26 12:59:00 +00:00
Hide_D 19f365b5d3 fix: g65_계략성공 보정치 수정
- 방어율도 100%p가까이 나올 수 있으므로 200%p 를 챙겨야 100%p 달성 가능
2023-12-26 10:14:45 +00:00
Hide_D 613a51db0d fix: 필중계략 2->1 2023-12-25 18:33:56 +00:00
Hide_D ad96a2eedc fix: 필중계략 2023-12-25 18:33:01 +00:00
Hide_D c84d66b985 fix: 필중계략 누락 2023-12-25 16:55:53 +00:00
Hide_D ca46061d17 feat: 장수 패널에 개인 전략 표기 2023-12-25 16:41:52 +00:00
Hide_D 8e93c69582 feat: GetFrontInfo의 General에서 개인 전략 쿨 반환 2023-12-25 16:19:44 +00:00
Hide_D 8241071b61 feat: 개인 전략창에 내 정보 추가 2023-12-25 16:05:19 +00:00
Hide_D 2958dcbc49 feat: 개인 전략 페이지 갱신 버튼 2023-12-25 15:52:37 +00:00
Hide_D 4edb994ac9 feat: 요술, 빠진 부분 채우기 2023-12-25 15:45:02 +00:00
Hide_D 05eb4366b1 feat: 접경귀환, 다 전략 조건 추가 2023-12-25 14:54:44 +00:00
Hide_D f5dfb83356 feat: 입대독력, 병장기지원 추가, 기타 개인전략 수정 2023-12-25 14:36:13 +00:00
Hide_D 2bcdbb0177 feat: 의원소환, 철야내정 추가 2023-12-25 14:08:46 +00:00
Hide_D 53474ab3d2 feat: g65_병사연회 구현 2023-12-25 13:43:46 +00:00
Hide_D 1fe55b83bd feat: UserAction 실행기 2023-12-25 12:52:22 +00:00
Hide_D 0f621b22a5 feat: UserAction 조회, 선택 기능 2023-12-25 12:20:01 +00:00
Hide_D eb36e7ccf4 wip: 개인 전략 폼 2023-12-25 09:49:08 +00:00
Hide_D 85dc5347c5 feat: 개인 전략 메뉴 추가
- 회의실/기밀실 버튼을 하나로 합치고 그 공간으로 추가
2023-12-25 08:28:16 +00:00
Hide_D 6cf8e4fc40 refac: 기존 commandButton.php 삭제
- 이젠 MainControlBar로 대체됨
2023-12-25 08:25:37 +00:00
411 changed files with 6433 additions and 137150 deletions
-1
View File
@@ -29,7 +29,6 @@ d_pic/*.jpg
d_pic/*.gif d_pic/*.gif
d_pic/*.png d_pic/*.png
d_pic/*.webp d_pic/*.webp
d_pic/*.avif
d_pic/uploaded_image d_pic/uploaded_image
/dist_js /dist_js
+5 -4
View File
@@ -8,11 +8,12 @@
], ],
"config": { "config": {
"platform": { "platform": {
"php": "8.3" "php": "8.2"
} }
}, },
"require": { "require": {
"sergeytsalkov/meekrodb": "^2.5", "brandonwamboldt/utilphp": "^1.1",
"sergeytsalkov/meekrodb": "^2.3",
"league/plates": "^3.5", "league/plates": "^3.5",
"vlucas/valitron": "^1.4", "vlucas/valitron": "^1.4",
"php-extended/php-tail": "^5.0", "php-extended/php-tail": "^5.0",
@@ -21,10 +22,10 @@
"xemlock/htmlpurifier-html5": "^0.1.7", "xemlock/htmlpurifier-html5": "^0.1.7",
"catfan/medoo": "^2.1", "catfan/medoo": "^2.1",
"phan/phan": "^5.4", "phan/phan": "^5.4",
"nette/caching": "^3.3", "nette/caching": "^3.2",
"illuminate/database": "^10.0", "illuminate/database": "^10.0",
"illuminate/events": "^10.0", "illuminate/events": "^10.0",
"php-ds/php-ds": "^1.5", "php-ds/php-ds": "^1.4",
"hided62/ldto": "^1.0", "hided62/ldto": "^1.0",
"league/uri": "^6.8" "league/uri": "^6.8"
}, },
Generated
+587 -717
View File
@@ -4,29 +4,79 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "7edae9b6be35e66ffd0d180f5fac6679", "content-hash": "e878a776667c3f0cbef0a48b3504d965",
"packages": [ "packages": [
{ {
"name": "brick/math", "name": "brandonwamboldt/utilphp",
"version": "0.12.1", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/brick/math.git", "url": "https://github.com/brandonwamboldt/utilphp.git",
"reference": "f510c0a40911935b77b86859eb5223d58d660df1" "reference": "36c32efc4f0679c05163464a550f45c8d83fe683"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", "url": "https://api.github.com/repos/brandonwamboldt/utilphp/zipball/36c32efc4f0679c05163464a550f45c8d83fe683",
"reference": "f510c0a40911935b77b86859eb5223d58d660df1", "reference": "36c32efc4f0679c05163464a550f45c8d83fe683",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^8.1" "php": ">=5.3.3"
},
"require-dev": {
"satooshi/php-coveralls": "dev-master"
},
"type": "library",
"autoload": {
"psr-0": {
"utilphp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Brandon Wamboldt",
"email": "brandon.wamboldt@gmail.com"
}
],
"description": "util.php is a collection of useful functions and snippets that you need or could use every day, designed to avoid conflicts with existing projects",
"homepage": "https://github.com/brandonwamboldt/utilphp",
"keywords": [
"collection",
"helpers",
"php",
"utility"
],
"support": {
"issues": "https://github.com/brandonwamboldt/utilphp/issues",
"source": "https://github.com/brandonwamboldt/utilphp/tree/master"
},
"time": "2015-02-02T17:56:14+00:00"
},
{
"name": "brick/math",
"version": "0.11.0",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478",
"reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478",
"shasum": ""
},
"require": {
"php": "^8.0"
}, },
"require-dev": { "require-dev": {
"php-coveralls/php-coveralls": "^2.2", "php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^10.1", "phpunit/phpunit": "^9.0",
"vimeo/psalm": "5.16.0" "vimeo/psalm": "5.0.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -46,17 +96,12 @@
"arithmetic", "arithmetic",
"bigdecimal", "bigdecimal",
"bignum", "bignum",
"bignumber",
"brick", "brick",
"decimal", "math"
"integer",
"math",
"mathematics",
"rational"
], ],
"support": { "support": {
"issues": "https://github.com/brick/math/issues", "issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.12.1" "source": "https://github.com/brick/math/tree/0.11.0"
}, },
"funding": [ "funding": [
{ {
@@ -64,89 +109,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-29T23:19:16+00:00" "time": "2023-01-15T23:15:59+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
"version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
"reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
"reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
"doctrine/dbal": "<3.7.0 || >=4.0.0"
},
"require-dev": {
"doctrine/dbal": "^3.7.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/2.1.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": "2023-12-11T17:09:12+00:00"
}, },
{ {
"name": "catfan/medoo", "name": "catfan/medoo",
"version": "v2.1.12", "version": "v2.1.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/catfan/Medoo.git", "url": "https://github.com/catfan/Medoo.git",
"reference": "d1ff4e0e873a3e032e3d8804031dd6be4e013b22" "reference": "b49a620cf1ad0d2e90ebd9f85b82aa11271df5f4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/d1ff4e0e873a3e032e3d8804031dd6be4e013b22", "url": "https://api.github.com/repos/catfan/Medoo/zipball/b49a620cf1ad0d2e90ebd9f85b82aa11271df5f4",
"reference": "d1ff4e0e873a3e032e3d8804031dd6be4e013b22", "reference": "b49a620cf1ad0d2e90ebd9f85b82aa11271df5f4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -209,20 +185,20 @@
"type": "open_collective" "type": "open_collective"
} }
], ],
"time": "2024-02-03T11:28:59+00:00" "time": "2023-01-20T09:30:24+00:00"
}, },
{ {
"name": "composer/pcre", "name": "composer/pcre",
"version": "3.1.3", "version": "3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/pcre.git", "url": "https://github.com/composer/pcre.git",
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8" "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/pcre/zipball/5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "url": "https://api.github.com/repos/composer/pcre/zipball/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
"reference": "5b16e25a5355f1f3afdfc2f954a0a80aec4826a8", "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -264,7 +240,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/composer/pcre/issues", "issues": "https://github.com/composer/pcre/issues",
"source": "https://github.com/composer/pcre/tree/3.1.3" "source": "https://github.com/composer/pcre/tree/3.1.0"
}, },
"funding": [ "funding": [
{ {
@@ -280,20 +256,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-19T10:26:25+00:00" "time": "2022-11-17T09:50:14+00:00"
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
"version": "3.4.0", "version": "3.3.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/semver.git", "url": "https://github.com/composer/semver.git",
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
"reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -343,9 +319,9 @@
"versioning" "versioning"
], ],
"support": { "support": {
"irc": "ircs://irc.libera.chat:6697/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/semver/issues", "issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.0" "source": "https://github.com/composer/semver/tree/3.3.2"
}, },
"funding": [ "funding": [
{ {
@@ -361,20 +337,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-08-31T09:50:34+00:00" "time": "2022-04-01T19:23:25+00:00"
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
"version": "3.0.5", "version": "3.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/xdebug-handler.git", "url": "https://github.com/composer/xdebug-handler.git",
"reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" "reference": "ced299686f41dce890debac69273b47ffe98a40c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c",
"reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "reference": "ced299686f41dce890debac69273b47ffe98a40c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -385,7 +361,7 @@
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1", "phpstan/phpstan-strict-rules": "^1.1",
"phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" "symfony/phpunit-bridge": "^6.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -409,9 +385,9 @@
"performance" "performance"
], ],
"support": { "support": {
"irc": "ircs://irc.libera.chat:6697/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/xdebug-handler/issues", "issues": "https://github.com/composer/xdebug-handler/issues",
"source": "https://github.com/composer/xdebug-handler/tree/3.0.5" "source": "https://github.com/composer/xdebug-handler/tree/3.0.3"
}, },
"funding": [ "funding": [
{ {
@@ -427,79 +403,32 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-06T16:37:16+00:00" "time": "2022-02-25T21:32:43+00:00"
},
{
"name": "doctrine/deprecations",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"phpstan/phpstan": "1.4.10 || 1.10.15",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psalm/plugin-phpunit": "0.18.4",
"psr/log": "^1 || ^2 || ^3",
"vimeo/psalm": "4.30.0 || 5.12.0"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.3"
},
"time": "2024-01-30T19:34:25+00:00"
}, },
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
"version": "2.0.10", "version": "2.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/inflector.git", "url": "https://github.com/doctrine/inflector.git",
"reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
"reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^11.0", "doctrine/coding-standard": "^10",
"phpstan/phpstan": "^1.8", "phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^1.3", "phpstan/phpstan-strict-rules": "^1.3",
"phpunit/phpunit": "^8.5 || ^9.5", "phpunit/phpunit": "^8.5 || ^9.5",
"vimeo/psalm": "^4.25 || ^5.4" "vimeo/psalm": "^4.25"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -549,7 +478,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/inflector/issues", "issues": "https://github.com/doctrine/inflector/issues",
"source": "https://github.com/doctrine/inflector/tree/2.0.10" "source": "https://github.com/doctrine/inflector/tree/2.0.6"
}, },
"funding": [ "funding": [
{ {
@@ -565,24 +494,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-02-18T20:23:39+00:00" "time": "2022-10-20T09:10:12+00:00"
}, },
{ {
"name": "ezyang/htmlpurifier", "name": "ezyang/htmlpurifier",
"version": "v4.17.0", "version": "v4.16.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git", "url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c" "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/bbc513d79acf6691fa9cf10f192c90dd2957f18c", "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8",
"reference": "bbc513d79acf6691fa9cf10f192c90dd2957f18c", "reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0"
}, },
"require-dev": { "require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0", "cerdic/css-tidy": "^1.7 || ^2.0",
@@ -624,9 +553,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues", "issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.17.0" "source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0"
}, },
"time": "2023-11-17T15:01:25+00:00" "time": "2022-09-18T07:06:19+00:00"
}, },
{ {
"name": "felixfbecker/advanced-json-rpc", "name": "felixfbecker/advanced-json-rpc",
@@ -675,16 +604,16 @@
}, },
{ {
"name": "hided62/ldto", "name": "hided62/ldto",
"version": "v1.0.1", "version": "v1.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/hided62/ldto.git", "url": "https://github.com/hided62/ldto.git",
"reference": "7f0cc568e35120868fe1178e96265c4fa0624820" "reference": "4c05401406f8afc1636a90763c13884f8fff0d14"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/hided62/ldto/zipball/7f0cc568e35120868fe1178e96265c4fa0624820", "url": "https://api.github.com/repos/hided62/ldto/zipball/4c05401406f8afc1636a90763c13884f8fff0d14",
"reference": "7f0cc568e35120868fe1178e96265c4fa0624820", "reference": "4c05401406f8afc1636a90763c13884f8fff0d14",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -723,22 +652,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/hided62/ldto/issues", "issues": "https://github.com/hided62/ldto/issues",
"source": "https://github.com/hided62/ldto/tree/v1.0.1" "source": "https://github.com/hided62/ldto/tree/v1.0.0"
}, },
"time": "2023-03-04T07:51:45+00:00" "time": "2022-08-05T14:30:13+00:00"
}, },
{ {
"name": "illuminate/bus", "name": "illuminate/bus",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/bus.git", "url": "https://github.com/illuminate/bus.git",
"reference": "33993b8f54e91b03fb5000e55693e146e7370763" "reference": "139999f560611623c7da494faa3d8a92f8e22e68"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/bus/zipball/33993b8f54e91b03fb5000e55693e146e7370763", "url": "https://api.github.com/repos/illuminate/bus/zipball/139999f560611623c7da494faa3d8a92f8e22e68",
"reference": "33993b8f54e91b03fb5000e55693e146e7370763", "reference": "139999f560611623c7da494faa3d8a92f8e22e68",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -778,20 +707,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-02-23T15:38:25+00:00" "time": "2022-11-30T17:23:35+00:00"
}, },
{ {
"name": "illuminate/collections", "name": "illuminate/collections",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/collections.git", "url": "https://github.com/illuminate/collections.git",
"reference": "f9589f1063a449111dcaa1d68285b507d9483a95" "reference": "f48e6e52860edc9f261f414a85ed2b9b295a324c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/f9589f1063a449111dcaa1d68285b507d9483a95", "url": "https://api.github.com/repos/illuminate/collections/zipball/f48e6e52860edc9f261f414a85ed2b9b295a324c",
"reference": "f9589f1063a449111dcaa1d68285b507d9483a95", "reference": "f48e6e52860edc9f261f414a85ed2b9b295a324c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -833,11 +762,11 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-03-20T20:09:13+00:00" "time": "2023-02-22T14:38:35+00:00"
}, },
{ {
"name": "illuminate/conditionable", "name": "illuminate/conditionable",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/conditionable.git", "url": "https://github.com/illuminate/conditionable.git",
@@ -883,16 +812,16 @@
}, },
{ {
"name": "illuminate/container", "name": "illuminate/container",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/container.git", "url": "https://github.com/illuminate/container.git",
"reference": "ddc26273085fad3c471b2602ad820e0097ff7939" "reference": "fed3ee8f7389ad431833935d9ed665bc02ac2cca"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/container/zipball/ddc26273085fad3c471b2602ad820e0097ff7939", "url": "https://api.github.com/repos/illuminate/container/zipball/fed3ee8f7389ad431833935d9ed665bc02ac2cca",
"reference": "ddc26273085fad3c471b2602ad820e0097ff7939", "reference": "fed3ee8f7389ad431833935d9ed665bc02ac2cca",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -930,20 +859,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2023-06-18T09:12:03+00:00" "time": "2023-01-25T18:11:51+00:00"
}, },
{ {
"name": "illuminate/contracts", "name": "illuminate/contracts",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/contracts.git", "url": "https://github.com/illuminate/contracts.git",
"reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac" "reference": "84f1da424ab9596a422ce118abd05667b0069624"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac", "url": "https://api.github.com/repos/illuminate/contracts/zipball/84f1da424ab9596a422ce118abd05667b0069624",
"reference": "8d7152c4a1f5d9cf7da3e8b71f23e4556f6138ac", "reference": "84f1da424ab9596a422ce118abd05667b0069624",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -978,24 +907,24 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-01-15T18:52:32+00:00" "time": "2023-02-14T15:00:37+00:00"
}, },
{ {
"name": "illuminate/database", "name": "illuminate/database",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/database.git", "url": "https://github.com/illuminate/database.git",
"reference": "eb8edf206d3a6eea8894bc6e21f53469e27dd5c9" "reference": "782940a3092e86c8d022d6d8d168b64fb97933a5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/eb8edf206d3a6eea8894bc6e21f53469e27dd5c9", "url": "https://api.github.com/repos/illuminate/database/zipball/782940a3092e86c8d022d6d8d168b64fb97933a5",
"reference": "eb8edf206d3a6eea8894bc6e21f53469e27dd5c9", "reference": "782940a3092e86c8d022d6d8d168b64fb97933a5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brick/math": "^0.9.3|^0.10.2|^0.11|^0.12", "brick/math": "^0.9.3|^0.10.2|^0.11",
"ext-pdo": "*", "ext-pdo": "*",
"illuminate/collections": "^10.0", "illuminate/collections": "^10.0",
"illuminate/container": "^10.0", "illuminate/container": "^10.0",
@@ -1004,10 +933,6 @@
"illuminate/support": "^10.0", "illuminate/support": "^10.0",
"php": "^8.1" "php": "^8.1"
}, },
"conflict": {
"carbonphp/carbon-doctrine-types": ">=3.0",
"doctrine/dbal": ">=4.0"
},
"suggest": { "suggest": {
"doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).",
"ext-filter": "Required to use the Postgres database driver.", "ext-filter": "Required to use the Postgres database driver.",
@@ -1051,20 +976,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-04-29T13:23:17+00:00" "time": "2023-02-23T18:43:10+00:00"
}, },
{ {
"name": "illuminate/events", "name": "illuminate/events",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/events.git", "url": "https://github.com/illuminate/events.git",
"reference": "a931bfa88edc6ac52c9abbfd7b769343d321d3eb" "reference": "c68138ea57360c19a145e5912fb474cfd1845366"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/events/zipball/a931bfa88edc6ac52c9abbfd7b769343d321d3eb", "url": "https://api.github.com/repos/illuminate/events/zipball/c68138ea57360c19a145e5912fb474cfd1845366",
"reference": "a931bfa88edc6ac52c9abbfd7b769343d321d3eb", "reference": "c68138ea57360c19a145e5912fb474cfd1845366",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1106,20 +1031,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-03-04T14:41:04+00:00" "time": "2023-02-16T15:35:09+00:00"
}, },
{ {
"name": "illuminate/macroable", "name": "illuminate/macroable",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/macroable.git", "url": "https://github.com/illuminate/macroable.git",
"reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27" "reference": "7686fe9dba1e236e6f695a148b551264b9fd479e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/macroable/zipball/dff667a46ac37b634dcf68909d9d41e94dc97c27", "url": "https://api.github.com/repos/illuminate/macroable/zipball/7686fe9dba1e236e6f695a148b551264b9fd479e",
"reference": "dff667a46ac37b634dcf68909d9d41e94dc97c27", "reference": "7686fe9dba1e236e6f695a148b551264b9fd479e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1152,20 +1077,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2023-06-05T12:46:42+00:00" "time": "2023-01-30T23:18:36+00:00"
}, },
{ {
"name": "illuminate/pipeline", "name": "illuminate/pipeline",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/pipeline.git", "url": "https://github.com/illuminate/pipeline.git",
"reference": "f802187e917a171332cc90f8c1a102939c57405d" "reference": "549fc7f9b2e6fef0436ca0f68714e1a0e4de8aad"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/pipeline/zipball/f802187e917a171332cc90f8c1a102939c57405d", "url": "https://api.github.com/repos/illuminate/pipeline/zipball/549fc7f9b2e6fef0436ca0f68714e1a0e4de8aad",
"reference": "f802187e917a171332cc90f8c1a102939c57405d", "reference": "549fc7f9b2e6fef0436ca0f68714e1a0e4de8aad",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1200,20 +1125,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2023-12-19T14:47:26+00:00" "time": "2022-06-10T06:51:19+00:00"
}, },
{ {
"name": "illuminate/support", "name": "illuminate/support",
"version": "v10.48.10", "version": "v10.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/support.git", "url": "https://github.com/illuminate/support.git",
"reference": "ee3a1aaed36d916654ce0ae09dfbd38644a4f582" "reference": "0311d96fb673e9694e1df838abb12f4e4019cdc4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/ee3a1aaed36d916654ce0ae09dfbd38644a4f582", "url": "https://api.github.com/repos/illuminate/support/zipball/0311d96fb673e9694e1df838abb12f4e4019cdc4",
"reference": "ee3a1aaed36d916654ce0ae09dfbd38644a4f582", "reference": "0311d96fb673e9694e1df838abb12f4e4019cdc4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1225,7 +1150,7 @@
"illuminate/conditionable": "^10.0", "illuminate/conditionable": "^10.0",
"illuminate/contracts": "^10.0", "illuminate/contracts": "^10.0",
"illuminate/macroable": "^10.0", "illuminate/macroable": "^10.0",
"nesbot/carbon": "^2.67", "nesbot/carbon": "^2.62.1",
"php": "^8.1", "php": "^8.1",
"voku/portable-ascii": "^2.0" "voku/portable-ascii": "^2.0"
}, },
@@ -1271,7 +1196,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-04-07T17:47:33+00:00" "time": "2023-02-23T07:42:03+00:00"
}, },
{ {
"name": "league/plates", "name": "league/plates",
@@ -1510,16 +1435,16 @@
}, },
{ {
"name": "microsoft/tolerant-php-parser", "name": "microsoft/tolerant-php-parser",
"version": "v0.1.2", "version": "v0.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/microsoft/tolerant-php-parser.git", "url": "https://github.com/microsoft/tolerant-php-parser.git",
"reference": "3eccfd273323aaf69513e2f1c888393f5947804b" "reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/3eccfd273323aaf69513e2f1c888393f5947804b", "url": "https://api.github.com/repos/microsoft/tolerant-php-parser/zipball/6a965617cf484355048ac6d2d3de7b6ec93abb16",
"reference": "3eccfd273323aaf69513e2f1c888393f5947804b", "reference": "6a965617cf484355048ac6d2d3de7b6ec93abb16",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1549,39 +1474,34 @@
"description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios", "description": "Tolerant PHP-to-AST parser designed for IDE usage scenarios",
"support": { "support": {
"issues": "https://github.com/microsoft/tolerant-php-parser/issues", "issues": "https://github.com/microsoft/tolerant-php-parser/issues",
"source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.2" "source": "https://github.com/microsoft/tolerant-php-parser/tree/v0.1.1"
}, },
"time": "2022-10-05T17:30:19+00:00" "time": "2021-07-16T21:28:12+00:00"
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.72.3", "version": "2.66.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" "reference": "496712849902241f04902033b0441b269effe001"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/496712849902241f04902033b0441b269effe001",
"reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", "reference": "496712849902241f04902033b0441b269effe001",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"carbonphp/carbon-doctrine-types": "*",
"ext-json": "*", "ext-json": "*",
"php": "^7.1.8 || ^8.0", "php": "^7.1.8 || ^8.0",
"psr/clock": "^1.0",
"symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php80": "^1.16", "symfony/polyfill-php80": "^1.16",
"symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
}, },
"provide": {
"psr/clock-implementation": "1.0"
},
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.0 || ^3.1.4 || ^4.0", "doctrine/dbal": "^2.0 || ^3.1.4",
"doctrine/orm": "^2.7 || ^3.0", "doctrine/orm": "^2.7",
"friendsofphp/php-cs-fixer": "^3.0", "friendsofphp/php-cs-fixer": "^3.0",
"kylekatarnls/multi-tester": "^2.0", "kylekatarnls/multi-tester": "^2.0",
"ondrejmirtes/better-reflection": "*", "ondrejmirtes/better-reflection": "*",
@@ -1658,20 +1578,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-25T10:35:09+00:00" "time": "2023-01-29T18:53:47+00:00"
}, },
{ {
"name": "netresearch/jsonmapper", "name": "netresearch/jsonmapper",
"version": "v4.4.1", "version": "v4.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/cweiske/jsonmapper.git", "url": "https://github.com/cweiske/jsonmapper.git",
"reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0" "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/132c75c7dd83e45353ebb9c6c9f591952995bbf0", "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
"reference": "132c75c7dd83e45353ebb9c6c9f591952995bbf0", "reference": "cfa81ea1d35294d64adb9c68aa4cb9e92400e53f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1682,7 +1602,7 @@
"php": ">=7.1" "php": ">=7.1"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~7.5 || ~8.0 || ~9.0 || ~10.0", "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
"squizlabs/php_codesniffer": "~3.5" "squizlabs/php_codesniffer": "~3.5"
}, },
"type": "library", "type": "library",
@@ -1707,33 +1627,31 @@
"support": { "support": {
"email": "cweiske@cweiske.de", "email": "cweiske@cweiske.de",
"issues": "https://github.com/cweiske/jsonmapper/issues", "issues": "https://github.com/cweiske/jsonmapper/issues",
"source": "https://github.com/cweiske/jsonmapper/tree/v4.4.1" "source": "https://github.com/cweiske/jsonmapper/tree/v4.1.0"
}, },
"time": "2024-01-31T06:18:54+00:00" "time": "2022-12-08T20:46:14+00:00"
}, },
{ {
"name": "nette/caching", "name": "nette/caching",
"version": "v3.3.0", "version": "v3.2.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/caching.git", "url": "https://github.com/nette/caching.git",
"reference": "3053707a892e100e81efb53dc8c294dca5e076d0" "reference": "ceb814d7f0a2bb4eb5afbe908467801001187745"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/caching/zipball/3053707a892e100e81efb53dc8c294dca5e076d0", "url": "https://api.github.com/repos/nette/caching/zipball/ceb814d7f0a2bb4eb5afbe908467801001187745",
"reference": "3053707a892e100e81efb53dc8c294dca5e076d0", "reference": "ceb814d7f0a2bb4eb5afbe908467801001187745",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nette/utils": "^4.0", "nette/finder": "^2.4 || ^3.0",
"php": "8.0 - 8.3" "nette/utils": "^3.2 || ~4.0.0",
}, "php": ">=8.0 <8.3"
"conflict": {
"latte/latte": ">=3.0.0 <3.0.12"
}, },
"require-dev": { "require-dev": {
"latte/latte": "^2.11 || ^3.0.12", "latte/latte": "^2.11 || ^3.0",
"nette/di": "^3.1 || ^4.0", "nette/di": "^3.1 || ^4.0",
"nette/tester": "^2.4", "nette/tester": "^2.4",
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
@@ -1745,7 +1663,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.3-dev" "dev-master": "3.2-dev"
} }
}, },
"autoload": { "autoload": {
@@ -1780,26 +1698,79 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/caching/issues", "issues": "https://github.com/nette/caching/issues",
"source": "https://github.com/nette/caching/tree/v3.3.0" "source": "https://github.com/nette/caching/tree/v3.2.2"
}, },
"time": "2024-03-10T22:07:25+00:00" "time": "2023-02-04T13:52:33+00:00"
}, },
{ {
"name": "nette/utils", "name": "nette/finder",
"version": "v4.0.4", "version": "v3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/utils.git", "url": "https://github.com/nette/finder.git",
"reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" "reference": "027395c638637de95c8e9fad49a7c51249404ed2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", "url": "https://api.github.com/repos/nette/finder/zipball/027395c638637de95c8e9fad49a7c51249404ed2",
"reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", "reference": "027395c638637de95c8e9fad49a7c51249404ed2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.0 <8.4" "nette/utils": "^4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0-only",
"GPL-3.0-only"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "🔍 Nette Finder: find files and directories with an intuitive API.",
"homepage": "https://nette.org",
"keywords": [
"filesystem",
"glob",
"iterator",
"nette"
],
"support": {
"issues": "https://github.com/nette/finder/issues",
"source": "https://github.com/nette/finder/tree/v3.0.0"
},
"time": "2022-12-14T17:05:54+00:00"
},
{
"name": "nette/utils",
"version": "v4.0.0",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
"reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/cacdbf5a91a657ede665c541eda28941d4b09c1e",
"reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e",
"shasum": ""
},
"require": {
"php": ">=8.0 <8.3"
}, },
"conflict": { "conflict": {
"nette/finder": "<3", "nette/finder": "<3",
@@ -1807,7 +1778,7 @@
}, },
"require-dev": { "require-dev": {
"jetbrains/phpstorm-attributes": "dev-master", "jetbrains/phpstorm-attributes": "dev-master",
"nette/tester": "^2.5", "nette/tester": "^2.4",
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
"tracy/tracy": "^2.9" "tracy/tracy": "^2.9"
}, },
@@ -1817,7 +1788,8 @@
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json", "ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...", "ext-mbstring": "to use Strings::lower() etc...",
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -1866,22 +1838,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/utils/issues", "issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v4.0.4" "source": "https://github.com/nette/utils/tree/v4.0.0"
}, },
"time": "2024-01-17T16:50:36+00:00" "time": "2023-02-02T10:41:53+00:00"
}, },
{ {
"name": "phan/phan", "name": "phan/phan",
"version": "5.4.3", "version": "5.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phan/phan.git", "url": "https://github.com/phan/phan.git",
"reference": "86a7acd99c1239b8867b49feca2398851212e7fe" "reference": "fef40178a952bcfcc3f69b76989dd613c3d5c759"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phan/phan/zipball/86a7acd99c1239b8867b49feca2398851212e7fe", "url": "https://api.github.com/repos/phan/phan/zipball/fef40178a952bcfcc3f69b76989dd613c3d5c759",
"reference": "86a7acd99c1239b8867b49feca2398851212e7fe", "reference": "fef40178a952bcfcc3f69b76989dd613c3d5c759",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1891,11 +1863,11 @@
"ext-json": "*", "ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"felixfbecker/advanced-json-rpc": "^3.0.4", "felixfbecker/advanced-json-rpc": "^3.0.4",
"microsoft/tolerant-php-parser": "0.1.2", "microsoft/tolerant-php-parser": "0.1.1",
"netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0", "netresearch/jsonmapper": "^1.6.0|^2.0|^3.0|^4.0",
"php": "^7.2.0|^8.0.0", "php": "^7.2.0|^8.0.0",
"sabre/event": "^5.1.3", "sabre/event": "^5.1.3",
"symfony/console": "^3.2|^4.0|^5.0|^6.0|^7.0", "symfony/console": "^3.2|^4.0|^5.0|^6.0",
"symfony/polyfill-mbstring": "^1.11.0", "symfony/polyfill-mbstring": "^1.11.0",
"symfony/polyfill-php80": "^1.20.0", "symfony/polyfill-php80": "^1.20.0",
"tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0" "tysonandre/var_representation_polyfill": "^0.0.2|^0.1.0"
@@ -1941,27 +1913,26 @@
"keywords": [ "keywords": [
"analyzer", "analyzer",
"php", "php",
"static", "static"
"static analysis"
], ],
"support": { "support": {
"issues": "https://github.com/phan/phan/issues", "issues": "https://github.com/phan/phan/issues",
"source": "https://github.com/phan/phan/tree/5.4.3" "source": "https://github.com/phan/phan/tree/5.4.1"
}, },
"time": "2023-12-26T17:57:35+00:00" "time": "2022-08-26T00:49:07+00:00"
}, },
{ {
"name": "php-ds/php-ds", "name": "php-ds/php-ds",
"version": "v1.5.0", "version": "v1.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-ds/polyfill.git", "url": "https://github.com/php-ds/polyfill.git",
"reference": "7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4" "reference": "43d2df301a9e2017f67b8c11d94a5222f9c00fd1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-ds/polyfill/zipball/7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4", "url": "https://api.github.com/repos/php-ds/polyfill/zipball/43d2df301a9e2017f67b8c11d94a5222f9c00fd1",
"reference": "7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4", "reference": "43d2df301a9e2017f67b8c11d94a5222f9c00fd1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1969,10 +1940,10 @@
"php": ">=7.0" "php": ">=7.0"
}, },
"provide": { "provide": {
"ext-ds": "1.5.0" "ext-ds": "1.3.0"
}, },
"require-dev": { "require-dev": {
"php-ds/tests": "^1.5" "php-ds/tests": "^1.3"
}, },
"suggest": { "suggest": {
"ext-ds": "to improve performance and reduce memory usage" "ext-ds": "to improve performance and reduce memory usage"
@@ -2001,22 +1972,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-ds/polyfill/issues", "issues": "https://github.com/php-ds/polyfill/issues",
"source": "https://github.com/php-ds/polyfill/tree/v1.5.0" "source": "https://github.com/php-ds/polyfill/tree/v1.4.1"
}, },
"time": "2023-12-19T16:52:21+00:00" "time": "2022-03-09T20:39:30+00:00"
}, },
{ {
"name": "php-extended/php-system", "name": "php-extended/php-system",
"version": "5.0.1", "version": "5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "git@gitlab.com:php-extended/php-system.git", "url": "git@gitlab.com:php-extended/php-system.git",
"reference": "a80365cc08f43e740f3d1b77505d3242d954555a" "reference": "c269fbf3d358679b229b922b6c5be5dac9bbd1ab"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-system/repository/archive.zip?sha=a80365cc08f43e740f3d1b77505d3242d954555a", "url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-system/repository/archive.zip?sha=c269fbf3d358679b229b922b6c5be5dac9bbd1ab",
"reference": "a80365cc08f43e740f3d1b77505d3242d954555a", "reference": "c269fbf3d358679b229b922b6c5be5dac9bbd1ab",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2054,20 +2025,20 @@
"issues": "https://gitlab.com/php-extended/php-system/issues", "issues": "https://gitlab.com/php-extended/php-system/issues",
"source": "https://gitlab.com/php-extended/php-system" "source": "https://gitlab.com/php-extended/php-system"
}, },
"time": "2023-06-26T19:35:14+00:00" "time": "2022-12-12T07:20:57+00:00"
}, },
{ {
"name": "php-extended/php-tail", "name": "php-extended/php-tail",
"version": "5.0.1", "version": "5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "git@gitlab.com:php-extended/php-tail.git", "url": "git@gitlab.com:php-extended/php-tail.git",
"reference": "4a76745626d8e0359fee3bf87614e2478b3f80c5" "reference": "d932ed124887b0e0691751a4bb197b759707e1d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-tail/repository/archive.zip?sha=4a76745626d8e0359fee3bf87614e2478b3f80c5", "url": "https://gitlab.com/api/v4/projects/php-extended%2Fphp-tail/repository/archive.zip?sha=d932ed124887b0e0691751a4bb197b759707e1d8",
"reference": "4a76745626d8e0359fee3bf87614e2478b3f80c5", "reference": "d932ed124887b0e0691751a4bb197b759707e1d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2107,20 +2078,20 @@
"issues": "https://gitlab.com/php-extended/php-tail/issues", "issues": "https://gitlab.com/php-extended/php-tail/issues",
"source": "https://gitlab.com/php-extended/php-tail" "source": "https://gitlab.com/php-extended/php-tail"
}, },
"time": "2023-06-26T19:35:24+00:00" "time": "2022-12-18T11:15:32+00:00"
}, },
{ {
"name": "php-extended/polyfill-php80-stringable", "name": "php-extended/polyfill-php80-stringable",
"version": "1.2.12", "version": "1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://gitlab.com/php-extended/polyfill-php80-stringable.git", "url": "git@gitlab.com:php-extended/polyfill-php80-stringable.git",
"reference": "ea728554a1d83c75ebb7eec69689fdb6c067b5e4" "reference": "a6199e7ea09ddafaae9c22d6bd297aa4704b6608"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://gitlab.com/api/v4/projects/php-extended%2Fpolyfill-php80-stringable/repository/archive.zip?sha=ea728554a1d83c75ebb7eec69689fdb6c067b5e4", "url": "https://gitlab.com/api/v4/projects/php-extended%2Fpolyfill-php80-stringable/repository/archive.zip?sha=a6199e7ea09ddafaae9c22d6bd297aa4704b6608",
"reference": "ea728554a1d83c75ebb7eec69689fdb6c067b5e4", "reference": "a6199e7ea09ddafaae9c22d6bd297aa4704b6608",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2155,7 +2126,7 @@
"issues": "https://gitlab.com/php-extended/polyfill-php80-stringable/issues", "issues": "https://gitlab.com/php-extended/polyfill-php80-stringable/issues",
"source": "https://gitlab.com/php-extended/polyfill-php80-stringable" "source": "https://gitlab.com/php-extended/polyfill-php80-stringable"
}, },
"time": "2024-03-31T13:21:37+00:00" "time": "2022-12-07T22:15:21+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
@@ -2212,35 +2183,28 @@
}, },
{ {
"name": "phpdocumentor/reflection-docblock", "name": "phpdocumentor/reflection-docblock",
"version": "5.4.0", "version": "5.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "298d2febfe79d03fe714eb871d5538da55205b1a" "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/298d2febfe79d03fe714eb871d5538da55205b1a", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "298d2febfe79d03fe714eb871d5538da55205b1a", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/deprecations": "^1.1",
"ext-filter": "*", "ext-filter": "*",
"php": "^7.4 || ^8.0", "php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2", "phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.7", "phpdocumentor/type-resolver": "^1.3",
"phpstan/phpdoc-parser": "^1.7",
"webmozart/assert": "^1.9.1" "webmozart/assert": "^1.9.1"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "~1.3.5", "mockery/mockery": "~1.3.2",
"phpstan/extension-installer": "^1.1", "psalm/phar": "^4.8"
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^9.5",
"vimeo/psalm": "^5.13"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -2264,39 +2228,36 @@
}, },
{ {
"name": "Jaap van Otterdijk", "name": "Jaap van Otterdijk",
"email": "opensource@ijaap.nl" "email": "account@ijaap.nl"
} }
], ],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": { "support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.0" "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
}, },
"time": "2024-04-09T21:13:58+00:00" "time": "2021-10-19T17:43:47+00:00"
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
"version": "1.8.2", "version": "1.6.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git", "url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "153ae662783729388a584b4361f2545e4d841e3c" "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
"reference": "153ae662783729388a584b4361f2545e4d841e3c", "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0",
"php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0"
"phpdocumentor/reflection-common": "^2.0",
"phpstan/phpdoc-parser": "^1.13"
}, },
"require-dev": { "require-dev": {
"ext-tokenizer": "*", "ext-tokenizer": "*",
"phpbench/phpbench": "^1.2",
"phpstan/extension-installer": "^1.1", "phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.8", "phpstan/phpstan": "^1.8",
"phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-phpunit": "^1.1",
@@ -2328,104 +2289,9 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": { "support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues", "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
}, },
"time": "2024-02-23T11:10:43+00:00" "time": "2022-10-14T12:47:21+00:00"
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.29.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc",
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"require-dev": {
"doctrine/annotations": "^2.0",
"nikic/php-parser": "^4.15",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.5",
"phpstan/phpstan-phpunit": "^1.1",
"phpstan/phpstan-strict-rules": "^1.0",
"phpunit/phpunit": "^9.5",
"symfony/process": "^5.2"
},
"type": "library",
"autoload": {
"psr-4": {
"PHPStan\\PhpDocParser\\": [
"src/"
]
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0"
},
"time": "2024-05-06T12:04:23+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", "name": "psr/container",
@@ -2482,25 +2348,25 @@
}, },
{ {
"name": "psr/http-message", "name": "psr/http-message",
"version": "1.1", "version": "1.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/http-message.git", "url": "https://github.com/php-fig/http-message.git",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": ">=5.3.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.1.x-dev" "dev-master": "1.0.x-dev"
} }
}, },
"autoload": { "autoload": {
@@ -2529,9 +2395,9 @@
"response" "response"
], ],
"support": { "support": {
"source": "https://github.com/php-fig/http-message/tree/1.1" "source": "https://github.com/php-fig/http-message/tree/master"
}, },
"time": "2023-04-04T09:50:52+00:00" "time": "2016-08-06T14:39:51+00:00"
}, },
{ {
"name": "psr/log", "name": "psr/log",
@@ -2702,16 +2568,16 @@
}, },
{ {
"name": "sergeytsalkov/meekrodb", "name": "sergeytsalkov/meekrodb",
"version": "v2.5.1", "version": "v2.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/SergeyTsalkov/meekrodb.git", "url": "https://github.com/SergeyTsalkov/meekrodb.git",
"reference": "08b683a274365983aaf033cf9c589dcbe5190028" "reference": "e30c240d54bc81f58c58507a9ed768032eb494a5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/SergeyTsalkov/meekrodb/zipball/08b683a274365983aaf033cf9c589dcbe5190028", "url": "https://api.github.com/repos/SergeyTsalkov/meekrodb/zipball/e30c240d54bc81f58c58507a9ed768032eb494a5",
"reference": "08b683a274365983aaf033cf9c589dcbe5190028", "reference": "e30c240d54bc81f58c58507a9ed768032eb494a5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2744,52 +2610,55 @@
"support": { "support": {
"email": "support@meekro.com", "email": "support@meekro.com",
"issues": "https://github.com/SergeyTsalkov/meekrodb/issues", "issues": "https://github.com/SergeyTsalkov/meekrodb/issues",
"source": "https://github.com/SergeyTsalkov/meekrodb/tree/v2.5.1" "source": "https://github.com/SergeyTsalkov/meekrodb/tree/v2.4"
}, },
"time": "2023-10-10T00:28:49+00:00" "time": "2021-06-29T04:31:23+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v7.0.7", "version": "v6.2.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986" "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/c981e0e9380ce9f146416bde3150c79197ce9986", "url": "https://api.github.com/repos/symfony/console/zipball/cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
"reference": "c981e0e9380ce9f146416bde3150c79197ce9986", "reference": "cbad09eb8925b6ad4fb721c7a179344dc4a19d45",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.1",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^1.1|^2|^3",
"symfony/string": "^6.4|^7.0" "symfony/string": "^5.4|^6.0"
}, },
"conflict": { "conflict": {
"symfony/dependency-injection": "<6.4", "symfony/dependency-injection": "<5.4",
"symfony/dotenv": "<6.4", "symfony/dotenv": "<5.4",
"symfony/event-dispatcher": "<6.4", "symfony/event-dispatcher": "<5.4",
"symfony/lock": "<6.4", "symfony/lock": "<5.4",
"symfony/process": "<6.4" "symfony/process": "<5.4"
}, },
"provide": { "provide": {
"psr/log-implementation": "1.0|2.0|3.0" "psr/log-implementation": "1.0|2.0|3.0"
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^6.4|^7.0", "symfony/config": "^5.4|^6.0",
"symfony/dependency-injection": "^6.4|^7.0", "symfony/dependency-injection": "^5.4|^6.0",
"symfony/event-dispatcher": "^6.4|^7.0", "symfony/event-dispatcher": "^5.4|^6.0",
"symfony/http-foundation": "^6.4|^7.0", "symfony/lock": "^5.4|^6.0",
"symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^5.4|^6.0",
"symfony/lock": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0"
"symfony/messenger": "^6.4|^7.0", },
"symfony/process": "^6.4|^7.0", "suggest": {
"symfony/stopwatch": "^6.4|^7.0", "psr/log": "For using the console logger",
"symfony/var-dumper": "^6.4|^7.0" "symfony/event-dispatcher": "",
"symfony/lock": "",
"symfony/process": ""
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -2818,12 +2687,12 @@
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"keywords": [ "keywords": [
"cli", "cli",
"command-line", "command line",
"console", "console",
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v7.0.7" "source": "https://github.com/symfony/console/tree/v6.2.7"
}, },
"funding": [ "funding": [
{ {
@@ -2839,20 +2708,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2023-02-25T17:00:03+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.5.0", "version": "v3.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" "reference": "0121954c80fd17c18cf050fe73360e63bb43d4fb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0121954c80fd17c18cf050fe73360e63bb43d4fb",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "reference": "0121954c80fd17c18cf050fe73360e63bb43d4fb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2861,7 +2730,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.5-dev" "dev-main": "3.3-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -2890,7 +2759,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -2906,34 +2775,33 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2023-02-02T07:48:03+00:00"
}, },
{ {
"name": "symfony/lock", "name": "symfony/lock",
"version": "v6.4.7", "version": "v6.2.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/lock.git", "url": "https://github.com/symfony/lock.git",
"reference": "c6b3959c418a7c1115c060fab77927ca4bd2546a" "reference": "febdeed9473e568ff34bf4350c04760f5357dfe2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/c6b3959c418a7c1115c060fab77927ca4bd2546a", "url": "https://api.github.com/repos/symfony/lock/zipball/febdeed9473e568ff34bf4350c04760f5357dfe2",
"reference": "c6b3959c418a7c1115c060fab77927ca4bd2546a", "reference": "febdeed9473e568ff34bf4350c04760f5357dfe2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.1",
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3"
"symfony/deprecation-contracts": "^2.5|^3"
}, },
"conflict": { "conflict": {
"doctrine/dbal": "<2.13", "doctrine/dbal": "<2.13",
"symfony/cache": "<6.2" "symfony/cache": "<6.2"
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.13|^3|^4", "doctrine/dbal": "^2.13|^3.0",
"predis/predis": "^1.1|^2.0" "predis/predis": "~1.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -2969,7 +2837,7 @@
"semaphore" "semaphore"
], ],
"support": { "support": {
"source": "https://github.com/symfony/lock/tree/v6.4.7" "source": "https://github.com/symfony/lock/tree/v6.2.7"
}, },
"funding": [ "funding": [
{ {
@@ -2985,20 +2853,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:22:46+00:00" "time": "2023-02-24T10:42:00+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.29.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
"reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3012,6 +2880,9 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -3048,7 +2919,7 @@
"portable" "portable"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@@ -3064,20 +2935,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
"version": "v1.29.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
"reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3088,6 +2959,9 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -3126,7 +3000,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@@ -3142,20 +3016,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.29.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d" "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3166,6 +3040,9 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -3207,7 +3084,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@@ -3223,20 +3100,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.29.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3250,6 +3127,9 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -3287,7 +3167,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@@ -3303,20 +3183,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/polyfill-php80", "name": "symfony/polyfill-php80",
"version": "v1.29.0", "version": "v1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php80.git", "url": "https://github.com/symfony/polyfill-php80.git",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3324,6 +3204,9 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.27-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@@ -3367,7 +3250,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
}, },
"funding": [ "funding": [
{ {
@@ -3383,34 +3266,36 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2022-11-03T14:55:06+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v3.5.0", "version": "v3.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" "reference": "aee5f59db63978f7785290b94d2f12286b1b590a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aee5f59db63978f7785290b94d2f12286b1b590a",
"reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "reference": "aee5f59db63978f7785290b94d2f12286b1b590a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.1",
"psr/container": "^1.1|^2.0", "psr/container": "^2.0"
"symfony/deprecation-contracts": "^2.5|^3"
}, },
"conflict": { "conflict": {
"ext-psr": "<1.1|>=2" "ext-psr": "<1.1|>=2"
}, },
"suggest": {
"symfony/service-implementation": ""
},
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.5-dev" "dev-main": "3.3-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -3450,7 +3335,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.5.0" "source": "https://github.com/symfony/service-contracts/tree/v3.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -3466,38 +3351,38 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2023-02-16T12:50:33+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v7.0.7", "version": "v6.2.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" "reference": "67b8c1eec78296b85dc1c7d9743830160218993d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "url": "https://api.github.com/repos/symfony/string/zipball/67b8c1eec78296b85dc1c7d9743830160218993d",
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "reference": "67b8c1eec78296b85dc1c7d9743830160218993d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.1",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0" "symfony/polyfill-mbstring": "~1.0"
}, },
"conflict": { "conflict": {
"symfony/translation-contracts": "<2.5" "symfony/translation-contracts": "<2.0"
}, },
"require-dev": { "require-dev": {
"symfony/error-handler": "^6.4|^7.0", "symfony/error-handler": "^5.4|^6.0",
"symfony/http-client": "^6.4|^7.0", "symfony/http-client": "^5.4|^6.0",
"symfony/intl": "^6.4|^7.0", "symfony/intl": "^6.2",
"symfony/translation-contracts": "^2.5|^3.0", "symfony/translation-contracts": "^2.0|^3.0",
"symfony/var-exporter": "^6.4|^7.0" "symfony/var-exporter": "^5.4|^6.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -3536,7 +3421,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v7.0.7" "source": "https://github.com/symfony/string/tree/v6.2.7"
}, },
"funding": [ "funding": [
{ {
@@ -3552,35 +3437,32 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2023-02-24T10:42:00+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v6.4.7", "version": "v6.2.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "7495687c58bfd88b7883823747b0656d90679123" "reference": "90db1c6138c90527917671cd9ffa9e8b359e3a73"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/7495687c58bfd88b7883823747b0656d90679123", "url": "https://api.github.com/repos/symfony/translation/zipball/90db1c6138c90527917671cd9ffa9e8b359e3a73",
"reference": "7495687c58bfd88b7883823747b0656d90679123", "reference": "90db1c6138c90527917671cd9ffa9e8b359e3a73",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/translation-contracts": "^2.5|^3.0" "symfony/translation-contracts": "^2.3|^3.0"
}, },
"conflict": { "conflict": {
"symfony/config": "<5.4", "symfony/config": "<5.4",
"symfony/console": "<5.4", "symfony/console": "<5.4",
"symfony/dependency-injection": "<5.4", "symfony/dependency-injection": "<5.4",
"symfony/http-client-contracts": "<2.5",
"symfony/http-kernel": "<5.4", "symfony/http-kernel": "<5.4",
"symfony/service-contracts": "<2.5",
"symfony/twig-bundle": "<5.4", "symfony/twig-bundle": "<5.4",
"symfony/yaml": "<5.4" "symfony/yaml": "<5.4"
}, },
@@ -3588,19 +3470,25 @@
"symfony/translation-implementation": "2.3|3.0" "symfony/translation-implementation": "2.3|3.0"
}, },
"require-dev": { "require-dev": {
"nikic/php-parser": "^4.18|^5.0", "nikic/php-parser": "^4.13",
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0|^7.0", "symfony/config": "^5.4|^6.0",
"symfony/console": "^5.4|^6.0|^7.0", "symfony/console": "^5.4|^6.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^5.4|^6.0",
"symfony/finder": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0",
"symfony/http-client-contracts": "^2.5|^3.0", "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4|^6.0",
"symfony/intl": "^5.4|^6.0|^7.0", "symfony/intl": "^5.4|^6.0",
"symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-intl-icu": "^1.21",
"symfony/routing": "^5.4|^6.0|^7.0", "symfony/routing": "^5.4|^6.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^1.1.2|^2|^3",
"symfony/yaml": "^5.4|^6.0|^7.0" "symfony/yaml": "^5.4|^6.0"
},
"suggest": {
"nikic/php-parser": "To use PhpAstExtractor",
"psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -3631,7 +3519,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v6.4.7" "source": "https://github.com/symfony/translation/tree/v6.2.7"
}, },
"funding": [ "funding": [
{ {
@@ -3647,29 +3535,32 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:22:46+00:00" "time": "2023-02-24T10:42:00+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
"version": "v3.5.0", "version": "v3.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation-contracts.git", "url": "https://github.com/symfony/translation-contracts.git",
"reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" "reference": "1f40e77fbb12a16d841688f42fecefd8ceb43ed6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1f40e77fbb12a16d841688f42fecefd8ceb43ed6",
"reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "reference": "1f40e77fbb12a16d841688f42fecefd8ceb43ed6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.1"
}, },
"suggest": {
"symfony/translation-implementation": ""
},
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.5-dev" "dev-main": "3.3-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@@ -3709,7 +3600,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" "source": "https://github.com/symfony/translation-contracts/tree/v3.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -3725,7 +3616,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2023-02-16T12:50:33+00:00"
}, },
{ {
"name": "tysonandre/var_representation_polyfill", "name": "tysonandre/var_representation_polyfill",
@@ -4039,16 +3930,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.11.1", "version": "1.11.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
"reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4086,7 +3977,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
}, },
"funding": [ "funding": [
{ {
@@ -4094,31 +3985,29 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-03-08T13:26:56+00:00" "time": "2022-03-03T13:19:32+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v5.0.2", "version": "v4.15.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
"reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*",
"ext-json": "*",
"ext-tokenizer": "*", "ext-tokenizer": "*",
"php": ">=7.4" "php": ">=7.0"
}, },
"require-dev": { "require-dev": {
"ircmaxell/php-yacc": "^0.0.7", "ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
}, },
"bin": [ "bin": [
"bin/php-parse" "bin/php-parse"
@@ -4126,7 +4015,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "5.0-dev" "dev-master": "4.9-dev"
} }
}, },
"autoload": { "autoload": {
@@ -4150,27 +4039,26 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3"
}, },
"time": "2024-03-05T20:51:40+00:00" "time": "2023-01-16T22:05:37+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
"version": "2.0.4", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phar-io/manifest.git", "url": "https://github.com/phar-io/manifest.git",
"reference": "54750ef60c58e43759730615a392c31c80e23176" "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
"reference": "54750ef60c58e43759730615a392c31c80e23176", "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*",
"ext-phar": "*", "ext-phar": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"phar-io/version": "^3.0.1", "phar-io/version": "^3.0.1",
@@ -4211,15 +4099,9 @@
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": { "support": {
"issues": "https://github.com/phar-io/manifest/issues", "issues": "https://github.com/phar-io/manifest/issues",
"source": "https://github.com/phar-io/manifest/tree/2.0.4" "source": "https://github.com/phar-io/manifest/tree/2.0.3"
}, },
"funding": [ "time": "2021-07-20T11:28:43+00:00"
{
"url": "https://github.com/theseer",
"type": "github"
}
],
"time": "2024-03-03T12:33:53+00:00"
}, },
{ {
"name": "phar-io/version", "name": "phar-io/version",
@@ -4274,23 +4156,23 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "10.1.14", "version": "10.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" "reference": "b9c21a93dd8c8eed79879374884ee733259475cc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b9c21a93dd8c8eed79879374884ee733259475cc",
"reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "reference": "b9c21a93dd8c8eed79879374884ee733259475cc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.18 || ^5.0", "nikic/php-parser": "^4.15",
"php": ">=8.1", "php": ">=8.1",
"phpunit/php-file-iterator": "^4.0", "phpunit/php-file-iterator": "^4.0",
"phpunit/php-text-template": "^3.0", "phpunit/php-text-template": "^3.0",
@@ -4302,16 +4184,16 @@
"theseer/tokenizer": "^1.2.0" "theseer/tokenizer": "^1.2.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.1" "phpunit/phpunit": "^10.0"
}, },
"suggest": { "suggest": {
"ext-pcov": "PHP extension that provides line coverage", "ext-pcov": "*",
"ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" "ext-xdebug": "*"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "10.1-dev" "dev-main": "10.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -4339,8 +4221,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.0.1"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14"
}, },
"funding": [ "funding": [
{ {
@@ -4348,20 +4229,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-12T15:33:41+00:00" "time": "2023-02-25T05:35:03+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
"version": "4.1.0", "version": "4.0.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
"reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "reference": "fd9329ab3368f59fe1fe808a189c51086bd4b6bd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4400,8 +4281,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.1"
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
}, },
"funding": [ "funding": [
{ {
@@ -4409,7 +4289,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-31T06:24:48+00:00" "time": "2023-02-10T16:53:14+00:00"
}, },
{ {
"name": "phpunit/php-invoker", "name": "phpunit/php-invoker",
@@ -4476,16 +4356,16 @@
}, },
{ {
"name": "phpunit/php-text-template", "name": "phpunit/php-text-template",
"version": "3.0.1", "version": "3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git", "url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
"reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4523,8 +4403,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues", "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"security": "https://github.com/sebastianbergmann/php-text-template/security/policy", "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0"
"source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -4532,7 +4411,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-31T14:07:24+00:00" "time": "2023-02-03T06:56:46+00:00"
}, },
{ {
"name": "phpunit/php-timer", "name": "phpunit/php-timer",
@@ -4595,16 +4474,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "10.5.20", "version": "10.0.13",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" "reference": "c37a88d7a905266eab6498817a1bf1170043313f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c37a88d7a905266eab6498817a1bf1170043313f",
"reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", "reference": "c37a88d7a905266eab6498817a1bf1170043313f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4618,7 +4497,7 @@
"phar-io/manifest": "^2.0.3", "phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2", "phar-io/version": "^3.0.2",
"php": ">=8.1", "php": ">=8.1",
"phpunit/php-code-coverage": "^10.1.5", "phpunit/php-code-coverage": "^10.0",
"phpunit/php-file-iterator": "^4.0", "phpunit/php-file-iterator": "^4.0",
"phpunit/php-invoker": "^4.0", "phpunit/php-invoker": "^4.0",
"phpunit/php-text-template": "^3.0", "phpunit/php-text-template": "^3.0",
@@ -4628,15 +4507,15 @@
"sebastian/comparator": "^5.0", "sebastian/comparator": "^5.0",
"sebastian/diff": "^5.0", "sebastian/diff": "^5.0",
"sebastian/environment": "^6.0", "sebastian/environment": "^6.0",
"sebastian/exporter": "^5.1", "sebastian/exporter": "^5.0",
"sebastian/global-state": "^6.0.1", "sebastian/global-state": "^6.0",
"sebastian/object-enumerator": "^5.0", "sebastian/object-enumerator": "^5.0",
"sebastian/recursion-context": "^5.0", "sebastian/recursion-context": "^5.0",
"sebastian/type": "^4.0", "sebastian/type": "^4.0",
"sebastian/version": "^4.0" "sebastian/version": "^4.0"
}, },
"suggest": { "suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files" "ext-soap": "*"
}, },
"bin": [ "bin": [
"phpunit" "phpunit"
@@ -4644,7 +4523,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "10.5-dev" "dev-main": "10.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -4675,8 +4554,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "source": "https://github.com/sebastianbergmann/phpunit/tree/10.0.13"
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20"
}, },
"funding": [ "funding": [
{ {
@@ -4692,20 +4570,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-24T06:32:35+00:00" "time": "2023-02-27T13:07:57+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
"version": "2.0.1", "version": "2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git", "url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
"reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4740,8 +4618,7 @@
"homepage": "https://github.com/sebastianbergmann/cli-parser", "homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues", "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"security": "https://github.com/sebastianbergmann/cli-parser/security/policy", "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0"
"source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -4749,7 +4626,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:12:49+00:00" "time": "2023-02-03T06:58:15+00:00"
}, },
{ {
"name": "sebastian/code-unit", "name": "sebastian/code-unit",
@@ -4864,16 +4741,16 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "5.0.1", "version": "5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "2db5010a484d53ebf536087a70b4a5423c102372" "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c",
"reference": "2db5010a484d53ebf536087a70b4a5423c102372", "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4884,7 +4761,7 @@
"sebastian/exporter": "^5.0" "sebastian/exporter": "^5.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.3" "phpunit/phpunit": "^10.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -4928,8 +4805,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy", "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0"
"source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1"
}, },
"funding": [ "funding": [
{ {
@@ -4937,24 +4813,24 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-08-14T13:18:12+00:00" "time": "2023-02-03T07:07:16+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
"version": "3.2.0", "version": "3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git", "url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "68ff824baeae169ec9f2137158ee529584553799" "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
"reference": "68ff824baeae169ec9f2137158ee529584553799", "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.18 || ^5.0", "nikic/php-parser": "^4.10",
"php": ">=8.1" "php": ">=8.1"
}, },
"require-dev": { "require-dev": {
@@ -4963,7 +4839,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.2-dev" "dev-main": "3.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -4986,8 +4862,7 @@
"homepage": "https://github.com/sebastianbergmann/complexity", "homepage": "https://github.com/sebastianbergmann/complexity",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues", "issues": "https://github.com/sebastianbergmann/complexity/issues",
"security": "https://github.com/sebastianbergmann/complexity/security/policy", "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0"
"source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -4995,20 +4870,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-12-21T08:37:17+00:00" "time": "2023-02-03T06:59:47+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
"version": "5.1.1", "version": "5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/diff.git", "url": "https://github.com/sebastianbergmann/diff.git",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" "reference": "70dd1b20bc198da394ad542e988381b44e64e39f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/70dd1b20bc198da394ad542e988381b44e64e39f",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "reference": "70dd1b20bc198da394ad542e988381b44e64e39f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5016,12 +4891,12 @@
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0", "phpunit/phpunit": "^10.0",
"symfony/process": "^6.4" "symfony/process": "^4.2 || ^5"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.1-dev" "dev-main": "5.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -5053,8 +4928,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/diff/issues", "issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy", "source": "https://github.com/sebastianbergmann/diff/tree/5.0.0"
"source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
}, },
"funding": [ "funding": [
{ {
@@ -5062,20 +4936,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:15:17+00:00" "time": "2023-02-03T07:00:31+00:00"
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
"version": "6.1.0", "version": "6.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/environment.git", "url": "https://github.com/sebastianbergmann/environment.git",
"reference": "8074dbcd93529b357029f5cc5058fd3e43666984" "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b6f3694c6386c7959915a0037652e0c40f6f69cc",
"reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "reference": "b6f3694c6386c7959915a0037652e0c40f6f69cc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5090,7 +4964,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.1-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -5117,8 +4991,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/environment/issues", "issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy", "source": "https://github.com/sebastianbergmann/environment/tree/6.0.0"
"source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
}, },
"funding": [ "funding": [
{ {
@@ -5126,20 +4999,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-23T08:47:14+00:00" "time": "2023-02-03T07:03:04+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "5.1.2", "version": "5.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "955288482d97c19a372d3f31006ab3f37da47adf" "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
"reference": "955288482d97c19a372d3f31006ab3f37da47adf", "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5153,7 +5026,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.1-dev" "dev-main": "5.0-dev"
} }
}, },
"autoload": { "autoload": {
@@ -5195,8 +5068,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy", "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0"
"source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
}, },
"funding": [ "funding": [
{ {
@@ -5204,20 +5076,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:17:12+00:00" "time": "2023-02-03T07:06:49+00:00"
}, },
{ {
"name": "sebastian/global-state", "name": "sebastian/global-state",
"version": "6.0.2", "version": "6.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git", "url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" "reference": "aab257c712de87b90194febd52e4d184551c2d44"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/aab257c712de87b90194febd52e4d184551c2d44",
"reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "reference": "aab257c712de87b90194febd52e4d184551c2d44",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5251,14 +5123,13 @@
} }
], ],
"description": "Snapshotting of global state", "description": "Snapshotting of global state",
"homepage": "https://www.github.com/sebastianbergmann/global-state", "homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [ "keywords": [
"global state" "global state"
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues", "issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy", "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.0"
"source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
}, },
"funding": [ "funding": [
{ {
@@ -5266,24 +5137,24 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:19:19+00:00" "time": "2023-02-03T07:07:38+00:00"
}, },
{ {
"name": "sebastian/lines-of-code", "name": "sebastian/lines-of-code",
"version": "2.0.2", "version": "2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git", "url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130",
"reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.18 || ^5.0", "nikic/php-parser": "^4.10",
"php": ">=8.1" "php": ">=8.1"
}, },
"require-dev": { "require-dev": {
@@ -5315,8 +5186,7 @@
"homepage": "https://github.com/sebastianbergmann/lines-of-code", "homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0"
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
}, },
"funding": [ "funding": [
{ {
@@ -5324,7 +5194,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-12-21T08:38:20+00:00" "time": "2023-02-03T07:08:02+00:00"
}, },
{ {
"name": "sebastian/object-enumerator", "name": "sebastian/object-enumerator",
@@ -5612,16 +5482,16 @@
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
"version": "1.2.3", "version": "1.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/theseer/tokenizer.git", "url": "https://github.com/theseer/tokenizer.git",
"reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
"reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -5650,7 +5520,7 @@
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": { "support": {
"issues": "https://github.com/theseer/tokenizer/issues", "issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.3" "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
}, },
"funding": [ "funding": [
{ {
@@ -5658,7 +5528,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-03T12:36:25+00:00" "time": "2021-07-28T10:34:58+00:00"
} }
], ],
"aliases": [], "aliases": [],
@@ -5669,7 +5539,7 @@
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
"php": "8.3" "php": "8.2"
}, },
"plugin-api-version": "2.6.0" "plugin-api-version": "2.3.0"
} }
BIN
View File
Binary file not shown.
+1 -4
View File
@@ -99,10 +99,7 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
$err = str_replace(ROOT, '{ROOT}', $err); $err = str_replace(ROOT, '{ROOT}', $err);
$errstr = str_replace(ROOT, '{ROOT}', $errstr); $errstr = str_replace(ROOT, '{ROOT}', $errstr);
$errpath = str_replace(ROOT, '{ROOT}', $errpath); $errpath = str_replace(ROOT, '{ROOT}', $errpath);
$trace = array_map(function (string|array $text) { $trace = array_map(function (string $text) {
if (is_array($text)) {
$text = Json::encode($text);
}
return str_replace(ROOT, '{ROOT}', $text); return str_replace(ROOT, '{ROOT}', $text);
}, $trace); }, $trace);
+1 -1
View File
@@ -56,7 +56,7 @@ $rootDB->insert('member', [
'token_valid_until' => '2999-01-01 00:00:00', 'token_valid_until' => '2999-01-01 00:00:00',
'pw' => $finalPassword, 'pw' => $finalPassword,
'salt' => $userSalt, 'salt' => $userSalt,
'grade' => 7, 'grade' => 6,
'name' => $nickname, 'name' => $nickname,
'reg_date' => $nowDate 'reg_date' => $nowDate
]); ]);
+9 -2
View File
@@ -17,11 +17,18 @@ if (!class_exists('\\sammo\\RootDB')) {
$rootDB = RootDB::db(); $rootDB = RootDB::db();
$rootDB->addHook('run_failed', function ($params) { $rootDB->throw_exception_on_nonsql_error = false;
$rootDB->nonsql_error_handler = function ($params) {
Json::die([
'step' => 'conn_fail'
]);
};
$rootDB->error_handler = function ($params) {
Json::die([ Json::die([
'step' => 'sql_fail' 'step' => 'sql_fail'
]); ]);
}); };
$memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member'); $memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member');
if ($memberCnt == 0) { if ($memberCnt == 0) {
+11 -3
View File
@@ -150,12 +150,20 @@ if (!file_exists(ROOT . '/d_setting/.htaccess')) {
$rootDB = new \MeekroDB($host, $username, $password, $dbName, $port, 'utf8mb4'); $rootDB = new \MeekroDB($host, $username, $password, $dbName, $port, 'utf8mb4');
$rootDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true; $rootDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
$rootDB->addHook('run_failed', function ($args) { $rootDB->throw_exception_on_nonsql_error = false;
$rootDB->nonsql_error_handler = function ($params) {
Json::die([ Json::die([
'result' => false, 'result' => false,
'reason' => '에러.'. $args['error'] 'reason' => 'DB 접속에 실패했습니다.'
]); ]);
}); };
$rootDB->error_handler = function ($params) {
Json::die([
'result' => false,
'reason' => 'SQL을 제대로 실행하지 못했습니다. DB상태를 확인해 주세요.'
]);
};
$mysqli_obj = $rootDB->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨. $mysqli_obj = $rootDB->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨.
+1 -11
View File
@@ -92,14 +92,4 @@ CREATE TABLE `login_token` (
INDEX `by_date` (`user_id`, `expire_date`) INDEX `by_date` (`user_id`, `expire_date`)
) )
COLLATE='utf8mb4_general_ci' COLLATE='utf8mb4_general_ci'
ENGINE=Aria; ENGINE=Aria;
CREATE TABLE `banned_member` (
`no` INT NOT NULL AUTO_INCREMENT,
`hashed_email` VARCHAR(128) NOT NULL COLLATE 'utf8mb4_general_ci' COMMENT 'SHA512(salt | email | salt )',
`info` TEXT NULL COLLATE 'utf8mb4_general_ci' COMMENT '부가정보',
PRIMARY KEY (`no`),
UNIQUE INDEX `email` (`hashed_email`(128))
)
COLLATE='utf8mb4_general_ci'
ENGINE = Aria;
+2 -5
View File
@@ -13,9 +13,6 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']); [$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
$clock = GameClock::fromStorage($gameStor);
$turntimeDisplay = $clock->formatTick(Util::toInt($turntime), true);
$tnmtTimeDisplay = $tnmt_time === null ? '-' : $clock->formatTick(Util::toInt($tnmt_time), true);
$plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"'); $plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"');
?> ?>
@@ -33,8 +30,8 @@ $plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"');
</head> </head>
<body> <body>
<form action=_119_b.php method=post> <form action=_119_b.php method=post>
시간조정 : <input type=text size=3 name=minute><input type=submit name=btn value='분당김'><input type=submit name=btn value='분지연'> 최종갱신 : <?=$turntimeDisplay?> (tick <?=$turntime?>)<br> 시간조정 : <input type=text size=3 name=minute><input type=submit name=btn value='분당김'><input type=submit name=btn value='분지연'> 최종갱신 : <?=$turntime?><br>
시간조정 : <input type=text size=3 name=minute2><input type=submit name=btn value='토너분당김'><input type=submit name=btn value='토너분지연'> 토너먼트 : <?=$tnmtTimeDisplay?> (tick <?=$tnmt_time?>)<br> 시간조정 : <input type=text size=3 name=minute2><input type=submit name=btn value='토너분당김'><input type=submit name=btn value='토너분지연'> 토너먼트 : <?=$tnmt_time?><br>
봉급지급 : <input type=submit name=btn value='금지급'><input type=submit name=btn value='쌀지급'><br> 봉급지급 : <input type=submit name=btn value='금지급'><input type=submit name=btn value='쌀지급'><br>
락 풀 기 : <input type=submit name=btn value='락걸기'><input type=submit name=btn value='락풀기'> 현재 : <?=$plock>0?"동결중":"가동중"?><br> 락 풀 기 : <input type=submit name=btn value='락걸기'><input type=submit name=btn value='락풀기'> 현재 : <?=$plock>0?"동결중":"가동중"?><br>
</form> </form>
+36 -9
View File
@@ -38,9 +38,21 @@ switch ($btn) {
usleep(500000); usleep(500000);
} }
$clock = GameClock::fromStorage($gameStor); $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']);
// 스케줄 전체를 벽시계에서 빼지 않고 논리 현재 tick만 앞으로 이동합니다. $turntime = (new \DateTimeImmutable($gameStor->turntime))->sub(new \DateInterval("PT{$minute}M"));
$clock->advance($gameStor, $clock->ticksFromMinutes($minute)); $starttime = (new \DateTimeImmutable($gameStor->starttime))->sub(new \DateInterval("PT{$minute}M"));
$tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->sub(new \DateInterval("PT{$minute}M"));
$gameStor->turntime = $turntime->format('Y-m-d H:i:s.u');
$gameStor->starttime = $starttime->format('Y-m-d H:i:s');
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
$db->update('general', [
'turntime' => $db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute)
], true);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_SUB(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
if ($locked) { if ($locked) {
unlock(); unlock();
} }
@@ -54,19 +66,34 @@ switch ($btn) {
} }
usleep(500000); usleep(500000);
} }
$clock = GameClock::fromStorage($gameStor); $gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']);
$clock->advance($gameStor, -$clock->ticksFromMinutes($minute)); $turntime = (new \DateTimeImmutable($gameStor->turntime))->add(new \DateInterval("PT{$minute}M"));
$starttime = (new \DateTimeImmutable($gameStor->starttime))->add(new \DateInterval("PT{$minute}M"));
$tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->add(new \DateInterval("PT{$minute}M"));
$gameStor->turntime = $turntime->format('Y-m-d H:i:s.u');
$gameStor->starttime = $starttime->format('Y-m-d H:i:s');
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
$db->update('general', [
'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
], true);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
if ($locked) { if ($locked) {
unlock(); unlock();
} }
break; break;
case "토너분당김": case "토너분당김":
$clock = GameClock::fromStorage($gameStor); $tnmt_time = new \DateTime($gameStor->tnmt_time);
$gameStor->tnmt_time = Util::toInt($gameStor->tnmt_time) - $clock->ticksFromMinutes($minute2); $tnmt_time->sub(new \DateInterval("PT{$minute2}M"));
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
break; break;
case "토너분지연": case "토너분지연":
$clock = GameClock::fromStorage($gameStor); $tnmt_time = new \DateTimeImmutable($gameStor->tnmt_time);
$gameStor->tnmt_time = Util::toInt($gameStor->tnmt_time) + $clock->ticksFromMinutes($minute2); $tnmt_time->add(new \DateInterval("PT{$minute2}M"));
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
break; break;
case "금지급": case "금지급":
processGoldIncome(); processGoldIncome();
+3 -3
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if($session->userGrade < 6) { if($session->userGrade < 5) {
die(requireAdminPermissionHTML()); die(requireAdminPermissionHTML());
} }
@@ -40,7 +40,7 @@ $admin = getAdmin();
</tr> </tr>
<tr> <tr>
<td width=110 align=right>시작시간변경</td> <td width=110 align=right>시작시간변경</td>
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime_display'], 0, 19)?>'><input type=submit name=btn value=변경1></td> <td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
</tr> </tr>
<tr> <tr>
<td width=110 align=right>최대 장수</td> <td width=110 align=right>최대 장수</td>
@@ -52,7 +52,7 @@ $admin = getAdmin();
<td width=110 align=right>시작 년도</td> <td width=110 align=right>시작 년도</td>
<td width=285><input type=text size=3 maxlength=3 style=color:white;background-color:black;text-align:right; name=startyear value='<?=$admin['startyear']?>'><input type=submit name=btn value=변경4></td> <td width=285><input type=text size=3 maxlength=3 style=color:white;background-color:black;text-align:right; name=startyear value='<?=$admin['startyear']?>'><input type=submit name=btn value=변경4></td>
<td width=110 align=right>최근 갱신 시간</td> <td width=110 align=right>최근 갱신 시간</td>
<td width=285>&nbsp;<?=$admin['turntime_display']?> (tick <?=$admin['turntime']?>)</td> <td width=285>&nbsp;<?=$admin['turntime']?></td>
</tr> </tr>
<tr> <tr>
<td width=110 align=right>턴시간</td> <td width=110 align=right>턴시간</td>
+4 -10
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
header('location:_admin1.php'); header('location:_admin1.php');
die(); die();
} }
@@ -25,15 +25,13 @@ if (!$v->validate()) {
$msg = Util::getPost('msg'); $msg = Util::getPost('msg');
$btn = Util::getPost('btn'); $btn = Util::getPost('btn');
$log = Util::getPost('log'); $log = Util::getPost('log');
$starttime = Util::getPost('starttime', 'string', null); $starttime = Util::getPost('starttime', 'string', (new \DateTime())->format('Y-m-d H:i:s'));
$maxgeneral = Util::getPost('maxgeneral', 'int', GameConst::$defaultMaxGeneral); $maxgeneral = Util::getPost('maxgeneral', 'int', GameConst::$defaultMaxGeneral);
$maxnation = Util::getPost('maxnation', 'int', GameConst::$defaultMaxNation); $maxnation = Util::getPost('maxnation', 'int', GameConst::$defaultMaxNation);
$startyear = Util::getPost('startyear', 'int', GameConst::$defaultStartYear); $startyear = Util::getPost('startyear', 'int', GameConst::$defaultStartYear);
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$starttime ??= $clock->formatTick($clock->nowTick());
$admin = getAdmin(); $admin = getAdmin();
@@ -45,11 +43,7 @@ switch ($btn) {
pushGlobalHistoryLog(["<R>★</><S>{$log}</>"]); pushGlobalHistoryLog(["<R>★</><S>{$log}</>"]);
break; break;
case "변경1": case "변경1":
$gameStor->clock_base_time = TimeUtil::format(GameClock::baseTimeForProjection( $gameStor->starttime = (new \DateTime($starttime))->format('Y-m-d H:i:s');
new \DateTimeImmutable($starttime),
Util::toInt($gameStor->starttime),
$clock->getTurnTermMinutes(),
), true);
break; break;
case "변경2": case "변경2":
$gameStor->maxgeneral = $maxgeneral; $gameStor->maxgeneral = $maxgeneral;
@@ -84,4 +78,4 @@ switch ($btn) {
break; break;
} }
header('location:_admin1.php'); header('location:_admin1.php');
+1 -1
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die(requireAdminPermissionHTML()); die(requireAdminPermissionHTML());
} }
+10 -10
View File
@@ -15,7 +15,7 @@ $msg = Util::getPost('msg', 'string');
//로그인 검사 //로그인 검사
$session = Session::requireLogin()->loginGame()->setReadOnly(); $session = Session::requireLogin()->loginGame()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
header('location:_admin2.php'); header('location:_admin2.php');
} }
@@ -99,7 +99,7 @@ switch ($btn) {
], '`no` IN %li', $genlist); ], '`no` IN %li', $genlist);
break; break;
case "강제 사망": case "강제 사망":
$date = GameClock::fromStorage($gameStor)->nowTick(); $date = TimeUtil::now(true);
$db->update('general', [ $db->update('general', [
'killturn' => 0, 'killturn' => 0,
'turntime' => $date, 'turntime' => $date,
@@ -113,7 +113,7 @@ switch ($btn) {
case "경험치1000": case "경험치1000":
$text = $btn . " 지급!"; $text = $btn . " 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -124,7 +124,7 @@ switch ($btn) {
case "공헌치1000": case "공헌치1000":
$text = $btn . " 지급!"; $text = $btn . " 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -135,7 +135,7 @@ switch ($btn) {
case "보숙10000": case "보숙10000":
$text = "보병숙련도+10000 지급!"; $text = "보병숙련도+10000 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -145,7 +145,7 @@ switch ($btn) {
case "궁숙10000": case "궁숙10000":
$text = "궁병숙련도+10000 지급!"; $text = "궁병숙련도+10000 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -156,7 +156,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID); $src = MessageTarget::buildQuick($session->generalID);
$text = "기병숙련도+10000 지급!"; $text = "기병숙련도+10000 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -167,7 +167,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID); $src = MessageTarget::buildQuick($session->generalID);
$text = "귀병숙련도+10000 지급!"; $text = "귀병숙련도+10000 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -178,7 +178,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID); $src = MessageTarget::buildQuick($session->generalID);
$text = "차병숙련도+10000 지급!"; $text = "차병숙련도+10000 지급!";
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
$db->update('general', [ $db->update('general', [
@@ -198,7 +198,7 @@ switch ($btn) {
case "메세지 전달": case "메세지 전달":
$text = $msg ?? ''; $text = $msg ?? '';
foreach ($genlist as $generalID) { foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, Message::gameNow(), new \DateTime('9999-12-31'), []); $msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true); $msg->send(true);
} }
break; break;
+1 -1
View File
@@ -20,7 +20,7 @@ if ($type2 < 0 || $type2 > 6) {
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die(requireAdminPermissionHTML()); die(requireAdminPermissionHTML());
} }
+1 -1
View File
@@ -12,7 +12,7 @@ $nation = Util::getPost('nation', 'int');
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
header('location:_admin5.php'); header('location:_admin5.php');
die(); die();
} }
+4 -5
View File
@@ -31,18 +31,17 @@ $queryMap = [
]; ];
if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) { if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
$reqQueryType = array_key_first($queryMap); $reqQueryType = Util::array_first_key($queryMap);
} }
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die(requireAdminPermissionHTML()); die(requireAdminPermissionHTML());
} }
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
if ($btn == '정렬하기') { if ($btn == '정렬하기') {
$gen = 0; $gen = 0;
@@ -112,7 +111,7 @@ $generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAcc
대상장수 : 대상장수 :
<select name=gen size=1> <select name=gen size=1>
<?php foreach ($generalBasicList as $general) : ?> <?php foreach ($generalBasicList as $general) : ?>
<option <?= $gen == $general['no'] ? 'selected' : '' ?> value='<?= $general['no'] ?>'><?= $general['name'] ?> (<?= substr($clock->formatTick(Util::toInt($general['turntime'])), 14, 5) ?>)</option> <option <?= $gen == $general['no'] ? 'selected' : '' ?> value='<?= $general['no'] ?>'><?= $general['name'] ?> (<?= substr($general['turntime'], 14, 5) ?>)</option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
<input type=submit name=btn value='조회하기'> <input type=submit name=btn value='조회하기'>
@@ -180,4 +179,4 @@ $generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAcc
</table> </table>
</body> </body>
</html> </html>
+4 -2
View File
@@ -12,7 +12,7 @@ $type = 0;
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die(requireAdminPermissionHTML()); die(requireAdminPermissionHTML());
} }
@@ -100,6 +100,8 @@ $sel[$type] = "selected";
throw new \Exception("알 수 없는 외교 상태: {$dip['state']}"); throw new \Exception("알 수 없는 외교 상태: {$dip['state']}");
} }
$date = TimeUtil::now();
echo " echo "
<tr> <tr>
<td align=center style=color:" . newColor($nationColor[$me]) . ";background-color:{$nationColor[$me]};>$nationName[$me]</td> <td align=center style=color:" . newColor($nationColor[$me]) . ";background-color:{$nationColor[$me]};>$nationName[$me]</td>
@@ -120,4 +122,4 @@ $sel[$type] = "selected";
</table> </table>
</body> </body>
</html> </html>
+1 -1
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die('권한 부족'); die('권한 부족');
} }
+2 -5
View File
@@ -243,14 +243,11 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
"SELECT nation,no,name,owner_name as ownerName, owner, picture, imgsvr, "SELECT nation,no,name,owner_name as ownerName, owner, picture, imgsvr,
experience, dedication, experience, dedication,
dex1, dex2, dex3, dex4, dex5, dex1, dex2, dex3, dex4, dex5,
horse, weapon, book, item, aux horse, weapon, book, item
FROM general WHERE %l", FROM general WHERE %l",
$btn == "NPC 보기" ? "npc>=2" : "npc<2" $btn == "NPC 보기" ? "npc>=2" : "npc<2"
) as $general) { ) as $general) {
$generalID = $general['no']; $generalID = $general['no'];
foreach (['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey) {
$general[$dexKey] = CentennialAllStarGrowthService::recordableRawValue($general, $dexKey);
}
$general['bgColor'] = $nationColor[$general['nation']] ?? GameConst::$basecolor4; $general['bgColor'] = $nationColor[$general['nation']] ?? GameConst::$basecolor4;
$general['fgColor'] = newColor($general['bgColor']); $general['fgColor'] = newColor($general['bgColor']);
$general['nationName'] = $nationName[$general['nation']]; $general['nationName'] = $nationName[$general['nation']];
@@ -430,4 +427,4 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
</div> </div>
</body> </body>
</html> </html>
+1 -2
View File
@@ -9,7 +9,6 @@ include "func.php";
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
increaseRefresh("갱신정보", 1); increaseRefresh("갱신정보", 1);
@@ -24,7 +23,7 @@ $recentTraffic[] = [
'month' => $admin['month'], 'month' => $admin['month'],
'refresh' => $admin['refresh'], 'refresh' => $admin['refresh'],
'online' => $curonline, 'online' => $curonline,
'date' => $clock->formatNow() 'date' => TimeUtil::now()
]; ];
if ($admin['maxrefresh'] == 0) { if ($admin['maxrefresh'] == 0) {
+4 -4
View File
@@ -16,7 +16,7 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("현재도시", 1); increaseRefresh("현재도시", 1);
$lastExecute = substr(GameClock::fromStorage($gameStor)->formatTick(Util::toInt($gameStor->turntime)), 5, 14); $lastExecute = substr($gameStor->turntime, 5, 14);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID); $me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID);
$myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [ $myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [
@@ -177,7 +177,7 @@ $templates = new \League\Plates\Engine('templates');
$valid = 1; $valid = 1;
} }
if ($userGrade >= 6) { if ($userGrade >= 5) {
$valid = true; $valid = true;
$showDetailedInfo = true; $showDetailedInfo = true;
} }
@@ -275,7 +275,7 @@ $templates = new \League\Plates\Engine('templates');
$ourGeneral = false; $ourGeneral = false;
} }
if ($userGrade == 7) { if ($userGrade == 6) {
$ourGeneral = true; $ourGeneral = true;
} }
@@ -537,4 +537,4 @@ $templates = new \League\Plates\Engine('templates');
</table> </table>
</body> </body>
</html> </html>
+1 -3
View File
@@ -129,7 +129,6 @@ $templates = new \League\Plates\Engine('templates');
); );
$generalTurnList = []; $generalTurnList = [];
$clock = GameClock::fromStorage($gameStor);
foreach ($db->queryAllLists( foreach ($db->queryAllLists(
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC', 'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
@@ -143,7 +142,6 @@ $templates = new \League\Plates\Engine('templates');
$genCntEff = 0; $genCntEff = 0;
foreach ($generals as &$general) { foreach ($generals as &$general) {
$general['turntime'] = $clock->formatTick(Util::toInt($general['turntime']), true);
$general['cityText'] = CityConst::byID($general['city'])->name; $general['cityText'] = CityConst::byID($general['city'])->name;
$general['troopText'] = $troopName[$general['troop']] ?? '-'; $general['troopText'] = $troopName[$general['troop']] ?? '-';
@@ -286,4 +284,4 @@ $templates = new \League\Plates\Engine('templates');
</table> </table>
</body> </body>
</html> </html>
+15 -41
View File
@@ -19,10 +19,10 @@ $userID = Session::getUserID();
$generalID = $session->generalID; $generalID = $session->generalID;
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']); $gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
$clock = GameClock::fromStorage($gameStor);
$nowTick = $clock->nowTick(); increaseRefresh("내정보", 1);
$me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog); $me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
@@ -41,30 +41,12 @@ $lastRefresh = $db->queryFirstField(
$generalID $generalID
); );
$nextChange = $me->getAuxVar('next_change'); $targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
if (!is_int($nextChange)) { if ($gameStor->turntime <= $gameStor->opentime) {
$nextChange = null; //서버 가오픈시 할 수 있는 행동
} if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
$nextChangeDisplay = $nextChange === null ? null : $clock->formatTick($nextChange);
increaseRefresh("내정보", 1);
if ($gameStor->turntime <= $gameStor->opentime) {
$targetTime = $me->getAuxVar('prestart_delete_after');
if (!is_int($targetTime)) {
$targetTime = addTurn(
$lastRefresh === null ? $nowTick : Util::toInt($lastRefresh),
$gameStor->turnterm,
GameConst::$minTurnDieOnPrestart
);
$me->setAuxVar('prestart_delete_after', $targetTime);
$me->applyDB($db);
}
$targetTimeDisplay = $clock->formatTick($targetTime);
//서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
$showDieOnPrestartBtn = true; $showDieOnPrestartBtn = true;
if ($targetTime <= $nowTick) { if ($targetTime <= TimeUtil::now()) {
$availableDieOnPrestart = true; $availableDieOnPrestart = true;
} }
} }
@@ -154,21 +136,13 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option> <option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
<?php endforeach; ?> <?php endforeach; ?>
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?> <option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>
<?php if ($changeDefence999Train != 0 || $changeDefence999Train != 0) : <?php if($changeDefence999Train != 0 || $changeDefence999Train != 0):
?>[<?= $changeDefence999Train != 0 ? "훈련 {$changeDefence999Train}," : '' ?><?= $changeDefence999Atmos != 0 ? "사기 {$changeDefence999Atmos}" : '' ?>[<?=$changeDefence999Train!=0?"훈련 {$changeDefence999Train},":''?><?=$changeDefence999Atmos!=0?"사기 {$changeDefence999Atmos}":''
?>]<?php endif ?></option> ?>]<?php endif?></option>
</select> </select>
】<br><br> 】<br><br>
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br> <input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
∞<span style='color:orange'>설정저장은 이달중 <?= $myset ?>회 남았습니다.</span><br><br> ∞<span style='color:orange'>설정저장은 이달중 <?= $myset ?>회 남았습니다.</span><br><br>
<?php if ($me->getPenaltyList()->count()) : ?>
징계 목록(저장 시 갱신)<br>
<?php foreach ($me->getPenaltyList() as $penaltyKey => $penalty) : ?>
<span style='color:red'><?= $penaltyKey->getHelptext() ?> : <?= $penalty ?></span><br>
<?php endforeach; ?>
<br />
<?php endif; ?>
<?php if (!($gameStor->autorun_user['limit_minutes'] ?? false)) : ?> <?php if (!($gameStor->autorun_user['limit_minutes'] ?? false)) : ?>
휴 가 신 청<br> 휴 가 신 청<br>
<button type="button" id='vacation' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>휴가 신청</button><br><br> <button type="button" id='vacation' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>휴가 신청</button><br><br>
@@ -177,7 +151,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>--> <a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>-->
<?php if ($showDieOnPrestartBtn) : ?> <?php if ($showDieOnPrestartBtn) : ?>
가오픈 기간 내 장수 삭제 (<?= $targetTimeDisplay ?> 부터)<br> 가오픈 기간 내 장수 삭제 (<?= substr($targetTime, 0, 19) ?> 부터)<br>
<button type="button" id='dieOnPrestart' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button><br><br> <button type="button" id='dieOnPrestart' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button><br><br>
<?php endif; ?> <?php endif; ?>
@@ -192,7 +166,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<?php endif; ?> <?php endif; ?>
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?> <?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
다른 장수 선택 (<?= $nextChangeDisplay ?? '지금' ?>부터)<br> 다른 장수 선택 (<?= substr($me->getAuxVar('next_change') ?? TimeUtil::now(), 0, 19) ?> 부터)<br>
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br> <a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br>
<?php endif; ?> <?php endif; ?>
@@ -290,4 +264,4 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
</div> </div>
</body> </body>
</html> </html>
+57 -1
View File
@@ -125,7 +125,63 @@ $globalBetTotal = array_sum($globalBet);
</tr> </tr>
</table> </table>
<table align=center class='tb_layout bg0'> <table align=center class='tb_layout bg0'>
<?php if ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?> <?php if ($session->userGrade >= 5) : ?>
<form method=post action=c_tournament.php>
<tr>
<td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td>
</tr>
<tr>
<td colspan=8>
<button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button>
<?php if ($admin['tournament'] == 0) : ?>
<select name=trig size=1 style=color:white;background-color:black;>
<option style=color:white; value=0 <?= !$admin['tnmt_trig'] ? 'selected' : '' ?>>수동진행</option>
<option style=color:white; value=1 <?= $admin['tnmt_trig'] ? 'selected' : '' ?>>자동진행</option>
</select>
<input type=submit name=btn value='자동개최설정'>
<?php else : ?>
<input type=submit name=btn value='중단' onclick='return confirm("진짜 중단하시겠습니까?")'>
<?php endif; ?>
<?php switch ($admin['tournament']) {
case 1:
echo "<input type=submit name=btn value='랜덤투입'>";
echo "<input type=submit name=btn value='랜덤전부투입'>";
break;
case 2:
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
break;
case 3:
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
break;
case 4:
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
break;
case 5:
echo "<input type=submit name=btn value='배정'>";
break;
case 6:
echo "<input type=submit name=btn value='베팅마감'>";
break;
case 7:
echo "<input type=submit name=btn value='16강'>";
break;
case 8:
echo "<input type=submit name=btn value='8강'>";
break;
case 9:
echo "<input type=submit name=btn value='4강'>";
break;
case 10:
echo "<input type=submit name=btn value='결승'>";
break;
} ?>
</td>
</tr>
</form>
<?php elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
<form method=post action=c_tournament.php> <form method=post action=c_tournament.php>
<tr> <tr>
<td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button><button type="submit" class="btn btn-sammo-base2" onclick='return confirm("참가비 금<?= $admin['develcost'] ?>이 필요합니다. 참가하시겠습니까?")'>참가</button><input type='hidden' name='btn' value='참가'/></td> <td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button><button type="submit" class="btn btn-sammo-base2" onclick='return confirm("참가비 금<?= $admin['develcost'] ?>이 필요합니다. 참가하시겠습니까?")'>참가</button><input type='hidden' name='btn' value='참가'/></td>
+3 -3
View File
@@ -228,10 +228,10 @@ if($btn == "자동개최설정") {
$phase = 0; $phase = 0;
startBetting($admin['tnmt_type'], 720); startBetting($admin['tnmt_type'], 720);
} elseif($btn == "베팅마감") { } elseif($btn == "베팅마감") {
$clock = GameClock::fromStorage($gameStor); $dt = date("Y-m-d H:i:s", time() + 60);
$gameStor->tournament=7; $gameStor->tournament=7;
$gameStor->phase=0; $gameStor->phase=0;
$gameStor->tnmt_time = $clock->nowTick() + $clock->ticksFromSeconds(60); $gameStor->tnmt_time = $dt;
} elseif($btn == "16강") { } elseif($btn == "16강") {
finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 16); finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 16);
} elseif($btn == "8강") { } elseif($btn == "8강") {
@@ -248,4 +248,4 @@ if($btn == "자동개최설정") {
$gameStor->tnmt_msg = $msg; $gameStor->tnmt_msg = $msg;
} }
header('location:b_tournament.php'); header('location:b_tournament.php');
+1 -17
View File
@@ -51,22 +51,6 @@
display: none; display: none;
} }
.picture_choice {
margin: 8px auto;
}
.picture_choice label,
.event_picture label {
display: inline-flex;
align-items: center;
gap: 4px;
margin: 4px 8px;
}
.picture_choice img {
object-fit: cover;
}
.custom_picture { .custom_picture {
display: none; display: none;
} }
@@ -77,4 +61,4 @@
.custom_stat { .custom_stat {
display: none; display: none;
} }
+136 -137
View File
@@ -9,7 +9,6 @@ use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\GeneralColumn; use sammo\Enums\GeneralColumn;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey; use sammo\Enums\InheritanceKey;
use sammo\Enums\PenaltyKey;
use sammo\Enums\RankColumn; use sammo\Enums\RankColumn;
require_once 'process_war.php'; require_once 'process_war.php';
@@ -112,7 +111,7 @@ function GetImageURL($imgsvr, $filepath = '')
function checkLimit($refreshScore = null) function checkLimit($refreshScore = null)
{ {
$session = Session::getInstance(); $session = Session::getInstance();
if ($session->userGrade >= 6) { if ($session->userGrade >= 4) {
return 0; return 0;
} }
@@ -377,11 +376,11 @@ function myNationInfo(General $generalObj)
function checkSecretMaxPermission($penalty) function checkSecretMaxPermission($penalty)
{ {
$secretMax = 4; $secretMax = 4;
if ($penalty[PenaltyKey::NoTopSecret->value] ?? false) { if ($penalty['noTopSecret'] ?? false) {
$secretMax = 1; $secretMax = 1;
} else if ($penalty[PenaltyKey::NoChief->value] ?? false) { } else if ($penalty['noChief'] ?? false) {
$secretMax = 1; $secretMax = 1;
} else if ($penalty[PenaltyKey::NoAmbassador->value] ?? false) { } else if ($penalty['noAmbassador'] ?? false) {
$secretMax = 2; $secretMax = 2;
} }
return $secretMax; return $secretMax;
@@ -404,19 +403,19 @@ function checkSecretPermission(array $me, $checkSecretLimit = true)
} }
if ($penalty[PenaltyKey::NoChief->value] ?? false) { if ($penalty['noSecret'] ?? false) {
return 0; return 0;
} }
$secretMin = 0; $secretMin = 0;
$secretMax = checkSecretMaxPermission($penalty); $secretMax = checkSecretMaxPermission($me, $penalty);
if ($me['officer_level'] == 12) { if ($me['officer_level'] == 12) {
$secretMin = 4; $secretMin = 4;
} else if ($permission == 'ambassador') { } else if ($me['permission'] == 'ambassador') {
$secretMin = 4; $secretMin = 4;
} else if ($permission == 'auditor') { } else if ($me['permission'] == 'auditor') {
$secretMin = 3; $secretMin = 3;
} else if ($me['officer_level'] >= 5) { } else if ($me['officer_level'] >= 5) {
$secretMin = 2; $secretMin = 2;
@@ -630,11 +629,7 @@ function generalInfo(General $generalObj)
$injury = "건강"; $injury = "건강";
} }
$clock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env')); $remaining = (new \DateTimeImmutable($generalObj->getTurnTime()))->diff(new \DateTimeImmutable())->i;
$remaining = max(0, intdiv(
$generalObj->getTurnTick() - $clock->nowTick(),
$clock->ticksFromMinutes(1),
));
if ($nation['color'] == "") { if ($nation['color'] == "") {
$nation['color'] = "#000000"; $nation['color'] = "#000000";
@@ -925,37 +920,45 @@ function banner()
); );
} }
function addTurn(int $tick, int $turnterm, int $turn = 1, bool $withFraction = true): int function addTurn($date, int $turnterm, int $turn = 1, bool $withFraction = true)
{ {
return $tick + GameClock::TICKS_PER_TURN * $turn; $date = new \DateTime($date);
} $target = $turnterm * $turn;
$date->add(new \DateInterval("PT{$target}M"));
function subTurn(int $tick, int $turnterm, int $turn = 1, bool $withFraction = true): int if ($withFraction) {
{ return $date->format('Y-m-d H:i:s.u');
return $tick - GameClock::TICKS_PER_TURN * $turn; }
} return $date->format('Y-m-d H:i:s');
}
function cutTurn(int $tick, int $turnterm, bool $withFraction = true): int
{ function subTurn($date, int $turnterm, int $turn = 1, bool $withFraction = true)
$remainder = $tick % GameClock::TICKS_PER_TURN; {
if ($remainder < 0) { $date = new \DateTime($date);
$remainder += GameClock::TICKS_PER_TURN; $target = $turnterm * $turn;
} $date->sub(new \DateInterval("PT{$target}M"));
return $tick - $remainder; if ($withFraction) {
} return $date->format('Y-m-d H:i:s.u');
}
/** 시나리오 초기화 입력인 벽시계를 기존 01:00 기준 월 경계로 정렬합니다. */ return $date->format('Y-m-d H:i:s');
function cutTurnDateTime(string $date, int $turnterm, bool $withFraction = true): string }
{
$dateObj = new \DateTime($date); function cutTurn($date, int $turnterm, bool $withFraction = true)
$baseDate = new \DateTime($dateObj->format('Y-m-d')); {
$baseDate->sub(new \DateInterval('P1D')); $date = new \DateTime($date);
$baseDate->add(new \DateInterval('PT1H'));
$diffMin = intdiv($dateObj->getTimestamp() - $baseDate->getTimestamp(), 60); $baseDate = new \DateTime($date->format('Y-m-d'));
$diffMin -= $diffMin % $turnterm; $baseDate->sub(new \DateInterval("P1D"));
$baseDate->add(new \DateInterval("PT{$diffMin}M")); $baseDate->add(new \DateInterval("PT1H"));
return $baseDate->format($withFraction ? 'Y-m-d H:i:s.u' : 'Y-m-d H:i:s');
} $diffMin = intdiv($date->getTimeStamp() - $baseDate->getTimeStamp(), 60);
$diffMin -= $diffMin % $turnterm;
$baseDate->add(new \DateInterval("PT{$diffMin}M"));
if ($withFraction) {
return $baseDate->format('Y-m-d H:i:s.u');
}
return $baseDate->format('Y-m-d H:i:s');
}
function cutDay($date, int $turnterm, bool $withFraction = true) function cutDay($date, int $turnterm, bool $withFraction = true)
{ {
@@ -997,13 +1000,15 @@ function increaseRefresh($type = "", $cnt = 1)
$generalID = $session->generalID; $generalID = $session->generalID;
$userGrade = $session->userGrade; $userGrade = $session->userGrade;
$db = DB::db(); $dateObj = new \DateTimeImmutable();
$gameStor = KVStorage::getStorage($db, 'game_env'); $date = TimeUtil::format($dateObj, false);
$date = GameClock::fromStorage($gameStor)->nowTick();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$isunited = $gameStor->isunited; $isunited = $gameStor->isunited;
$opentime = $gameStor->opentime; $opentime = $gameStor->opentime;
if ($userGrade >= 6) { if ($userGrade == 6) {
return; return;
} }
if ($isunited == 2) { if ($isunited == 2) {
@@ -1041,7 +1046,7 @@ function increaseRefresh($type = "", $cnt = 1)
$logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql'); $logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? 'local'; $ip = $_SERVER['REMOTE_ADDR'] ?? 'local';
$date = date('Y-m-d H:i:s'); $date = date('Y-m-d H:i:s');
$logDB->insert('api_log', [ $logDB->insert('api_log', [
@@ -1049,10 +1054,10 @@ function increaseRefresh($type = "", $cnt = 1)
'ip' => $ip, 'ip' => $ip,
'date' => $date, 'date' => $date,
'path' => "refresh", 'path' => "refresh",
'arg' => Json::encode([ 'arg' => JSON::encode([
'type' => $type, 'type' => $type,
]), ]),
'aux' => Json::encode([ 'aux' => JSON::encode([
'generalID' => $generalID, 'generalID' => $generalID,
'generalName' => $session->generalName, 'generalName' => $session->generalName,
'userName' => $session->userName, 'userName' => $session->userName,
@@ -1082,12 +1087,12 @@ function updateTraffic()
if(count($recentTraffic) >= 5){ if(count($recentTraffic) >= 5){
array_shift($recentTraffic); array_shift($recentTraffic);
} }
$recentTraffic[] = [ $recentTraffic[] = [
'year'=>$admin['year'], 'year'=>$admin['year'],
'month' => $admin['month'], 'month' => $admin['month'],
'refresh' => $admin['refresh'], 'refresh' => $admin['refresh'],
'online' => $online, 'online' => $online,
'date' => GameClock::fromStorage($gameStor)->formatNow(), 'date' => TimeUtil::now(),
]; ];
$gameStor->recentTraffic = $recentTraffic; $gameStor->recentTraffic = $recentTraffic;
@@ -1101,7 +1106,7 @@ function CheckOverhead()
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
[$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']); [$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']);
$nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * GameConst::$refreshLimitCoef; $nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * 10;
if ($nextRefreshLimit != $refreshLimit) { if ($nextRefreshLimit != $refreshLimit) {
@@ -1139,19 +1144,18 @@ function unlock(): bool
return $db->affectedRows() > 0; return $db->affectedRows() > 0;
} }
function timeover(): bool function timeover(): bool
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
list($turnterm, $turntime) = $gameStor->getValuesAsArray(['turnterm', 'turntime']); list($turnterm, $turntime) = $gameStor->getValuesAsArray(['turnterm', 'turntime']);
$clock = GameClock::fromStorage($gameStor); $diff = (new \DateTime())->getTimestamp() - (new \DateTime($turntime))->getTimestamp();
$diff = $clock->nowTick() - Util::toInt($turntime);
$t = min($turnterm, 5); $t = min($turnterm, 5);
$term = $clock->ticksFromSeconds($t); $term = $diff;
if ($diff >= $term || $diff < 0) { if ($term >= $t || $term < 0) {
return true; return true;
} else { } else {
return false; return false;
@@ -1164,8 +1168,9 @@ function checkDelay()
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
//서버정보 //서버정보
$clock = GameClock::fromStorage($gameStor); $now = new \DateTimeImmutable();
$timeMinDiff = intdiv($clock->nowTick() - Util::toInt($gameStor->turntime), $clock->ticksFromMinutes(1)); $turntime = new \DateTimeImmutable($gameStor->turntime);
$timeMinDiff = intdiv($now->getTimestamp() - $turntime->getTimestamp(), 60);
// 1턴이상 갱신 없었으면 서버 지연 // 1턴이상 갱신 없었으면 서버 지연
$term = $gameStor->turnterm; $term = $gameStor->turnterm;
@@ -1179,17 +1184,20 @@ function checkDelay()
//지연 해야할 밀린 턴 횟수 //지연 해야할 밀린 턴 횟수
$iter = intdiv($timeMinDiff, $term); $iter = intdiv($timeMinDiff, $term);
if ($iter > $threshold) { if ($iter > $threshold) {
$minute = $iter * $term; $minute = $iter * $term;
$delayTick = $clock->ticksFromMinutes($minute); $newTurntime = $turntime->add(new \DateInterval("PT{$minute}M"));
$gameStor->turntime = Util::toInt($gameStor->turntime) + $delayTick; $newNextTurntime = $turntime->add(new \DateInterval("PT{$term}M"));
$gameStor->starttime = Util::toInt($gameStor->starttime) + $delayTick; $gameStor->turntime = $newTurntime->format('Y-m-d H:i:s');
$gameStor->starttime = (new \DateTimeImmutable($gameStor->starttime))
$db->update('general', [ ->add(new \DateInterval("PT{$minute}M"))
'turntime' => $db->sqleval('turntime + %i', $delayTick) ->format('Y-m-d H:i:s');
], true);
$db->update('ng_auction', [ $db->update('general', [
'close_tick' => $db->sqleval('close_tick + %i', $delayTick) 'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
], 'finished = 0'); ], 'turntime<=DATE_ADD(turntime, INTERVAL %i MINUTE)', $term);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
} }
} }
@@ -1238,15 +1246,17 @@ function updateOnline()
$gameStor->online_nation = join(', ', $onlineNation); $gameStor->online_nation = join(', ', $onlineNation);
} }
function turnDate($curtime) function turnDate($curtime)
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['startyear', 'starttime', 'turnterm', 'year', 'month']); $admin = $gameStor->getValues(['startyear', 'starttime', 'turnterm', 'year', 'month']);
$turn = $admin['starttime']; $turn = $admin['starttime'];
$curturn = cutTurn(Util::toInt($curtime), $admin['turnterm']); $curturn = cutTurn($curtime, $admin['turnterm']);
$num = intdiv($curturn - Util::toInt($turn), GameClock::TICKS_PER_TURN); $term = $admin['turnterm'];
$num = intdiv((strtotime($curturn) - strtotime($turn)), $term * 60);
$date = $admin['startyear'] * 12; $date = $admin['startyear'] * 12;
$date += $num; $date += $num;
@@ -1376,14 +1386,12 @@ function CheckHall($no)
return; return;
} }
$clock = GameClock::fromStorage($gameStor); $unitedDate = TimeUtil::now();
$unitedDate = $clock->formatTick($clock->nowTick());
$nation = $generalObj->getStaticNation(); $nation = $generalObj->getStaticNation();
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games'); $serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
[$scenarioIdx, $scenarioName, $startTick] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']); [$scenarioIdx, $scenarioName, $startTime] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']);
$startTime = $clock->formatTick(Util::toInt($startTick));
$ownerName = $generalObj->getVar('owner_name'); $ownerName = $generalObj->getVar('owner_name');
if ($generalObj->getVar('owner')) { if ($generalObj->getVar('owner')) {
@@ -1392,11 +1400,8 @@ function CheckHall($no)
foreach ($types as [$typeName, $valueType]) { foreach ($types as [$typeName, $valueType]) {
if ($valueType === 'natural') { if ($valueType === 'natural') {
$value = $generalObj->getVar($typeName); $value = $generalObj->getVar($typeName);
if (in_array($typeName, ['dex1', 'dex2', 'dex3', 'dex4', 'dex5'], true)) {
$value = CentennialAllStarGrowthService::recordableValue($generalObj, $typeName);
}
} else if ($valueType === 'rank') { } else if ($valueType === 'rank') {
$value = $generalObj->getRankVar(RankColumn::from($typeName)); $value = $generalObj->getRankVar(RankColumn::from($typeName));
} else if ($valueType === 'calc') { } else if ($valueType === 'calc') {
@@ -1663,6 +1668,8 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
$prob = 1 / ($genCount * $itemTypeCnt * 0.7 / 3); // 투표율 70%, 설문조사 한번에 2~3개 등장 $prob = 1 / ($genCount * $itemTypeCnt * 0.7 / 3); // 투표율 70%, 설문조사 한번에 2~3개 등장
} else if ($acquireType == '랜덤 임관') { } else if ($acquireType == '랜덤 임관') {
$prob = 1 / ($genCount * $itemTypeCnt / 10 / 2); // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?) $prob = 1 / ($genCount * $itemTypeCnt / 10 / 2); // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
} else if ($acquireType == '건국') {
$prob = 1 / ($genCount * $itemTypeCnt / 10 / 4); // 건국시 4개(20%) 등장(200명시 20국 정도 됨)
} }
$prob *= GameConst::$uniqueTrialCoef; $prob *= GameConst::$uniqueTrialCoef;
@@ -1676,9 +1683,6 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
//포인트로 랜덤 유니크 획득 //포인트로 랜덤 유니크 획득
$prob = 1; $prob = 1;
} }
else if ($acquireType == '건국') {
$prob = 1; // 건국시 100%
}
foreach (Util::range($maxCnt) as $_idx) { foreach (Util::range($maxCnt) as $_idx) {
if ($rng->nextBool($prob)) { if ($rng->nextBool($prob)) {
@@ -1696,21 +1700,12 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
return giveRandomUniqueItem($rng, $general, $acquireType); return giveRandomUniqueItem($rng, $general, $acquireType);
} }
function getAdmin() function getAdmin()
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getAll(); return $gameStor->getAll();
$clock = GameClock::fromStorage($gameStor); }
foreach (['turntime', 'starttime', 'opentime', 'tnmt_time'] as $key) {
if (($admin[$key] ?? null) !== null) {
$admin["{$key}_display"] = $clock->formatTick(Util::toInt($admin[$key]), true);
}
}
$admin['clock_now_tick'] = $clock->nowTick();
$admin['clock_now_display'] = $clock->formatTick($admin['clock_now_tick'], true);
return $admin;
}
/** @return General[] */ /** @return General[] */
function deleteNation(General $lord, bool $applyDB): array function deleteNation(General $lord, bool $applyDB): array
@@ -1788,13 +1783,11 @@ function deleteNation(General $lord, bool $applyDB): array
// 부대 삭제 // 부대 삭제
$db->delete('troop', 'nation=%i', $nationID); $db->delete('troop', 'nation=%i', $nationID);
// 국가 삭제 // 국가 삭제
$gameDate = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow(); $db->insert('ng_old_nations', [
$db->insert('ng_old_nations', [ 'server_id' => UniqueConst::$serverID,
'server_id' => UniqueConst::$serverID, 'nation' => $nationID,
'nation' => $nationID, 'data' => Json::encode($nation)
'date' => $gameDate,
'data' => Json::encode($nation)
]); ]);
$db->delete('nation', 'nation=%i', $nationID); $db->delete('nation', 'nation=%i', $nationID);
$db->delete('nation_turn', 'nation_id=%i', $nationID); $db->delete('nation_turn', 'nation_id=%i', $nationID);
@@ -2201,29 +2194,35 @@ function SabotageInjury(RandUtil $rng, array $cityGeneralList, string $reason):
return $injuryCount; return $injuryCount;
} }
function getRandTurn(RandUtil $rng, int $term, ?int $baseTick = null): int function getRandTurn(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
{ {
$db = DB::db(); if ($baseDateTime === null) {
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env')); $baseDateTime = new \DateTimeImmutable();
$baseTick ??= $clock->nowTick(); } else if ($baseDateTime instanceof \DateTime) {
$baseDateTime = \DateTimeImmutable::createFromMutable($baseDateTime);
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1); } else if ($baseDateTime instanceof \DateTimeImmutable) {
$randMicrosecond = $rng->nextRangeInt(0, 999999); // 레거시 RNG 소비 6자리 유지 //do Nothing
} else {
return $baseTick throw new MustNotBeReachedException();
+ $clock->ticksFromSeconds($randSecond) }
+ intdiv($randMicrosecond * $clock->ticksPerSecond(), 1_000_000);
} $randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
function getRandTurn2(RandUtil $rng, int $term, ?int $baseTick = null): int
{ return TimeUtil::format($baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction)), true);
$db = DB::db(); }
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$baseTick ??= $clock->nowTick(); function getRandTurn2(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1); {
$randMicrosecond = $rng->nextRangeInt(0, 999999); // 레거시 RNG 소비 6자리 유지 if ($baseDateTime === null) {
$baseDateTime = new \DateTimeImmutable();
return $baseTick } else if ($baseDateTime instanceof \DateTime) {
- $clock->ticksFromSeconds($randSecond) $baseDateTime = \DateTimeImmutable::createFromMutable($baseDateTime);
- intdiv($randMicrosecond * $clock->ticksPerSecond(), 1_000_000); } else {
} throw new MustNotBeReachedException();
}
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s.u');
}
+3 -4
View File
@@ -62,12 +62,11 @@ function processAuction()
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $now = TimeUtil::now();
$nowTick = GameClock::fromStorage($gameStor)->nowTick();
$auctionList = $db->queryAllLists( $auctionList = $db->queryAllLists(
'SELECT id, `type` FROM ng_auction WHERE `close_tick` <= %i AND finished = 0', 'SELECT id, `type` FROM ng_auction WHERE `close_date` <= %s AND finished = 0',
$nowTick $now
); );
if (!$auctionList) { if (!$auctionList) {
+39 -82
View File
@@ -3,7 +3,6 @@ namespace sammo;
use sammo\Command\GeneralCommand; use sammo\Command\GeneralCommand;
use sammo\Command\NationCommand; use sammo\Command\NationCommand;
use sammo\Enums\PenaltyKey;
function getGeneralTurnBrief(General $generalObj, array $turnList) { function getGeneralTurnBrief(General $generalObj, array $turnList) {
$result = []; $result = [];
@@ -42,21 +41,15 @@ function pushGeneralCommand(int $generalID, int $turnCnt=1){
$db = DB::db(); $db = DB::db();
$db->query( $db->update('general_turn', [
'UPDATE general_turn AS dst 'turn_idx'=>$db->sqleval('turn_idx + %i', $turnCnt)
LEFT JOIN general_turn AS src ], 'general_id=%i ORDER BY turn_idx DESC', $generalID);
ON src.general_id = dst.general_id $db->update('general_turn', [
AND src.turn_idx = dst.turn_idx - %i 'turn_idx'=>$db->sqleval('turn_idx - %i', GameConst::$maxTurn),
SET dst.action = IF(src.id IS NULL, %s, src.action), 'action'=>'휴식',
dst.arg = IF(src.id IS NULL, %s, src.arg), 'arg'=>'{}',
dst.brief = IF(src.id IS NULL, %s, src.brief) 'brief'=>'휴식'
WHERE dst.general_id = %i', ], 'general_id=%i AND turn_idx >= %i', $generalID, GameConst::$maxTurn);
$turnCnt,
'휴식',
'{}',
'휴식',
$generalID
);
} }
function pullGeneralCommand(int $generalID, int $turnCnt=1){ function pullGeneralCommand(int $generalID, int $turnCnt=1){
@@ -73,21 +66,15 @@ function pullGeneralCommand(int $generalID, int $turnCnt=1){
$db = DB::db(); $db = DB::db();
$db->query( $db->update('general_turn', [
'UPDATE general_turn AS dst 'turn_idx'=>$db->sqleval('turn_idx + %i', GameConst::$maxTurn),
LEFT JOIN general_turn AS src 'action'=>'휴식',
ON src.general_id = dst.general_id 'arg'=>'{}',
AND src.turn_idx = dst.turn_idx + %i 'brief'=>'휴식'
SET dst.action = IF(src.id IS NULL, %s, src.action), ], 'general_id=%i AND turn_idx < %i', $generalID, $turnCnt);
dst.arg = IF(src.id IS NULL, %s, src.arg), $db->update('general_turn', [
dst.brief = IF(src.id IS NULL, %s, src.brief) 'turn_idx'=>$db->sqleval('turn_idx - %i', $turnCnt)
WHERE dst.general_id = %i', ], 'general_id=%i ORDER BY turn_idx ASC', $generalID);
$turnCnt,
'휴식',
'{}',
'휴식',
$generalID
);
} }
function repeatGeneralCommand(int $generalId, int $turnCnt){ function repeatGeneralCommand(int $generalId, int $turnCnt){
@@ -138,23 +125,15 @@ function pushNationCommand(int $nationID, int $officerLevel, int $turnCnt=1){
$db = DB::db(); $db = DB::db();
$db->query( $db->update('nation_turn', [
'UPDATE nation_turn AS dst 'turn_idx'=>$db->sqleval('turn_idx + %i', $turnCnt)
LEFT JOIN nation_turn AS src ], 'nation_id=%i AND officer_level=%i ORDER BY turn_idx DESC', $nationID, $officerLevel);
ON src.nation_id = dst.nation_id $db->update('nation_turn', [
AND src.officer_level = dst.officer_level 'turn_idx'=>$db->sqleval('turn_idx - %i', GameConst::$maxChiefTurn),
AND src.turn_idx = dst.turn_idx - %i 'action'=>'휴식',
SET dst.action = IF(src.id IS NULL, %s, src.action), 'arg'=>'{}',
dst.arg = IF(src.id IS NULL, %s, src.arg), 'brief'=>'휴식'
dst.brief = IF(src.id IS NULL, %s, src.brief) ], 'nation_id=%i AND officer_level=%i AND turn_idx >= %i ORDER BY turn_idx ASC', $nationID, $officerLevel, GameConst::$maxChiefTurn);
WHERE dst.nation_id = %i AND dst.officer_level = %i',
$turnCnt,
'휴식',
'{}',
'휴식',
$nationID,
$officerLevel
);
} }
function pullNationCommand(int $nationID, int $officerLevel, int $turnCnt=1){ function pullNationCommand(int $nationID, int $officerLevel, int $turnCnt=1){
@@ -177,23 +156,15 @@ function pullNationCommand(int $nationID, int $officerLevel, int $turnCnt=1){
$db = DB::db(); $db = DB::db();
$db->query( $db->update('nation_turn', [
'UPDATE nation_turn AS dst 'turn_idx'=>$db->sqleval('turn_idx + %i', GameConst::$maxChiefTurn),
LEFT JOIN nation_turn AS src 'action'=>'휴식',
ON src.nation_id = dst.nation_id 'arg'=>'{}',
AND src.officer_level = dst.officer_level 'brief'=>'휴식',
AND src.turn_idx = dst.turn_idx + %i ], 'nation_id=%i AND officer_level=%i AND turn_idx < %i', $nationID, $officerLevel, $turnCnt);
SET dst.action = IF(src.id IS NULL, %s, src.action), $db->update('nation_turn', [
dst.arg = IF(src.id IS NULL, %s, src.arg), 'turn_idx'=>$db->sqleval('turn_idx - %i', $turnCnt)
dst.brief = IF(src.id IS NULL, %s, src.brief) ], 'nation_id=%i AND officer_level=%i ORDER BY turn_idx ASC', $nationID, $officerLevel);
WHERE dst.nation_id = %i AND dst.officer_level = %i',
$turnCnt,
'휴식',
'{}',
'휴식',
$nationID,
$officerLevel
);
} }
function repeatNationCommand(int $nationID, int $officerLevel, int $turnCnt){ function repeatNationCommand(int $nationID, int $officerLevel, int $turnCnt){
@@ -242,7 +213,7 @@ function _setGeneralCommand(GeneralCommand $command, array $turnList):void {
$db->update('general_turn', [ $db->update('general_turn', [
'action'=>$commandName, 'action'=>$commandName,
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT), 'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief 'brief'=>$brief
], 'general_id = %i AND turn_idx IN %li', $generalID, $turnList); ], 'general_id = %i AND turn_idx IN %li', $generalID, $turnList);
} }
@@ -262,7 +233,7 @@ function _setNationCommand(NationCommand $command, array $turnList):void {
$db->update('nation_turn', [ $db->update('nation_turn', [
'action'=>$commandName, 'action'=>$commandName,
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT), 'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief 'brief'=>$brief
], 'nation_id = %i AND officer_level = %i AND turn_idx IN %li', $nationID, $officerLevel, $turnList); ], 'nation_id = %i AND officer_level = %i AND turn_idx IN %li', $nationID, $officerLevel, $turnList);
} }
@@ -463,13 +434,6 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
]; ];
} }
if($general->hasPenalty(PenaltyKey::NoChiefTurnInput)){
return [
'result'=>false,
'reason'=>'수뇌 턴 입력 불가능'
];
}
try{ try{
$commandObj = buildNationCommandClass($command, $general, $env, $general->getLastTurn(), $arg); $commandObj = buildNationCommandClass($command, $general, $env, $general->getLastTurn(), $arg);
} }
@@ -509,17 +473,10 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
} }
_setNationCommand($commandObj, $turnList); _setNationCommand($commandObj, $turnList);
if($general->getNPCType() < 2){
//유저장인 경우에는 턴 리필
$general->updateVarWithLimit('killturn', $env['killturn'], $general->getVar('killturn'));
$general->applyDB($db);
}
return [ return [
'result'=>true, 'result'=>true,
'brief'=>$commandObj->getBrief(), 'brief'=>$commandObj->getBrief(),
'arg_test'=>true, 'arg_test'=>true,
'reason'=>'success' 'reason'=>'success'
]; ];
} }
+56 -24
View File
@@ -291,6 +291,40 @@ function buildScenarioEffectClass(?string $type):iAction{
return $obj; return $obj;
} }
function getBuffClass(?string $type){
if($type === null || $type === ''){
$type = 'None';
}
static $basePath = __NAMESPACE__.'\\ActionBuff\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 버프 클래스가 아님");
}
function buildBuffClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getBuffClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralSpecialDomesticClass(?string $type){ function getGeneralSpecialDomesticClass(?string $type){
if($type === null || $type === ''){ if($type === null || $type === ''){
$type = GameConst::$defaultSpecialDomestic; $type = GameConst::$defaultSpecialDomestic;
@@ -416,6 +450,27 @@ function buildGeneralCommandClass(?string $type, General $generalObj, array $env
return new $class($generalObj, $env, $arg); return new $class($generalObj, $env, $arg);
} }
function getUserActionCommandClass(?string $type){
if($type === null || $type === ''){
$type = '휴식';
}
static $basePath = __NAMESPACE__.'\\Command\\UserAction\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 개변 전략 커맨드가 아님");
}
function buildUserActionCommandClass(?string $type, General $generalObj, array $env, $arg = null):Command\UserActionCommand{
$class = getUserActionCommandClass($type);
return new $class($generalObj, $env, $arg);
}
function getNationCommandClass(?string $type){ function getNationCommandClass(?string $type){
if($type === null || $type === ''){ if($type === null || $type === ''){
$type = '휴식'; $type = '휴식';
@@ -457,29 +512,6 @@ function buildWarUnitTriggerClass(?string $type, WarUnit $unit, ?array $args = n
return $class->newInstanceArgs(array_merge([$unit], $args)); return $class->newInstanceArgs(array_merge([$unit], $args));
} }
function getStaticEventClass(string $type){
static $basePath = __NAMESPACE__.'\\StaticEvent\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 StaticEvent가 아님");
}
function buildStaticEventClass(?string $type):BaseStaticEvent{
static $cache = [];
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getStaticEventClass($type);
$obj = new $class();
$cache[$type] = $obj;
return $obj;
}
function getGeneralPoolClass(string $type){ function getGeneralPoolClass(string $type){
static $basePath = __NAMESPACE__.'\\GeneralPool\\'; static $basePath = __NAMESPACE__.'\\GeneralPool\\';
$classPath = ($basePath.$type); $classPath = ($basePath.$type);
@@ -686,7 +718,7 @@ function TechLimit($startYear, $year, $tech) : bool {
$relYear = $year - $startYear; $relYear = $year - $startYear;
$relMaxTech = Util::valueFit( $relMaxTech = Util::valueFit(
floor($relYear / GameConst::$techLevelIncYear) + GameConst::$initialAllowedTechLevel, floor($relYear / 5) + 1,
1, 1,
GameConst::$maxTechLevel GameConst::$maxTechLevel
); );
+23 -45
View File
@@ -372,7 +372,7 @@ function postUpdateMonthly(RandUtil $rng)
continue; continue;
} }
//양측 기간 모두 0이 되는 상황이면 //양측 기간 모두 0이 되는 상황이면
$nation1 = getNationStaticInfo($me); $nation1 = getNationStaticInfo($me);
$name1 = $nation1['name']; $name1 = $nation1['name'];
$nation2 = getNationStaticInfo($you); $nation2 = getNationStaticInfo($you);
@@ -381,7 +381,7 @@ function postUpdateMonthly(RandUtil $rng)
$josaWa = JosaUtil::pick($name1, '와'); $josaWa = JosaUtil::pick($name1, '와');
$josaYi = JosaUtil::pick($name2, '이'); $josaYi = JosaUtil::pick($name2, '이');
$globalLogger->pushGlobalHistoryLog("<R><b>【전】</b></><D><b>$name1</b></>{$josaWa} <D><b>$name2</b></>{$josaYi} <S>전</>합니다."); $globalLogger->pushGlobalHistoryLog("<R><b>【전】</b></><D><b>$name1</b></>{$josaWa} <D><b>$name2</b></>{$josaYi} <S>전</>합니다.");
$db->update('diplomacy', [ $db->update('diplomacy', [
'state' => 2, 'state' => 2,
'term' => 0, 'term' => 0,
@@ -559,7 +559,7 @@ function checkStatistic()
$nationHist = ''; $nationHist = '';
foreach (GameConst::$availableNationType as $nationType) { foreach (GameConst::$availableNationType as $nationType) {
if (!($nationHists[$nationType] ?? null)) { if (!Util::array_get($nationHists[$nationType])) {
$nationHists[$nationType] = '-'; $nationHists[$nationType] = '-';
} }
$nationHist .= getNationType($nationType) . "({$nationHists[$nationType]}), "; $nationHist .= getNationType($nationType) . "({$nationHists[$nationType]}), ";
@@ -651,24 +651,16 @@ function checkStatistic()
} }
function convForOldGeneral(array $general, int $year, int $month) function convForOldGeneral(array $general, int $year, int $month)
{ {
$general['history'] = getGeneralHistoryLogAll($general['no']); $general['history'] = getGeneralHistoryLogAll($general['no']);
$clock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env')); return [
$turnTimeDisplay = $clock->formatTick(Util::toInt($general['turntime']), true);
$general['turntime_tick'] = Util::toInt($general['turntime']);
$general['turntime'] = $turnTimeDisplay;
if ($general['recent_war'] !== null) {
$general['recent_war_tick'] = Util::toInt($general['recent_war']);
$general['recent_war'] = $clock->formatTick(Util::toInt($general['recent_war']), true);
}
return [
'server_id' => UniqueConst::$serverID, 'server_id' => UniqueConst::$serverID,
'general_no' => $general['no'], 'general_no' => $general['no'],
'owner' => $general['owner'], 'owner' => $general['owner'],
'name' => $general['name'], 'name' => $general['name'],
'last_yearmonth' => $year * 100 + $month, 'last_yearmonth' => $year * 100 + $month,
'turntime' => $turnTimeDisplay, 'turntime' => $general['turntime'],
'data' => Json::encode($general) 'data' => Json::encode($general)
]; ];
} }
@@ -742,7 +734,7 @@ function checkEmperior()
/** @var int[] */ /** @var int[] */
$auctionList = $db->queryFirstColumn( $auctionList = $db->queryFirstColumn(
'SELECT `id` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0 ORDER BY `close_tick` ASC', 'SELECT `id` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0 ORDER BY `close_date` ASC',
AuctionType::UniqueItem->value AuctionType::UniqueItem->value
); );
foreach($auctionList as $auctionID){ foreach($auctionList as $auctionID){
@@ -838,23 +830,20 @@ function checkEmperior()
$nation['aux'] += $nationStor->max_power ?? []; $nation['aux'] += $nationStor->max_power ?? [];
$nation['history'] = getNationHistoryLogAll($nation['nation']); $nation['history'] = getNationHistoryLogAll($nation['nation']);
storeOldGenerals(0, $admin['year'], $admin['month']); storeOldGenerals(0, $admin['year'], $admin['month']);
storeOldGenerals($nation['nation'], $admin['year'], $admin['month']); storeOldGenerals($nation['nation'], $admin['year'], $admin['month']);
$gameDate = GameClock::fromStorage($gameStor)->formatNow();
$db->insert('ng_old_nations', [
$db->insert('ng_old_nations', [ 'server_id' => UniqueConst::$serverID,
'server_id' => UniqueConst::$serverID, 'nation' => $nation['nation'],
'nation' => $nation['nation'], 'data' => Json::encode($nation)
'date' => $gameDate,
'data' => Json::encode($nation)
]); ]);
$noNationGeneral = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=0'); $noNationGeneral = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=0');
$db->insert('ng_old_nations', [ $db->insert('ng_old_nations', [
'server_id' => UniqueConst::$serverID, 'server_id' => UniqueConst::$serverID,
'nation' => 0, 'nation' => 0,
'date' => $gameDate, 'data' => Json::encode([
'data' => Json::encode([
'nation' => 0, 'nation' => 0,
'name' => '재야', 'name' => '재야',
'generals' => $noNationGeneral 'generals' => $noNationGeneral
@@ -910,7 +899,7 @@ function checkEmperior()
'tiger' => $tigerstr, 'tiger' => $tigerstr,
'eagle' => $eaglestr, 'eagle' => $eaglestr,
'gen' => $gen, 'gen' => $gen,
'history' => Json::encode($nationHistory), 'history' => JSON::encode($nationHistory),
'aux' => $statGeneral['aux'] 'aux' => $statGeneral['aux']
]); ]);
@@ -962,19 +951,8 @@ function updateMaxDomesticCritical(General $general, $score)
} }
} }
function genGenericUniqueRNG(int $year, int $month, int $generalID, ?string $reason = null): RandUtil function genGenericUniqueRNG(int $year, int $month, int $generalID): RandUtil
{ {
if($reason){
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'unique',
$year,
$month,
$generalID,
$reason
)));
}
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize( return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
'unique', 'unique',
@@ -984,7 +962,7 @@ function genGenericUniqueRNG(int $year, int $month, int $generalID, ?string $rea
))); )));
} }
function genGenericUniqueRNGFromGeneral(General $general, string $reason): RandUtil function genGenericUniqueRNGFromGeneral(General $general): RandUtil
{ {
$logger = $general->getLogger(); $logger = $general->getLogger();
if (!$logger) { if (!$logger) {
@@ -993,5 +971,5 @@ function genGenericUniqueRNGFromGeneral(General $general, string $reason): RandU
$year = $logger->getYear(); $year = $logger->getYear();
$month = $logger->getMonth(); $month = $logger->getMonth();
$generalID = $general->getID(); $generalID = $general->getID();
return genGenericUniqueRNG($year, $month, $generalID, $reason); return genGenericUniqueRNG($year, $month, $generalID);
} }
+2 -6
View File
@@ -4,10 +4,6 @@ namespace sammo;
function printLimitMsg($turntime) function printLimitMsg($turntime)
{ {
if (is_int($turntime) || (is_string($turntime) && ctype_digit(ltrim($turntime, '-')))) {
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
$turntime = GameClock::fromStorage($gameStor)->formatTick(Util::toInt($turntime), true);
}
//FIXME: template로 이동. //FIXME: template로 이동.
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
@@ -142,7 +138,7 @@ function JSCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): array{
$distanceList = searchDistance($cityNo, $maxDistance, true); $distanceList = searchDistance($cityNo, $maxDistance, true);
$result = []; $result = [];
for ($dist = 1; $dist <= $maxDistance; $dist++) { for ($dist = 1; $dist <= $maxDistance; $dist++) {
$result[$dist] = $distanceList[$dist] ?? []; $result[$dist] = Util::array_get($distanceList[$dist], []);
} }
return $result; return $result;
} }
@@ -156,7 +152,7 @@ function printCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): string
for ($dist = 1; $dist <= $maxDistance; $dist++) { for ($dist = 1; $dist <= $maxDistance; $dist++) {
$cityList = array_map(function ($cityID) { $cityList = array_map(function ($cityID) {
return CityConst::byID($cityID)->name; return CityConst::byID($cityID)->name;
}, $distanceList[$dist] ?? []); }, Util::array_get($distanceList[$dist], []));
$cityStr = join(', ', $cityList); $cityStr = join(', ', $cityList);
+2 -6
View File
@@ -61,12 +61,8 @@ function chiefTurnTable()
"; ";
} }
function templateLimitMsg(string $turntime): string function templateLimitMsg(string $turntime): string
{ {
if (ctype_digit(ltrim($turntime, '-'))) {
$gameStor = KVStorage::getStorage(DB::db(), 'game_env');
$turntime = GameClock::fromStorage($gameStor)->formatTick(Util::toInt($turntime), true);
}
return "이미 너무 많은 접속을 하셨습니다. 다음 턴에 다시 시도해주세요. (턴시간: {$turntime})"; return "이미 너무 많은 접속을 하셨습니다. 다음 턴에 다시 시도해주세요. (턴시간: {$turntime})";
} }
+10 -17
View File
@@ -17,10 +17,10 @@ function processTournament()
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'turnterm', 'last_tournament_betting_id']); $admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'turnterm', 'last_tournament_betting_id']);
$offset = intdiv($clock->nowTick() - Util::toInt($admin['tnmt_time']), $clock->ticksPerSecond()); $now = new \DateTime();
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
//수동일땐 무시 //수동일땐 무시
if (!$admin['tnmt_auto']) { if (!$admin['tnmt_auto']) {
@@ -122,10 +122,10 @@ function processTournament()
if ($tnmt == 6) { if ($tnmt == 6) {
$betTerm = Util::valueFit($unit * 60, null, 3600); $betTerm = Util::valueFit($unit * 60, null, 3600);
//처리 초 더한 날짜 //처리 초 더한 날짜
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i + $betTerm);
$gameStor->tournament = $tnmt; $gameStor->tournament = $tnmt;
$gameStor->phase = $phase; $gameStor->phase = $phase;
$gameStor->tnmt_time = Util::toInt($admin['tnmt_time']) $gameStor->tnmt_time = $dt;
+ $clock->ticksFromSeconds($unit * $i + $betTerm);
return; return;
} }
} }
@@ -133,7 +133,7 @@ function processTournament()
$second = $unit * $iter; $second = $unit * $iter;
$gameStor->tournament = $tnmt; $gameStor->tournament = $tnmt;
$gameStor->phase = $phase; $gameStor->phase = $phase;
$gameStor->tnmt_time = Util::toInt($admin['tnmt_time']) + $clock->ticksFromSeconds($second); $gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
} }
function getTournamentTermText(int $turnTerm) function getTournamentTermText(int $turnTerm)
@@ -160,8 +160,7 @@ function getTournamentTime()
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
list($tnmt, $tnmt_time) = $gameStor->getValuesAsArray(['tournament', 'tnmt_time']); list($tnmt, $tnmt_time) = $gameStor->getValuesAsArray(['tournament', 'tnmt_time']);
$clock = GameClock::fromStorage($gameStor); $dt = substr($tnmt_time, 11, 5);
$dt = substr($clock->formatTick(Util::toInt($tnmt_time)), 11, 5);
switch ($tnmt) { switch ($tnmt) {
case 1: case 1:
$tnmt = "개막시간 {$dt}"; $tnmt = "개막시간 {$dt}";
@@ -285,11 +284,9 @@ function startTournament($type)
$admin = $gameStor->getValues(['year', 'month', 'turnterm']); $admin = $gameStor->getValues(['year', 'month', 'turnterm']);
$turnTerm = $admin['turnterm']; $turnTerm = $admin['turnterm'];
$unit = calcTournamentTerm($turnTerm); $unit = calcTournamentTerm($turnTerm);
$clock = GameClock::fromStorage($gameStor);
$gameStor->tnmt_auto = true; $gameStor->tnmt_auto = true;
// 기존 startTournament은 unit을 분으로 더하므로 그 계약을 유지합니다. $gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
$gameStor->tnmt_time = $clock->nowTick() + $clock->ticksFromMinutes($unit);
$gameStor->tournament = 1; $gameStor->tournament = 1;
$gameStor->tnmt_type = $type; $gameStor->tnmt_type = $type;
$gameStor->last_tournament_betting_id = 0; $gameStor->last_tournament_betting_id = 0;
@@ -1156,25 +1153,21 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
]; ];
//막판 분노 //막판 분노
$factor1 = 1.0;
$factor2 = 1.0;
$ratio = rand() % 300; $ratio = rand() % 300;
if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) { if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) {
$factor2 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500% $damage2 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical1 = 1; $critical1 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]); $str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!"; $log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!";
} }
$ratio = rand() % 300; $ratio = rand() % 300;
if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) { if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) {
$factor1 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500% $damage1 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical2 = 1; $critical2 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]); $str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!"; $log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!";
} }
$damage1 *= $factor1;
$damage2 *= $factor2;
//1합 승부 //1합 승부
if ($phase == 1) { if ($phase == 1) {
+2 -3
View File
@@ -7,7 +7,6 @@ include "func.php";
Session::requireLogin()->loginGame()->setReadOnly(); Session::requireLogin()->loginGame()->setReadOnly();
$mapName = GameConst::$mapName; $mapName = GameConst::$mapName;
$frontClock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env'));
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
@@ -29,7 +28,7 @@ $frontClock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env')
'maxTurn' => GameConst::$maxTurn, 'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12, 'maxPushTurn' => 12,
'serverNow' => $frontClock->formatTick($frontClock->nowTick()), 'serverNow' => TimeUtil::now(false),
] ]
], false) ?> ], false) ?>
<?= WebUtil::printJS('../d_shared/common_path.js') ?> <?= WebUtil::printJS('../d_shared/common_path.js') ?>
@@ -43,4 +42,4 @@ $frontClock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env')
<div id="app"></div> <div id="app"></div>
</body> </body>
</html> </html>
+2 -2
View File
@@ -7,10 +7,10 @@ include "func.php";
$session = Session::requireLogin(); $session = Session::requireLogin();
if ($session->userGrade < 6) { if ($session->userGrade < 5) {
die('관리자 아님'); die('관리자 아님');
} }
if ($session->userGrade == 6) { if ($session->userGrade == 5) {
die('DB 리셋 권한을 가지고 있지 않습니다.'); die('DB 리셋 권한을 가지고 있지 않습니다.');
} }
+12 -15
View File
@@ -25,24 +25,21 @@ if(!$reserved){
]); ]);
} }
$reservedDate = new \DateTimeImmutable($reserved['date']); $reservedDate = new \DateTime($reserved['date']);
$now = GameClock::readWallTime(); $now = new \DateTime();
$status = 'not_yet'; $status = 'not_yet';
list($isUnited, $unitedWallAnchor) = $gameStor->getValuesAsArray(['isunited', 'autoreset_united_wall_anchor']); list($isUnited, $lastTurn) = $gameStor->getValuesAsArray(['isunited', 'turntime']);
if($isUnited === null){ if($isUnited === null || $lastTurn === null){
$isUnited = 2; $isUnited = 2;
} $lastTurn = '2000-01-01';
$lastTurn = null; }
if($isUnited > 0){
if(!is_string($unitedWallAnchor) || $unitedWallAnchor === ''){ if($lastTurn !== null){
$unitedWallAnchor = TimeUtil::format($now, true); $lastTurn = new \DateTime($lastTurn);
$gameStor->autoreset_united_wall_anchor = $unitedWallAnchor; }
}
$lastTurn = new \DateTimeImmutable($unitedWallAnchor);
}
if($lastTurn === null){ if($lastTurn === null){
//이미 리셋된 상태임 //이미 리셋된 상태임
@@ -102,4 +99,4 @@ $result['affected']=1;
$prefix = DB::prefix(); $prefix = DB::prefix();
ServConfig::getServerList()[$prefix]->openServer(); ServConfig::getServerList()[$prefix]->openServer();
Json::die($result); Json::die($result);
+2 -3
View File
@@ -10,7 +10,6 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$isSecretBoard = Util::getPost('isSecret', 'bool', false); $isSecretBoard = Util::getPost('isSecret', 'bool', false);
$title = Util::getPost('title'); $title = Util::getPost('title');
@@ -68,7 +67,7 @@ $icon = GetImageURL($me['imgsvr'], $me['picture']);
$db->insert('board', [ $db->insert('board', [
'nation_no'=>$me['nation'], 'nation_no'=>$me['nation'],
'is_secret'=>$isSecretBoard, 'is_secret'=>$isSecretBoard,
'date'=>$clock->formatNow(), 'date'=>TimeUtil::now(),
'general_no'=>$me['no'], 'general_no'=>$me['no'],
'author'=>$me['name'], 'author'=>$me['name'],
'author_icon'=>$icon, 'author_icon'=>$icon,
@@ -80,4 +79,4 @@ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success', 'reason'=>'success',
'row_id'=>$db->insertId() 'row_id'=>$db->insertId()
]); ]);
+2 -3
View File
@@ -10,7 +10,6 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$articleNo = Util::getPost('articleNo', 'int'); $articleNo = Util::getPost('articleNo', 'int');
$text = Util::getPost('text'); $text = Util::getPost('text');
@@ -74,7 +73,7 @@ else if ($isSecretBoard && $permission < 2) {
$db->insert('comment', [ $db->insert('comment', [
'nation_no'=>$me['nation'], 'nation_no'=>$me['nation'],
'is_secret'=>$isSecretBoard, 'is_secret'=>$isSecretBoard,
'date'=>$clock->formatNow(), 'date'=>TimeUtil::now(),
'document_no'=>$articleNo, 'document_no'=>$articleNo,
'general_no'=>$me['no'], 'general_no'=>$me['no'],
'author'=>$me['name'], 'author'=>$me['name'],
@@ -85,4 +84,4 @@ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success', 'reason'=>'success',
'row_id'=>$db->insertId() 'row_id'=>$db->insertId()
]); ]);
+2 -2
View File
@@ -83,7 +83,7 @@ else{
} }
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){ if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){
@@ -138,4 +138,4 @@ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success', 'reason'=>'success',
'state'=>$lastState 'state'=>$lastState
]); ]);
+2 -2
View File
@@ -69,7 +69,7 @@ $destNation = getNationStaticInfo($letter['dest_nation_id']);
$src = new MessageTarget($me['no'], $me['name'], $destNation['nation'], $destNation['name'], $destNation['color'], $me['icon']); $src = new MessageTarget($me['no'], $me['name'], $destNation['nation'], $destNation['name'], $destNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $srcNation['nation'], $srcNation['name'], $srcNation['color']); $dest = new MessageTarget(0, '', $srcNation['nation'], $srcNation['name'], $srcNation['color']);
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
if($isAgree){ if($isAgree){
@@ -133,4 +133,4 @@ $msgID = $msg->send();
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success' 'reason'=>'success'
]); ]);
+2 -2
View File
@@ -63,7 +63,7 @@ $destNation = getNationStaticInfo($letter['dest_nation_id']);
$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']); $src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']); $dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']);
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$aux['reason'] = [ $aux['reason'] = [
@@ -91,4 +91,4 @@ $msgID = $msg->send();
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success' 'reason'=>'success'
]); ]);
+3 -5
View File
@@ -140,8 +140,6 @@ else{
$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']); $me['icon'] = GetImageURL($me['imgsvr'], $me['picture']);
$clock = GameClock::fromStorage($gameStor);
$gameNow = $clock->nowDateTime();
$db->insert('ng_diplomacy', [ $db->insert('ng_diplomacy', [
'src_nation_id'=>$srcNation['nation'], 'src_nation_id'=>$srcNation['nation'],
'dest_nation_id'=>$destNation['nation'], 'dest_nation_id'=>$destNation['nation'],
@@ -149,7 +147,7 @@ $db->insert('ng_diplomacy', [
'state'=>'proposed', 'state'=>'proposed',
'text_brief'=>$textBrief, 'text_brief'=>$textBrief,
'text_detail'=>$textDetail, 'text_detail'=>$textDetail,
'date'=>TimeUtil::format($gameNow), 'date'=>TimeUtil::now(),
'src_signer'=>$me['no'], 'src_signer'=>$me['no'],
'dest_signer'=>null, 'dest_signer'=>null,
'aux'=>Json::encode([ 'aux'=>Json::encode([
@@ -170,7 +168,7 @@ $newLetterNo = $db->insertId();
$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']); $src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']); $dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']);
$now = \DateTime::createFromImmutable($gameNow); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$josaYi = JosaUtil::pick($newLetterNo, '이'); $josaYi = JosaUtil::pick($newLetterNo, '이');
@@ -197,4 +195,4 @@ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success', 'reason'=>'success',
'row_id'=>$db->insertId() 'row_id'=>$db->insertId()
]); ]);
+1 -1
View File
@@ -18,7 +18,7 @@ else{
$availableNextCall = $session->availableNextCallGetCityList??'2000-01-01 00:00:00'; $availableNextCall = $session->availableNextCallGetCityList??'2000-01-01 00:00:00';
$now = new \DateTimeImmutable(); $now = new \DateTimeImmutable();
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 6){ if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>"도시 목록은 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall 'reason'=>"도시 목록은 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
+23 -23
View File
@@ -16,10 +16,12 @@ $session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$now = $clock->nowTick();
$oldGeneral = $db->queryFirstField('SELECT `no` FROM general WHERE `owner`=%i', $userID); $oldGeneral = $db->queryFirstField('SELECT `no` FROM general WHERE `owner`=%i', $userID);
if($oldGeneral !== null){ if($oldGeneral !== null){
@@ -42,14 +44,15 @@ if($npcmode!=1){
]); ]);
} }
$token = $db->queryFirstRow('SELECT * FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%i', $userID, $now); $token = $db->queryFirstRow('SELECT * FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%s', $userID, $now);
$pickResult = []; $pickResult = [];
if($token && $refresh){ if($token && $refresh){
$pickMoreFrom = Util::toInt($token['pick_more_from']); $pickMoreFrom = (new \DateTime($token['pick_more_from']))->getTimestamp();
$nowT = $oNow->getTimestamp();
if($now >= $pickMoreFrom){ if($nowT >= $pickMoreFrom){
$oldPickResult = Json::decode($token['pick_result']); $oldPickResult = Json::decode($token['pick_result']);
foreach($keepResult as $keepId){ foreach($keepResult as $keepId){
@@ -72,16 +75,15 @@ if($token && $refresh){
} }
if($token && !$refresh){ if($token && !$refresh){
$pickMoreFrom = Util::toInt($token['pick_more_from']); $pickMoreFrom = (new \DateTime($token['pick_more_from']))->getTimestamp();
$nowT = $oNow->getTimestamp();
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'pick'=>Json::decode($token['pick_result']), 'pick'=>Json::decode($token['pick_result']),
'pickMoreFrom'=>$clock->formatTick($pickMoreFrom), 'pickMoreFrom'=>$token['pick_more_from'],
'pickMoreSeconds'=>intdiv($pickMoreFrom - $now, $clock->ticksPerSecond()), 'pickMoreSeconds'=>$pickMoreFrom-$nowT,
'validUntil'=>$clock->formatTick(Util::toInt($token['valid_until'])), 'validUntil'=>$token['valid_until']
'validForSeconds'=>max(0, intdiv(Util::toInt($token['valid_until']) - $now, $clock->ticksPerSecond())),
'clockMode'=>$clock->getMode(),
]); ]);
} }
@@ -98,7 +100,7 @@ foreach($db->query('SELECT `no`, `name`, leadership, strength, intel, nation, im
$weight[$general['no']] = pow($allStat, 1.5); $weight[$general['no']] = pow($allStat, 1.5);
} }
foreach($db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `owner`!=%i AND valid_until >=%i', $userID, $now) as $reserved){ foreach($db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `owner`!=%i AND valid_until >=%s', $userID, $now) as $reserved){
$reserved = Json::decode($reserved); $reserved = Json::decode($reserved);
foreach(array_keys($reserved) as $reservedNPC){ foreach(array_keys($reserved) as $reservedNPC){
if(key_exists($reservedNPC, $weight)){ if(key_exists($reservedNPC, $weight)){
@@ -129,8 +131,8 @@ $newNonce = random_int(0, 0xfffffff);
$validSecond = max(VALID_SECOND, $turnterm*40); $validSecond = max(VALID_SECOND, $turnterm*40);
$pickMoreSecond = max(PICK_MORE_SECOND, Util::round(pow($turnterm, 0.672)*8)); $pickMoreSecond = max(PICK_MORE_SECOND, Util::round(pow($turnterm, 0.672)*8));
$validUntil = $now + $clock->ticksFromSeconds($validSecond); $validUntil = $oNow->add(new \DateInterval(sprintf('PT%dS', $validSecond)));
$pickMoreFrom = $now + $clock->ticksFromSeconds($pickMoreSecond); $pickMoreFrom = $oNow->add(new \DateInterval(sprintf('PT%dS', $pickMoreSecond)));
$db->delete('select_npc_token', 'valid_until < %s', $now); $db->delete('select_npc_token', 'valid_until < %s', $now);
@@ -138,8 +140,8 @@ $inserted = 0;
if($token){ if($token){
$db->update('select_npc_token', [ $db->update('select_npc_token', [
'valid_until'=>$validUntil, 'valid_until'=>$validUntil->format('Y-m-d H:i:s'),
'pick_more_from'=>$pickMoreFrom, 'pick_more_from'=>$pickMoreFrom->format('Y-m-d H:i:s'),
'pick_result'=>Json::encode($pickResult), 'pick_result'=>Json::encode($pickResult),
'nonce'=>$newNonce 'nonce'=>$newNonce
], 'owner = %i AND nonce = %i', $userID, $token['nonce']); ], 'owner = %i AND nonce = %i', $userID, $token['nonce']);
@@ -150,8 +152,8 @@ if($token){
else{ else{
$db->insertIgnore('select_npc_token', [ $db->insertIgnore('select_npc_token', [
'owner'=>$userID, 'owner'=>$userID,
'valid_until'=>$validUntil, 'valid_until'=>$validUntil->format('Y-m-d H:i:s'),
'pick_more_from'=>$now, 'pick_more_from'=>'2000-01-01 01:00:00',
'pick_result'=>Json::encode($pickResult), 'pick_result'=>Json::encode($pickResult),
'nonce'=>$newNonce 'nonce'=>$newNonce
]); ]);
@@ -171,9 +173,7 @@ if($inserted === 0){
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'pick'=>$pickResult, 'pick'=>$pickResult,
'pickMoreFrom'=>$clock->formatTick(($inserted===-1)?$pickMoreFrom:$now), 'pickMoreFrom'=>($inserted===-1)?$pickMoreFrom->format('Y-m-d H:i:s'):'2000-01-01 01:00:00',
'pickMoreSeconds'=>($inserted===-1)?$pickMoreSecond:0, 'pickMoreSeconds'=>($inserted===-1)?$pickMoreSecond:0,
'validUntil'=>$clock->formatTick($validUntil), 'validUntil'=>$validUntil->format('Y-m-d H:i:s')
'validForSeconds'=>max(0, intdiv($validUntil - $now, $clock->ticksPerSecond())), ]);
'clockMode'=>$clock->getMode(),
]);
+14 -34
View File
@@ -10,23 +10,7 @@ function sortTokens(&$tokens){
}); });
} }
function putInfoText(&$info, ?array $currentTargetEnv){ function putInfoText(&$info){
if (($info['event100Growth'] ?? false) === true) {
if ($currentTargetEnv === null) {
$displayStats = CentennialAllStarGrowthService::calculateUserInitialStats($info);
$info['selectionStatLabel'] = '시작 능력치';
} else {
$displayStats = CentennialAllStarGrowthService::calculateUserCurrentTargetStats(
$info,
$currentTargetEnv
);
$info['selectionStatLabel'] = '현재 변경 기준 능력치';
}
$info['selectionLeadership'] = $displayStats['leadership'];
$info['selectionStrength'] = $displayStats['strength'];
$info['selectionIntel'] = $displayStats['intel'];
}
if(key_exists('specialDomestic', $info)){ if(key_exists('specialDomestic', $info)){
$class = buildGeneralSpecialDomesticClass($info['specialDomestic']); $class = buildGeneralSpecialDomesticClass($info['specialDomestic']);
$info['specialDomesticName'] = $class->getName(); $info['specialDomesticName'] = $class->getName();
@@ -43,13 +27,14 @@ function putInfoText(&$info, ?array $currentTargetEnv){
$session = Session::requireLogin([])->setReadOnly(); $session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $oNow = new \DateTimeImmutable();
$gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$now = $clock->nowTick();
$eventEnv = $gameStor->getValues(['npcmode', 'startyear', 'year', 'month']); $now = $oNow->format('Y-m-d H:i:s');
$npcmode = $eventEnv['npcmode'];
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$npcmode = $gameStor->getValue('npcmode');
if($npcmode!=2){ if($npcmode!=2){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
@@ -57,8 +42,7 @@ if($npcmode!=2){
]); ]);
} }
$rawGeneral = $db->queryFirstRow('SELECT no, aux FROM general WHERE `owner` = %i', $userID); $rawGeneral = $db->queryFirstRow('SELECT no, aux FROM general WHERE `owner` = %i', $userID);
$currentTargetEnv = $rawGeneral ? $eventEnv : null;
if($rawGeneral){ if($rawGeneral){
$generalAux = Json::decode($rawGeneral['aux']); $generalAux = Json::decode($rawGeneral['aux']);
if(key_exists('next_change', $generalAux)&& $generalAux['next_change'] > $now){ if(key_exists('next_change', $generalAux)&& $generalAux['next_change'] > $now){
@@ -78,7 +62,7 @@ if($tokens){
foreach($tokens as $token){ foreach($tokens as $token){
$valid_until = $token['reserved_until']; $valid_until = $token['reserved_until'];
$info = Json::decode($token['info']); $info = Json::decode($token['info']);
putInfoText($info, $currentTargetEnv); putInfoText($info);
$info['uniqueName'] = $token['unique_name']; $info['uniqueName'] = $token['unique_name'];
$pick[] = $info; $pick[] = $info;
} }
@@ -86,9 +70,7 @@ if($tokens){
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'pick'=>$pick, 'pick'=>$pick,
'validUntil'=>$clock->formatTick(Util::toInt($valid_until)), 'validUntil'=>$valid_until
'validForSeconds'=>max(0, intdiv(Util::toInt($valid_until) - $now, $clock->ticksPerSecond())),
'clockMode'=>$clock->getMode(),
]); ]);
} }
@@ -101,14 +83,12 @@ $valid_until = null;
foreach(pickGeneralFromPool($db, $rng, $userID, 14) as $pickObj){ foreach(pickGeneralFromPool($db, $rng, $userID, 14) as $pickObj){
$valid_until = $pickObj->getValidUntil(); $valid_until = $pickObj->getValidUntil();
$info = $pickObj->getInfo(); $info = $pickObj->getInfo();
putInfoText($info, $currentTargetEnv); putInfoText($info);
$pick[] = $info; $pick[] = $info;
} }
sortTokens($pick);//좀 무식하지만.. sortTokens($pick);//좀 무식하지만..
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'pick'=>$pick, 'pick'=>$pick,
'validUntil'=>$valid_until === null ? null : $clock->formatTick(Util::toInt($valid_until)), 'validUntil'=>$valid_until
'validForSeconds'=>$valid_until === null ? 0 : max(0, intdiv(Util::toInt($valid_until) - $now, $clock->ticksPerSecond())), ]);
'clockMode'=>$clock->getMode(),
]);
+2 -2
View File
@@ -211,7 +211,7 @@ try{
$show_img_level, $show_img_level,
!!$tournament_trig, !!$tournament_trig,
$join_mode, $join_mode,
TimeUtil::format(GameClock::readWallTime(), false), TimeUtil::now(),
$autorun_user $autorun_user
)); ));
} }
@@ -220,4 +220,4 @@ catch(\Exception $e){
'result'=>false, 'result'=>false,
'reason'=>$e->getMessage() 'reason'=>$e->getMessage()
]); ]);
} }
+14 -29
View File
@@ -53,17 +53,22 @@ if($fullReset){
} }
} }
$db = new \MeekroDB($host,$username,$password,$dbName,$port,'utf8mb4'); function dbConnFail($params){
$db->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
$db->addHook('run_failed', function(){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'DB 접속에 실패했습니다.' 'reason'=>'DB 접속에 실패했습니다.'
]); ]);
}); }
$mysqli_obj = $db->get();
$db = new \MeekroDB($host,$username,$password,$dbName,$port,'utf8mb4');
$db->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
$db->throw_exception_on_nonsql_error = false;
$db->nonsql_error_handler = 'dbConnFail';
$mysqli_obj = $db->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨.
$prefix = basename(__DIR__); $prefix = basename(__DIR__);
@@ -79,6 +84,8 @@ $result = Util::generateFileUsingSimpleTemplate(
], true ], true
); );
if($result !== true){ if($result !== true){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
@@ -86,29 +93,7 @@ if($result !== true){
]); ]);
} }
//최소한의 테이블 처리를 위해 수동으로 초기화하도록 하자 ResetHelper::clearDB();
if($mysqli_obj->multi_query(file_get_contents(__DIR__.'/sql/reset.sql'))){
while(true){
if (!$mysqli_obj->more_results()) {
break;
}
if(!$mysqli_obj->next_result()){
break;
}
}
}
if($mysqli_obj->multi_query(file_get_contents(__DIR__.'/sql/schema.sql'))){
while(true){
if (!$mysqli_obj->more_results()) {
break;
}
if(!$mysqli_obj->next_result()){
break;
}
}
}
ServConfig::getServerList()[$prefix]->closeServer(); ServConfig::getServerList()[$prefix]->closeServer();
+1 -9
View File
@@ -19,15 +19,7 @@ if(!prepareDir('data/file_cache')){
]); ]);
} }
$absolutePath = realpath('data/file_cache'); $storage = new \Nette\Caching\Storages\FileStorage('data/file_cache');
if(!$absolutePath){
Json::die([
'result'=>false,
'reason'=>'cache 불가'
]);
}
$storage = new \Nette\Caching\Storages\FileStorage($absolutePath);
$cache = new Cache($storage); $cache = new Cache($storage);
$serverID = UniqueConst::$serverID; $serverID = UniqueConst::$serverID;
+99 -130
View File
@@ -1,12 +1,9 @@
<?php <?php
namespace sammo; namespace sammo;
use sammo\Enums\GeneralColumn;
use sammo\Enums\GeneralLiteQueryMode; use sammo\Enums\GeneralLiteQueryMode;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\Enums\MessageType; use sammo\Enums\MessageType;
use sammo\Enums\PenaltyKey;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
@@ -24,99 +21,92 @@ $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['startyear', 'year', 'month', 'scenario', 'killturn']); $gameStor->cacheValues(['startyear','year','month','scenario']);
$me = $db->queryFirstRow('SELECT no,npc,nation,officer_level,penalty from general where owner=%i', $userID); $me = $db->queryFirstRow('SELECT no,nation,officer_level from general where owner=%i', $userID);
$myOfficerLevel = $me['officer_level']; $myOfficerLevel = $me['officer_level'];
$nationID = $me['nation']; $nationID = $me['nation'];
$myPenalty = Json::decode($me['penalty'] ?? '{}');
//수뇌가 아니면 아무것도 할 수 없음 //수뇌가 아니면 아무것도 할 수 없음
if ($myOfficerLevel < 5) { if($myOfficerLevel < 5){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '수뇌가 아닙니다.' 'reason'=>'수뇌가 아닙니다.'
]); ]);
} }
if ($action === '추방' && $destGeneralID == 0) { if($action === '추방' && $destGeneralID==0){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '장수가 지정되지 않았습니다.' 'reason'=>'장수가 지정되지 않았습니다.'
]); ]);
} }
if ($destGeneralID == 0) { if($destGeneralID==0){
$general = new DummyGeneral(true); $general = new DummyGeneral(true);
$general->setVar('nation', $nationID); $general->setVar('nation', $nationID);
} else { }
else{
$general = General::createObjFromDB($destGeneralID); $general = General::createObjFromDB($destGeneralID);
if ($general instanceof DummyGeneral) { if($general instanceof DummyGeneral){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '올바르지 않은 장수입니다.' 'reason'=>'올바르지 않은 장수입니다.'
]); ]);
} }
if ($nationID != $general->getNationID()) { if($nationID != $general->getNationID()){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '아국 장수가 아닙니다' 'reason'=>'아국 장수가 아닙니다'
]); ]);
} }
} }
if ($officerLevel == 12) { if($officerLevel == 12){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '군주를 대상으로 할 수 없습니다.' 'reason'=>'군주를 대상으로 할 수 없습니다.'
]); ]);
} }
function do수뇌임명(General $general, int $targetOfficerLevel): ?string function do수뇌임명(General $general, int $targetOfficerLevel):?string{
{
global $myPenalty;
if ($myPenalty[PenaltyKey::NoChiefChange->value] ?? false) {
return '수뇌를 임명할 수 없는 상태입니다.';
}
$generalID = $general->getID(); $generalID = $general->getID();
$nationID = $general->getNationID(); $nationID = $general->getNationID();
if($general->hasPenalty(PenaltyKey::NoChief)){
return '수뇌가 될 수 없는 상태입니다.';
}
$db = DB::db(); $db = DB::db();
[$chiefSet, $nationLevel] = $db->queryFirstList('SELECT chief_set,level FROM nation WHERE nation = %i', $nationID); [$chiefSet, $nationLevel] = $db->queryFirstList('SELECT chief_set,level FROM nation WHERE nation = %i',$nationID);
// 임명가능 레벨 // 임명가능 레벨
$lv = getNationChiefLevel($nationLevel); $lv = getNationChiefLevel($nationLevel);
if ($targetOfficerLevel < $lv) { if($targetOfficerLevel < $lv){
return '임명불가능한 관직입니다.'; return '임명불가능한 관직입니다.';
} }
if (isOfficerSet($chiefSet, $targetOfficerLevel)) { if(isOfficerSet($chiefSet, $targetOfficerLevel)){
return '지금은 임명할 수 없습니다.'; return '지금은 임명할 수 없습니다.';
} }
//기존 장수 일반으로 //기존 장수 일반으로
$db->update('general', [ $db->update('general', [
'officer_level' => 1, 'officer_level'=>1,
'officer_city' => 0, 'officer_city'=>0,
], 'nation=%i AND officer_level=%i AND no!=%i', $nationID, $targetOfficerLevel, $generalID); ], 'nation=%i AND officer_level=%i AND no!=%i', $nationID, $targetOfficerLevel, $generalID);
if ($targetOfficerLevel === 11) { if($targetOfficerLevel === 11){
} else if ($targetOfficerLevel % 2 == 0) {
if ($general->getVar('strength') < GameConst::$chiefStatMin) { }
else if($targetOfficerLevel % 2 == 0){
if($general->getVar('strength') < GameConst::$chiefStatMin){
return '무력이 부족합니다.'; return '무력이 부족합니다.';
} }
} else {
if ($general->getVar('intel') < GameConst::$chiefStatMin) { }
else{
if($general->getVar('intel') < GameConst::$chiefStatMin){
return '지력이 부족합니다.'; return '지력이 부족합니다.';
} }
} }
@@ -125,59 +115,52 @@ function do수뇌임명(General $general, int $targetOfficerLevel): ?string
$general->setVar('officer_level', $targetOfficerLevel); $general->setVar('officer_level', $targetOfficerLevel);
$general->setVar('officer_city', 0); $general->setVar('officer_city', 0);
$db->update('nation', [ $db->update('nation', [
'chief_set' => $db->sqleval('chief_set | %i', doOfficerSet(0, $targetOfficerLevel)), 'chief_set'=> $db->sqleval('chief_set | %i', doOfficerSet(0, $targetOfficerLevel)),
], 'nation=%i', $nationID); ], 'nation=%i', $nationID);
$general->applyDB($db); $general->applyDB($db);
return null; return null;
} }
function do도시임명(General $general, int $cityID, int $targetOfficerLevel): ?string function do도시임명(General $general, int $cityID, int $targetOfficerLevel):?string{
{
global $myPenalty;
$nationID = $general->getNationID(); $nationID = $general->getNationID();
$db = DB::db(); $db = DB::db();
if (CityConst::byID($cityID) === null) { if(CityConst::byID($cityID) === null){
return '올바르지 않은 도시입니다'; return '올바르지 않은 도시입니다';
} }
if ($general->getVar(GeneralColumn::officer_level) >= 4 && ($myPenalty[PenaltyKey::NoChiefChange->value] ?? false)) {
return '수뇌인 장수를 변경할 수 없는 상태입니다.';
}
$officerSet = $db->queryFirstField('SELECT officer_set FROM city WHERE nation=%i AND city=%i', $nationID, $cityID); $officerSet = $db->queryFirstField('SELECT officer_set FROM city WHERE nation=%i AND city=%i', $nationID, $cityID);
if ($officerSet === null) { if($officerSet === null){
return '아국 도시가 아닙니다'; return '아국 도시가 아닙니다';
} }
if (isOfficerSet($officerSet, $targetOfficerLevel)) { if(isOfficerSet($officerSet, $targetOfficerLevel)){
return '이미 다른 장수가 임명되어있습니다'; return '이미 다른 장수가 임명되어있습니다';
} }
//기존 장수 일반으로 //기존 장수 일반으로
$db->update('general', [ $db->update('general', [
'officer_level' => 1, 'officer_level'=>1,
'officer_city' => 0, 'officer_city'=>0,
], 'officer_level=%i AND officer_city=%i AND no!=%i', $targetOfficerLevel, $cityID, $general->getID()); ], 'officer_level=%i AND officer_city=%i AND no!=%i', $targetOfficerLevel, $cityID, $general->getID());
if ($general instanceof DummyGeneral) { if($general instanceof DummyGeneral){
return null; return null;
} }
if ($targetOfficerLevel === 4 && $general->getVar('strength') < GameConst::$chiefStatMin) { if($targetOfficerLevel === 4 && $general->getVar('strength') < GameConst::$chiefStatMin){
return '무력이 부족합니다.'; return '무력이 부족합니다.';
} }
if ($targetOfficerLevel === 3 && $general->getVar('intel') < GameConst::$chiefStatMin) { if($targetOfficerLevel === 3 && $general->getVar('intel') < GameConst::$chiefStatMin){
return '지력이 부족합니다.'; return '지력이 부족합니다.';
} }
//신임 장수 //신임 장수
$db->update('city', [ $db->update('city', [
'officer_set' => $db->sqleval('officer_set | %i', doOfficerSet(0, $targetOfficerLevel)), 'officer_set'=>$db->sqleval('officer_set | %i', doOfficerSet(0, $targetOfficerLevel)),
], 'city=%i AND nation=%i', $cityID, $nationID); ], 'city=%i AND nation=%i', $cityID, $nationID);
$general->setVar('officer_level', $targetOfficerLevel); $general->setVar('officer_level', $targetOfficerLevel);
$general->setVar('officer_city', $cityID); $general->setVar('officer_city', $cityID);
@@ -186,25 +169,22 @@ function do도시임명(General $general, int $cityID, int $targetOfficerLevel):
return null; return null;
} }
function do추방(General $general, int $myOfficerLevel): ?string function do추방(General $general, int $myOfficerLevel):?string{
{
$generalID = $general->getID(); $generalID = $general->getID();
$generalName = $general->getVar('name'); $generalName = $general->getVar('name');
$nationID = $general->getNationID(); $nationID = $general->getNationID();
if ($myPenalty[PenaltyKey::NoBanGeneral->value] ?? false) {
return '추방할 수 없는 상태입니다.';
}
//추방할사람이 외교권자이면 불가 //추방할사람이 외교권자이면 불가
$permission = checkSecretPermission($general->getRaw()); $permission = checkSecretPermission($general->getRaw());
if ($permission == 4) { if($permission == 4){
return '외교권자는 추방할 수 없습니다.'; return '외교권자는 추방할 수 없습니다.';
} }
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getValues(['startyear', 'year', 'month', 'scenario']); $env = $gameStor->getValues(['startyear','year','month','scenario']);
$nation = $db->queryFirstRow('SELECT name,chief_set,color FROM nation WHERE nation=%i', $nationID); $nation = $db->queryFirstRow('SELECT name,chief_set,color FROM nation WHERE nation=%i', $nationID);
$nationName = $nation['name']; $nationName = $nation['name'];
@@ -212,17 +192,17 @@ function do추방(General $general, int $myOfficerLevel): ?string
$logger = $general->getLogger(); $logger = $general->getLogger();
//이미 지정했다면 무시 //이미 지정했다면 무시
if (isOfficerSet($nation['chief_set'], $myOfficerLevel) || ($myOfficerLevel == 0 && $myOfficerLevel == 12)) { if(isOfficerSet($nation['chief_set'], $myOfficerLevel) || ($myOfficerLevel == 0 && $myOfficerLevel == 12)) {
return '이미 추방 권한을 사용했습니다.'; return '이미 추방 권한을 사용했습니다.';
} }
$gold = 0; $gold = 0;
$rice = 0; $rice = 0;
// 금쌀1000이상은 남김 // 금쌀1000이상은 남김
if ($general->getVar('gold') > GameConst::$defaultGold) { if($general->getVar('gold') > GameConst::$defaultGold) {
$gold = $general->getVar('gold') - GameConst::$defaultGold; $gold = $general->getVar('gold') - GameConst::$defaultGold;
$general->setVar('gold', GameConst::$defaultGold); $general->setVar('gold', GameConst::$defaultGold);
} }
if ($general->getVar('rice') > GameConst::$defaultRice) { if($general->getVar('rice') > GameConst::$defaultRice) {
$rice = $general->getVar('rice') - GameConst::$defaultRice; $rice = $general->getVar('rice') - GameConst::$defaultRice;
$general->setVar('rice', GameConst::$defaultRice); $general->setVar('rice', GameConst::$defaultRice);
} }
@@ -240,26 +220,27 @@ function do추방(General $general, int $myOfficerLevel): ?string
$logger->pushGeneralActionLog("<D><b>{$nationName}</b></>에서 <R>추방</>당했습니다.", ActionLogger::PLAIN); $logger->pushGeneralActionLog("<D><b>{$nationName}</b></>에서 <R>추방</>당했습니다.", ActionLogger::PLAIN);
// 명성/공헌 N*10%감소 // 명성/공헌 N*10%감소
if ($env['year'] <= $env['startyear'] && $general->getNPCType() < 2) { if($env['year'] <= $env['startyear'] && $general->getNPCType() < 2){
$general->setVar('makelimit', $oldMakeLimit); $general->setVar('makelimit', $oldMakeLimit);
} else { }
else{
$betrayCnt = $general->getVar('betray'); $betrayCnt = $general->getVar('betray');
$general->addExperience(-$general->getVar('experience') * 0.15 * $betrayCnt); $general->addExperience(-$general->getVar('experience')*0.15*$betrayCnt);
$general->addDedication(-$general->getVar('dedication') * 0.15 * $betrayCnt); $general->addDedication(-$general->getVar('dedication')*0.15*$betrayCnt);
$general->increaseVarWithLimit('betray', 1, null, GameConst::$maxBetrayCnt); $general->increaseVarWithLimit('betray', 1, null, GameConst::$maxBetrayCnt);
} }
//부대장일 경우 //부대장일 경우
if ($general->getVar('troop') == $generalID) { if($general->getVar('troop') == $generalID){
// 모두 탈퇴 // 모두 탈퇴
$db->update('general', [ $db->update('general', [
'troop' => 0, 'troop'=>0,
], 'troop = %i', $generalID); ], 'troop = %i', $generalID);
$db->delete('troop', 'troop_leader=%i', $generalID); $db->delete('troop', 'troop_leader=%i', $generalID);
} }
$general->setVar('troop', 0); $general->setVar('troop', 0);
if ($general->getNPCType() >= 2) { if($general->getNPCType() >= 2){
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
'BanNPC', 'BanNPC',
@@ -290,7 +271,7 @@ function do추방(General $general, int $myOfficerLevel): ?string
$src, $src,
$src, $src,
$str, $str,
Message::gameNow(), new \DateTime(),
new \DateTime('9999-12-31'), new \DateTime('9999-12-31'),
[] []
); );
@@ -298,24 +279,24 @@ function do추방(General $general, int $myOfficerLevel): ?string
} }
} }
if ($env['year'] < $env['startyear'] + 3) { if($env['year'] < $env['startyear']+3) {
//초반엔 군주 부상 증가(엔장 임관지양) //초반엔 군주 부상 증가(엔장 임관지양)
$db->update('general', [ $db->update('general', [
'injury' => $db->sqleval('least(injury + 1, %i)', 80), 'injury'=>$db->sqleval('least(injury + 1, %i)', 80),
], 'nation=%i AND officer_level=12', $nationID); ], 'nation=%i AND officer_level=12', $nationID);
$db->update('nation', [ $db->update('nation', [
'gennum' => $db->sqleval('gennum - %i', $general->getNPCType() != 5 ? 1 : 0), 'gennum'=>$db->sqleval('gennum - %i', $general->getNPCType()!=5?1:0),
'gold' => $db->sqleval('gold + %i', $gold), 'gold'=>$db->sqleval('gold + %i', $gold),
'rice' => $db->sqleval('rice + %i', $rice), 'rice'=>$db->sqleval('rice + %i', $rice),
], 'nation = %i', $nationID); ], 'nation = %i', $nationID);
} else { } else {
//이번분기는 추방불가(초반 제외) //이번분기는 추방불가(초반 제외)
$db->update('nation', [ $db->update('nation', [
'chief_set' => $db->sqleval('chief_set | %i', doOfficerSet(0, $myOfficerLevel)), 'chief_set'=>$db->sqleval('chief_set | %i', doOfficerSet(0, $myOfficerLevel)),
'gennum' => $db->sqleval('gennum - %i', $general->getNPCType() != 5 ? 1 : 0), 'gennum'=>$db->sqleval('gennum - %i', $general->getNPCType()!=5?1:0),
'gold' => $db->sqleval('gold + %i', $gold), 'gold'=>$db->sqleval('gold + %i', $gold),
'rice' => $db->sqleval('rice + %i', $rice), 'rice'=>$db->sqleval('rice + %i', $rice),
], 'nation = %i', $nationID); ], 'nation = %i', $nationID);
} }
@@ -327,74 +308,62 @@ function do추방(General $general, int $myOfficerLevel): ?string
if ($action == "임명") { if($action == "임명") {
if (2 <= $officerLevel && $officerLevel <= 4) { if(2 <= $officerLevel && $officerLevel <= 4){
if (!$destCityID) { if(!$destCityID){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '도시가 지정되지 않았습니다.' 'reason'=>'도시가 지정되지 않았습니다.'
]); ]);
} }
$result = do도시임명($general, $destCityID, $officerLevel); $result = do도시임명($general, $destCityID, $officerLevel);
if ($result !== null) { if($result !== null){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => $result 'reason'=>$result
]); ]);
} }
//수뇌의 삭턴 리필
$db->update('general', [
'killturn' => $db->sqleval('GREATEST(%b, %i)', 'killturn', $gameStor->getValue('killturn')),
], 'no=%i', $me['no']);
Json::die([ Json::die([
'result' => true, 'result'=>true,
'reason' => 'success' 'reason'=>'success'
]); ]);
} }
if (5 <= $officerLevel && $officerLevel < 12) { if(5 <= $officerLevel && $officerLevel < 12){
$result = do수뇌임명($general, $officerLevel); $result = do수뇌임명($general, $officerLevel);
if ($result !== null) { if($result !== null){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => $result 'reason'=>$result
]); ]);
} }
//수뇌의 삭턴 리필
$db->update('general', [
'killturn' => $db->sqleval('GREATEST(%b, %i)', 'killturn', $gameStor->getValue('killturn')),
], 'no=%i', $me['no']);
Json::die([ Json::die([
'result' => true, 'result'=>true,
'reason' => 'success' 'reason'=>'success'
]); ]);
} }
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '올바르지 않은 지정입니다.' 'reason'=>'올바르지 않은 지정입니다.'
]); ]);
} }
if ($action == "추방") { if($action == "추방") {
$result = do추방($general, $myOfficerLevel); $result = do추방($general, $myOfficerLevel);
if ($result !== null) { if($result !== null){
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => $result 'reason'=>$result
]); ]);
} }
//수뇌의 삭턴 리필
$db->update('general', [
'killturn' => $db->sqleval('GREATEST(%b, %i)', 'killturn', $gameStor->getValue('killturn')),
], 'no=%i', $me['no']);
Json::die([ Json::die([
'result' => true, 'result'=>true,
'reason' => 'success' 'reason'=>'success'
]); ]);
} }
Json::die([ Json::die([
'result' => false, 'result'=>false,
'reason' => '올바르지 않은 명령입니다.' 'reason'=>'올바르지 않은 명령입니다.'
]); ]);
+1 -1
View File
@@ -8,7 +8,7 @@ include('func.php');
$session = Session::requireLogin([])->setReadOnly(); $session = Session::requireLogin([])->setReadOnly();
if(Session::getInstance()->userGrade < 6){ if(Session::getInstance()->userGrade < 5){
Json::die([ Json::die([
'reason'=>'권한이 부족합니다.' 'reason'=>'권한이 부족합니다.'
]); ]);
+6 -18
View File
@@ -24,28 +24,17 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$rootDB = RootDB::db(); $rootDB = RootDB::db();
$clock = GameClock::fromStorage($gameStor); $oNow = new \DateTimeImmutable();
$now = $clock->nowTick(); $now = $oNow->format('Y-m-d H:i:s');
$member = $rootDB->queryFirstRow('SELECT `name`, `penalty` FROM member WHERE `NO`=%i', $userID); $userNick = RootDB::db()->queryFirstField('SELECT `NAME` FROM member WHERE `NO`=%i',$userID);
if(!$member){ if(!$userNick){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.' 'reason'=>'멤버 정보를 가져오지 못했습니다.'
]); ]);
} }
$userNick = $member['name'];
$memberPenalty = Json::decode($member['penalty'] ?? '{}');
$penaltyInfo = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefix()] ?? []);
$penalty = [];
foreach($penaltyInfo as $penaltyKey => $penaltyValue){
if(($penaltyValue['expire'] ?? 0) > TimeUtil::now()){
$penalty[$penaltyKey] = $penaltyValue['value'];
}
}
$pickResult = $db->queryFirstField('SELECT pick_result FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%s', $userID, $now); $pickResult = $db->queryFirstField('SELECT pick_result FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%s', $userID, $now);
if(!$pickResult){ if(!$pickResult){
Json::die([ Json::die([
@@ -97,8 +86,7 @@ $db->update('general', [
'defence_train'=>80, 'defence_train'=>80,
'permission'=>'normal', 'permission'=>'normal',
'owner'=>$userID, 'owner'=>$userID,
'aux'=>Json::encode($genAux), 'aux'=>Json::encode($genAux)
'penalty'=>Json::encode($penalty),
], 'owner <= 0 AND npc = 2 AND no = %i', $pick); ], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
$db->insertIgnore('general_access_log', [ $db->insertIgnore('general_access_log', [
GeneralAccessLogColumn::generalID->value => $pick, GeneralAccessLogColumn::generalID->value => $pick,
@@ -139,4 +127,4 @@ $rootDB->insert('member_log', [
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success' 'reason'=>'success'
]); ]);
+19 -95
View File
@@ -8,20 +8,10 @@ WebUtil::requireAJAX();
$pick = Util::getPost('pick'); $pick = Util::getPost('pick');
$leadership = Util::getPost('leadership', 'int', GameConst::$defaultStatMin); $leadership = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$isCentennialAllStar = CentennialAllStarGrowthService::isActive(); $strength = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$strength = Util::getPost( $intel = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$isCentennialAllStar ? 'strength' : 'leadership',
'int',
GameConst::$defaultStatMin
);
$intel = Util::getPost(
$isCentennialAllStar ? 'intel' : 'leadership',
'int',
GameConst::$defaultStatMin
);
$personal = Util::getPost('personal', 'string', null); $personal = Util::getPost('personal', 'string', null);
$use_own_picture = Util::getPost('use_own_picture', 'bool', false); $use_own_picture = Util::getPost('use_own_picture', 'bool', false);
$pictureSource = Util::getPost('picture_source', 'string', 'selected');
if(!$pick){ if(!$pick){
@@ -37,8 +27,8 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$rootDB = RootDB::db(); $rootDB = RootDB::db();
$clock = GameClock::fromStorage($gameStor); $oNow = new \DateTimeImmutable();
$now = $clock->nowTick(); $now = $oNow->format('Y-m-d H:i:s');
$hasGeneralID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID); $hasGeneralID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID);
if($hasGeneralID){ if($hasGeneralID){
@@ -70,39 +60,16 @@ if(!$selectInfo){
} }
$selectInfo = Json::decode($selectInfo); $selectInfo = Json::decode($selectInfo);
$ownerInfo = RootDB::db()->queryFirstRow( $ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID);
'SELECT `name`,`picture`,`imgsvr`,`grade` FROM member WHERE `NO`=%i', if(!$ownerInfo){
$userID
);
if(!$ownerInfo){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.' 'reason'=>'멤버 정보를 가져오지 못했습니다.'
]); ]);
} }
if ($isCentennialAllStar) {
if (!in_array($pictureSource, ['selected', 'own'], true)) {
Json::die([ $gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
'result' => false,
'reason' => '올바르지 않은 전콘 선택입니다.',
]);
}
if ($pictureSource === 'own') {
$canUseOwnPicture = in_array('picture', GameConst::$generalPoolAllowOption, true)
&& $env['show_img_level'] >= 1
&& $ownerInfo['grade'] >= 1
&& $ownerInfo['picture'] !== '';
if (!$canUseOwnPicture) {
Json::die([
'result' => false,
'reason' => '사용할 수 있는 내 전콘이 없습니다.',
]);
}
}
}
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
if ($gencount >= $maxgeneral) { if ($gencount >= $maxgeneral) {
Json::die([ Json::die([
@@ -113,25 +80,12 @@ if ($gencount >= $maxgeneral) {
$poolClass = getGeneralPoolClass(GameConst::$targetGeneralPool); $poolClass = getGeneralPoolClass(GameConst::$targetGeneralPool);
/** @var AbsGeneralPool */ /** @var AbsGeneralPool */
if ($isCentennialAllStar) { $pickedGeneral = new $poolClass($db, $selectInfo, $now);
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'selectPickedGeneral',
$userID,
$pick
)));
$pickedGeneral = new $poolClass($db, $rng, $selectInfo, $now);
} else {
$pickedGeneral = new $poolClass($db, $selectInfo, $now);
}
$builder = $pickedGeneral->getGeneralBuilder(); $builder = $pickedGeneral->getGeneralBuilder();
if ($isCentennialAllStar) {
CentennialAllStarGrowthService::prepareInitialUser($builder, $selectInfo);
}
foreach(GameConst::$generalPoolAllowOption as $allowOption){ foreach(GameConst::$generalPoolAllowOption as $allowOption){
if($allowOption == 'stat' && !$isCentennialAllStar){ if($allowOption == 'stat'){
$leadership = Util::valueFit($leadership, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $leadership = Util::valueFit($leadership, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$strength = Util::valueFit($strength, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $strength = Util::valueFit($strength, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$intel = Util::valueFit($intel, GameConst::$defaultStatMin, GameConst::$defaultStatMax); $intel = Util::valueFit($intel, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
@@ -144,23 +98,14 @@ foreach(GameConst::$generalPoolAllowOption as $allowOption){
} }
$builder->setStat($leadership, $strength, $intel); $builder->setStat($leadership, $strength, $intel);
} }
else if( else if($allowOption == 'picture' && $use_own_picture){
$allowOption == 'picture' $builder->setPicture($ownerInfo['imgsvr'], $ownerInfo['picture']);
&& (
(!$isCentennialAllStar && $use_own_picture)
|| ($isCentennialAllStar && $pictureSource === 'own')
)
){
$builder->setPicture($ownerInfo['imgsvr'], $ownerInfo['picture']);
} }
else if($allowOption == 'ego'){ else if($allowOption == 'ego'){
if(!$personal || $personal == 'Random'){ if(!$personal || $personal == 'Random'){
$personal = Util::choiceRandom(GameConst::$availablePersonality); $personal = Util::choiceRandom(GameConst::$availablePersonality);
} }
$invalidPersonal = $isCentennialAllStar if(!array_search($personal, GameConst::$availablePersonality)){
? !in_array($personal, GameConst::$availablePersonality, true)
: !array_search($personal, GameConst::$availablePersonality);
if($invalidPersonal){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'올바르지 않은 성격입니다.' 'reason'=>'올바르지 않은 성격입니다.'
@@ -168,7 +113,7 @@ foreach(GameConst::$generalPoolAllowOption as $allowOption){
} }
$builder->setEgo($personal); $builder->setEgo($personal);
} }
} }
$userNick = $ownerInfo['name']; $userNick = $ownerInfo['name'];
@@ -176,29 +121,8 @@ $builder->setOwner($userID);
$builder->setOwnerName($userNick); $builder->setOwnerName($userNick);
$builder->setKillturn(5); $builder->setKillturn(5);
$builder->setNPCType(0); $builder->setNPCType(0);
$builder->setAuxVar('next_change', $now + GameClock::TICKS_PER_TURN * 12); $builder->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $env['turnterm']));
$builder->setAuxVar(
'prestart_delete_after',
addTurn($now, $env['turnterm'], GameConst::$minTurnDieOnPrestart)
);
$builder->fillRemainSpecAsZero($env); $builder->fillRemainSpecAsZero($env);
if ($isCentennialAllStar) {
$candidateCities = $db->queryFirstColumn(
'SELECT city FROM city WHERE level >= 5 AND level <= 6 AND nation = 0'
);
if (!$candidateCities) {
$candidateCities = $db->queryFirstColumn(
'SELECT city FROM city WHERE level >= 5 AND level <= 6'
);
}
if (!$candidateCities) {
Json::die([
'result' => false,
'reason' => '장수를 생성할 소·중성이 없습니다.',
]);
}
$builder->setCityID($rng->choice($candidateCities));
}
$builder->build($env); $builder->build($env);
$generalID = $builder->getGeneralID(); $generalID = $builder->getGeneralID();
if(!$generalID){ if(!$generalID){
@@ -243,4 +167,4 @@ $rootDB->insert('member_log', [
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success' 'reason'=>'success'
]); ]);
+2 -5
View File
@@ -19,7 +19,6 @@ if(!class_exists('\\sammo\\DB')){
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
if(file_exists(__DIR__.'/.htaccess')){ if(file_exists(__DIR__.'/.htaccess')){
$reserved = $db->queryFirstRow( $reserved = $db->queryFirstRow(
@@ -76,10 +75,8 @@ $admin['maxUserCnt'] = $admin['maxgeneral'];
$admin['npcMode'] = $admin['npcmode']; $admin['npcMode'] = $admin['npcmode'];
$admin['turnTerm'] = $admin['turnterm']; $admin['turnTerm'] = $admin['turnterm'];
$admin['isUnited'] = $admin['isunited']; $admin['isUnited'] = $admin['isunited'];
$admin['isOpen'] = $clock->nowTick() >= Util::toInt($admin['opentime']);
$admin['opentime'] = $clock->formatTick(Util::toInt($admin['opentime']));
$admin['starttime'] = substr($admin['opentime'], 5, 11); $admin['starttime'] = substr($admin['opentime'], 5, 11);
$admin['turntime'] = substr($clock->formatTick(Util::toInt($admin['turntime'])), 5, 11); $admin['turntime'] = substr($admin['turntime'], 5, 11);
unset($admin['npcmode']); unset($admin['npcmode']);
unset($admin['maxgeneral']); unset($admin['maxgeneral']);
unset($admin['turnterm']); unset($admin['turnterm']);
@@ -134,4 +131,4 @@ if($general){
Json::die([ Json::die([
'game'=>$admin, 'game'=>$admin,
'me'=>$me?:null 'me'=>$me?:null
]); ]);
+15 -37
View File
@@ -1,5 +1,4 @@
<?php <?php
namespace sammo; namespace sammo;
include "lib.php"; include "lib.php";
@@ -25,13 +24,14 @@ if ($defence_train <= 40) {
$defence_train = 40; $defence_train = 40;
} }
if ($defence_train <= 90) { if($defence_train <= 90){
$defence_train = Util::round($defence_train, -1); $defence_train = Util::round($defence_train, -1);
} else { }
else{
$defence_train = 999; $defence_train = 999;
} }
if ($tnmt < 0 || $tnmt > 1) { if($tnmt < 0 || $tnmt > 1){
$tnmt = 1; $tnmt = 1;
} }
@@ -39,8 +39,8 @@ $db = DB::db();
$me = General::createObjFromDB($generalID); $me = General::createObjFromDB($generalID);
if ($defence_train !== $me->getVar('defence_train')) { if($defence_train !== $me->getVar('defence_train')){
if ($defence_train == 999) { if($defence_train == 999){
$me->increaseVar('myset', -1); $me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train); $me->setVar('defence_train', $defence_train);
$affectedTrain = -3; $affectedTrain = -3;
@@ -49,7 +49,8 @@ if ($defence_train !== $me->getVar('defence_train')) {
$affectedAtmos = $me->onCalcDomestic('changeDefenceTrain', "atmos{$defence_train}", $affectedAtmos); $affectedAtmos = $me->onCalcDomestic('changeDefenceTrain', "atmos{$defence_train}", $affectedAtmos);
$me->increaseVarWithLimit('train', $affectedTrain, 20, GameConst::$maxTrainByWar); $me->increaseVarWithLimit('train', $affectedTrain, 20, GameConst::$maxTrainByWar);
$me->increaseVarWithLimit('atmos', $affectedAtmos, 20, GameConst::$maxAtmosByWar); $me->increaseVarWithLimit('atmos', $affectedAtmos, 20, GameConst::$maxAtmosByWar);
} else { }
else{
$me->increaseVar('myset', -1); $me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train); $me->setVar('defence_train', $defence_train);
} }
@@ -59,44 +60,21 @@ $me->setAuxVar('use_treatment', Util::valueFit($use_treatment, 10, 100));
$me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn); $me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn);
$me->setVar('tnmt', $tnmt); $me->setVar('tnmt', $tnmt);
if ($me->getNPCType() == 1 && $detachNPC) { if($me->getNPCType() == 1 && $detachNPC){
$turnterm = $gameStor->turnterm; $turnterm = $gameStor->turnterm;
if ($turnterm < 10) { if($turnterm < 10){
$targetKillTurn = 30 / $turnterm; $targetKillTurn = 30 / $turnterm;
} else { }
else{
$targetKillTurn = 60 / $turnterm; $targetKillTurn = 60 / $turnterm;
} }
$me->setVar('killturn', $targetKillTurn); $me->setVar('killturn', $targetKillTurn);
} }
$rootDB = RootDB::db();
//회원 테이블에서 정보확인
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr, `penalty` FROM member WHERE no=%i', $userID);
if (!$member) {
//이런 경우가 있나?
//TODO: 로그 남겨둘 것
Json::die([
'result' => false,
'reason' => '회원 정보를 찾을 수 없습니다.'
]);
}
$memberPenalty = Json::decode($member['penalty'] ?? "{}");
$penaltyInfo = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefix()] ?? []);
$penalty = [];
foreach ($penaltyInfo as $penaltyKey => $penaltyValue) {
if (($penaltyValue['expire'] ?? 0) > TimeUtil::now()) {
$penalty[$penaltyKey] = $penaltyValue['value'];
}
}
$me->setVar('penalty', Json::encode($penalty));
$me->applyDB($db); $me->applyDB($db);
Json::die([ Json::die([
'result' => true, 'result'=>true,
'reason' => 'success' 'reason'=>'success'
]); ]);
+3 -6
View File
@@ -64,7 +64,6 @@ if ($permission < 3) {
function applyNationPolicy($policy, $nationID, $generalName): ?string function applyNationPolicy($policy, $nationID, $generalName): ?string
{ {
$db = DB::db(); $db = DB::db();
$gameNow = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow();
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$defaultPolicy = AutorunNationPolicy::$defaultPolicy; $defaultPolicy = AutorunNationPolicy::$defaultPolicy;
@@ -140,7 +139,7 @@ function applyNationPolicy($policy, $nationID, $generalName): ?string
$nationPolicyRoot['values'] = $nationPolicy; $nationPolicyRoot['values'] = $nationPolicy;
$nationPolicyRoot['valueSetter'] = $generalName; $nationPolicyRoot['valueSetter'] = $generalName;
$nationPolicyRoot['valueSetTime'] = $gameNow; $nationPolicyRoot['valueSetTime'] = TimeUtil::now();
$nationStor->npc_nation_policy = $nationPolicyRoot; $nationStor->npc_nation_policy = $nationPolicyRoot;
return null; return null;
} }
@@ -148,7 +147,6 @@ function applyNationPolicy($policy, $nationID, $generalName): ?string
function applyNationPriority($priority, $nationID, $generalName): ?string function applyNationPriority($priority, $nationID, $generalName): ?string
{ {
$db = DB::db(); $db = DB::db();
$gameNow = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow();
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationPolicyRoot = $nationStor->npc_nation_policy; $nationPolicyRoot = $nationStor->npc_nation_policy;
@@ -160,7 +158,7 @@ function applyNationPriority($priority, $nationID, $generalName): ?string
} }
$nationPolicyRoot['priority'] = $priority; $nationPolicyRoot['priority'] = $priority;
$nationPolicyRoot['prioritySetter'] = $generalName; $nationPolicyRoot['prioritySetter'] = $generalName;
$nationPolicyRoot['prioritySetTime'] = $gameNow; $nationPolicyRoot['prioritySetTime'] = TimeUtil::now();
$nationStor->npc_nation_policy = $nationPolicyRoot; $nationStor->npc_nation_policy = $nationPolicyRoot;
return null; return null;
} }
@@ -168,7 +166,6 @@ function applyNationPriority($priority, $nationID, $generalName): ?string
function applyGeneralPriority($priority, $nationID, $generalName): ?string function applyGeneralPriority($priority, $nationID, $generalName): ?string
{ {
$db = DB::db(); $db = DB::db();
$gameNow = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow();
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$generalPolicyRoot = $nationStor->npc_general_policy; $generalPolicyRoot = $nationStor->npc_general_policy;
@@ -209,7 +206,7 @@ function applyGeneralPriority($priority, $nationID, $generalName): ?string
$generalPolicyRoot['priority'] = $priority; $generalPolicyRoot['priority'] = $priority;
$generalPolicyRoot['prioritySetter'] = $generalName; $generalPolicyRoot['prioritySetter'] = $generalName;
$generalPolicyRoot['prioritySetTime'] = $gameNow; $generalPolicyRoot['prioritySetTime'] = TimeUtil::now();
$nationStor->npc_general_policy = $generalPolicyRoot; $nationStor->npc_general_policy = $generalPolicyRoot;
return null; return null;
} }
+1 -2
View File
@@ -77,8 +77,7 @@ $month = $query['month'];
$repeatCnt = $query['repeatCnt']; $repeatCnt = $query['repeatCnt'];
$rawAttacker = $query['attackerGeneral']; $rawAttacker = $query['attackerGeneral'];
$battleClock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env')); $rawAttacker['turntime'] = TimeUtil::now();
$rawAttacker['turntime'] = $battleClock->formatTick($battleClock->nowTick());
$rawAttackerCity = $query['attackerCity']; $rawAttackerCity = $query['attackerCity'];
$rawAttackerNation = $query['attackerNation']; $rawAttackerNation = $query['attackerNation'];
+28 -80
View File
@@ -7,7 +7,6 @@ include "func.php";
WebUtil::requireAJAX(); WebUtil::requireAJAX();
$pick = Util::getPost('pick'); $pick = Util::getPost('pick');
$pictureSource = Util::getPost('picture_source', 'string', 'selected');
if(!$pick){ if(!$pick){
Json::die([ Json::die([
@@ -22,8 +21,8 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$rootDB = RootDB::db(); $rootDB = RootDB::db();
$clock = GameClock::fromStorage($gameStor); $oNow = new \DateTimeImmutable();
$now = $clock->nowTick(); $now = $oNow->format('Y-m-d H:i:s');
$generalID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID); $generalID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID);
if(!$generalID){ if(!$generalID){
@@ -36,20 +35,10 @@ if(!$generalID){
list( list(
$year, $year,
$month, $month,
$startYear,
$maxgeneral, $maxgeneral,
$npcmode, $npcmode,
$turnterm, $turnterm
$showImgLevel ) = $gameStor->getValuesAsArray(['year', 'month', 'maxgeneral', 'npcmode', 'turnterm']);
) = $gameStor->getValuesAsArray([
'year',
'month',
'startyear',
'maxgeneral',
'npcmode',
'turnterm',
'show_img_level',
]);
if($npcmode!=2){ if($npcmode!=2){
Json::die([ Json::die([
@@ -66,10 +55,7 @@ if(!$info){
]); ]);
} }
$ownerInfo = RootDB::db()->queryFirstRow( $ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID);
'SELECT `name`,`picture`,`imgsvr`,`grade` FROM member WHERE `NO`=%i',
$userID
);
if(!$ownerInfo){ if(!$ownerInfo){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
@@ -78,27 +64,6 @@ if(!$ownerInfo){
} }
$info = Json::decode($info); $info = Json::decode($info);
$isCentennialAllStar = CentennialAllStarGrowthService::isActive();
if ($isCentennialAllStar) {
if (!in_array($pictureSource, ['current', 'own', 'selected'], true)) {
Json::die([
'result' => false,
'reason' => '올바르지 않은 전콘 선택입니다.',
]);
}
if ($pictureSource === 'own') {
$canUseOwnPicture = in_array('picture', GameConst::$generalPoolAllowOption, true)
&& $showImgLevel >= 1
&& $ownerInfo['grade'] >= 1
&& $ownerInfo['picture'] !== '';
if (!$canUseOwnPicture) {
Json::die([
'result' => false,
'reason' => '사용할 수 있는 내 전콘이 없습니다.',
]);
}
}
}
$generalObj = General::createObjFromDB($generalID); $generalObj = General::createObjFromDB($generalID);
@@ -136,52 +101,35 @@ $db->update('select_pool',[
'reserved_until'=>null, 'reserved_until'=>null,
], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now); ], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now);
if ($isCentennialAllStar) { if(key_exists('leadership', $info)){
CentennialAllStarGrowthService::prepareLegacyUserReselection($generalObj); $generalObj->updateVar('leadership', $info['leadership']);
CentennialAllStarGrowthService::applyTarget($generalObj, $info, [ $generalObj->updateVar('strength', $info['strength']);
'startyear' => $startYear, $generalObj->updateVar('intel', $info['intel']);
'year' => $year,
'month' => $month,
]);
} else {
if(key_exists('leadership', $info)){
$generalObj->updateVar('leadership', $info['leadership']);
$generalObj->updateVar('strength', $info['strength']);
$generalObj->updateVar('intel', $info['intel']);
}
if(key_exists('dex', $info)){
$generalObj->updateVar('dex1', $info['dex'][0]);
$generalObj->updateVar('dex2', $info['dex'][1]);
$generalObj->updateVar('dex3', $info['dex'][2]);
$generalObj->updateVar('dex4', $info['dex'][3]);
$generalObj->updateVar('dex5', $info['dex'][4]);
}
if(key_exists('ego', $info)){
$generalObj->updateVar('personal', $info['ego']);
}
if(key_exists('specialDomestic', $info)){
$generalObj->updateVar('special', $info['specialDomestic']);
}
if(key_exists('specialWar', $info)){
$generalObj->updateVar('special2', $info['specialWar']);
}
} }
if ($isCentennialAllStar) { if(key_exists('picture', $info)){
if ($pictureSource === 'own') {
$generalObj->updateVar('imgsvr', $ownerInfo['imgsvr']);
$generalObj->updateVar('picture', $ownerInfo['picture']);
} elseif ($pictureSource === 'selected' && key_exists('picture', $info)) {
$generalObj->updateVar('imgsvr', $info['imgsvr']);
$generalObj->updateVar('picture', $info['picture']);
}
} elseif(key_exists('picture', $info)){
$generalObj->updateVar('imgsvr', $info['imgsvr']); $generalObj->updateVar('imgsvr', $info['imgsvr']);
$generalObj->updateVar('picture', $info['picture']); $generalObj->updateVar('picture', $info['picture']);
} }
if(key_exists('generalName', $info)){ if(key_exists('generalName', $info)){
$generalObj->updateVar('name', $info['generalName']); $generalObj->updateVar('name', $info['generalName']);
} }
$generalObj->setAuxVar('next_change', $now + GameClock::TICKS_PER_TURN * 12); if(key_exists('dex', $info)){
$generalObj->updateVar('dex1', $info['dex'][0]);
$generalObj->updateVar('dex2', $info['dex'][1]);
$generalObj->updateVar('dex3', $info['dex'][2]);
$generalObj->updateVar('dex4', $info['dex'][3]);
$generalObj->updateVar('dex5', $info['dex'][4]);
}
if(key_exists('ego', $info)){
$generalObj->updateVar('personal', $info['ego']);
}
if(key_exists('specialDomestic', $info)){
$generalObj->updateVar('special', $info['specialDomestic']);
}
if(key_exists('specialWar', $info)){
$generalObj->updateVar('special2', $info['specialWar']);
}
$generalObj->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $turnterm));
$userNick = $ownerInfo['name']; $userNick = $ownerInfo['name'];
$generalObj->setVar('owner_name', $userNick); $generalObj->setVar('owner_name', $userNick);
@@ -200,4 +148,4 @@ $generalObj->applyDB($db);
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'success' 'reason'=>'success'
]); ]);
+2 -3
View File
@@ -51,9 +51,8 @@ function MessageBox($str)
function LogText($prefix, $variable) function LogText($prefix, $variable)
{ {
return; $text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable));
//$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable)); file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
//file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
} }
function prepareDir(string $dirPath, bool $forceCreate=true):bool{ function prepareDir(string $dirPath, bool $forceCreate=true):bool{
+430
View File
@@ -0,0 +1,430 @@
<?php
namespace sammo;
use sammo\DTO\VoteInfo;
use sammo\Enums\GeneralQueryMode;
include "lib.php";
include "func.php";
$session = Session::requireLogin()->loginGame()->setReadOnly();
$userID = Session::getUserID();
increaseRefresh("메인", 1);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if (!$userID) {
header('Location:..');
die();
}
//턴 실행.
TurnExecutionHelper::executeAllCommand();
if (!$session->isGameLoggedIn()) {
header('Location:..');
die();
}
$me = $db->queryFirstRow(
'SELECT no,refresh_score,turntime,newmsg,newvote,`officer_level` FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i',
$userID
);
//그새 사망이면
if ($me === null) {
$session->logoutGame();
header('Location: ../');
die();
}
$gameStor->cacheAll(true);
if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
$db->update('general', [
'newmsg' => 0,
'newvote' => 0
], 'owner=%i', $userID);
}
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
$generalObj = General::createObjFromDB($me['no'], null, GeneralQueryMode::FullWithAccessLog);
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
$scenario = $gameStor->scenario_text;
$nationID = $generalObj->getNationID();
if ($nationID) {
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheAll();
}
if ($gameStor->extended_general == 0) {
$extend = "표준";
} else {
$extend = "확장";
}
if ($gameStor->fiction == 0) {
$fiction = "사실";
} else {
$fiction = "가상";
}
if ($gameStor->npcmode == 0) {
$npcmode = "불가능";
} else if ($gameStor->npcmode == 1) {
$npcmode = "가능";
} else {
$npcmode = "선택 생성";
}
$color = "cyan";
$serverName = UniqueConst::$serverName;
$serverCnt = $gameStor->server_cnt;
$auctionCount = $db->queryFirstField('SELECT count(*) FROM ng_auction WHERE finished = 0');
$isTournamentActive = $gameStor->tournament > 0;
$isTournamentApplicationOpen = $gameStor->tournament == 1;
$isBettingActive = $gameStor->tournament == 6;
$myNationStatic = getNationStaticInfo($generalObj->getNationID());
$nationColorType = substr($myNationStatic['color'] ?? '#000000', 1);
$autorunUser = ($gameStor->autorun_user) ?? [];
$otherTextInfo = [];
if ($gameStor->join_mode == 'onlyRandom') {
$otherTextInfo[] = '랜덤 임관 전용';
}
if ($autorunUser['limit_minutes'] ?? false) {
$otherTextInfo[] = getAutorunInfo($autorunUser);
}
if (!$otherTextInfo) {
$otherTextInfo = '표준';
} else {
$otherTextInfo = join(', ', $otherTextInfo);
}
$lastVoteID = $gameStor->lastVote;
$lastVote = null;
if ($lastVoteID) {
$voteStor = KVStorage::getStorage($db, 'vote');
$lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}"));
if ($lastVote->endDate && $lastVote->endDate < TimeUtil::now()) {
$lastVote = null;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?= $serverName ?>: 메인</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printJS('d_shared/base_map.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('vue', 'v_main', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printStaticValues([
//deprecated, staticValues를 이용할 것
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'serverNow' => TimeUtil::now(false),
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive,
'staticValues' => [
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'serverNow' => TimeUtil::now(false),
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive,
'mapName' => GameConst::$mapName,
'unitSet' => GameConst::$unitSet,
]
]) ?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
</head>
<body class="img_back sam-color-<?= $nationColorType ?>">
<div id="container" class="bg0">
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></button></div>
</div>
<div class="tb_layout row gx-0">
<div id="server_title" class="row py-2 center">
<h3>삼국지 모의전투 HiDCHe <?= $serverName . $serverCnt ?>기 <span class="avoid-wrap">(<font color=cyan><?= $scenario ?></font>)</span></h3>
</div>
<div class="row center gx-0">
<div class="s-border-t col py-2 col-8 col-lg-4" style="color:<?= $color ?>;">
<?= $scenario ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
NPC선택 : <?= $npcmode ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
기타 설정: <?= $otherTextInfo ?>
</div>
<div class="s-border-t col py-2 col-8 col-lg-4"><?= info(2) ?></div>
<div class="s-border-t col py-2 col-4 col-lg-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
<div class="s-border-t col py-2 col-4 col-lg-2">턴당 갱신횟수 : <?= $gameStor->refreshLimit ?>회</div>
<div class="s-border-t col py-2 col-8 col-lg-4"><?= info(3) ?></div>
<div class="s-border-t py-2 col col-6 col-lg-4">
<?php if ($isTournamentActive) : ?>
↑<span style='color:cyan'><?= (['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
<?php else : ?>
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-lg-2">
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
</div>
<div class="s-border-t py-2 col col-6 col-lg-2">
<?php if ($auctionCount > 0) : ?>
<span style='color:cyan'><?= $auctionCount ?>건</span> 거래 진행중
<?php else : ?>
<span style='color:magenta'>진행중 거래 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-lg-4 vote-cell">
<?php
?>
<?php if ($lastVote === null) : ?>
<span style='color:magenta'>진행중 설문 없음</span>
<?php else : ?>
<span style='color:cyan'>설문 진행중</span> : <span><?= $lastVote->title ?></span>
<?php endif; ?>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">접속중인 국가: <?= $gameStor->online_nation ?></div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">운영자 메세지 : <span style='color:yellow;'><?= $gameStor->msg ?></span></div>
</div>
<div class="row gx-0">
<div class="col s-border-t py-2" id="nation-msg-position">
<div class="px-2">【 국가방침 】</div>
<div id='nation-msg-box'>
<div id='nation-msg'><?= nationMsg($generalObj) ?></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">
【 접속자 】<?= onlinegen($generalObj) ?>
</div>
</div>
<?php if ($session->userGrade >= 5) : ?>
<div class="row">
<div class="col">
<a href='_admin1.php' target='_blank'><button type='button'>게임관리</button></a>
<a href='_admin2.php' target='_blank'><button type='button'>회원관리</button></a>
<a href='_admin4.php' target='_blank'><button type='button'>멀티관리</button></a>
<a href='_admin5.php' target='_blank'><button type='button'>일제정보</button></a>
<a href='_admin7.php' target='_blank'><button type='button'>로그정보</button></a>
<a href='_admin8.php' target='_blank'><button type='button'>외교정보</button></a>
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php elseif ($session->userGrade == 4) : ?>
<div class="row">
<div class="col">
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php endif; ?>
<div id="map_view" class="gx-0">
<div id="mapZone" class="view-item"><?= getMapHtml() ?></div>
<div class="view-item" id="reservedCommandZone">
<div id="reservedCommandList"></div>
<div id="actionMiniPlate" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-8 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
</div>
<div id="cityInfo" class="view-item" style="border:none;text-align:center;"><?= cityInfo($generalObj) ?></div>
<div id="nation-position"><?php myNationInfo($generalObj); ?></div>
<div id="general-position"><?php generalInfo($generalObj); ?></div>
<div id="generalCommandButton" class="row gx-0">
<div class="buttonPlate bg2">
?></div>
</div>
</div>
</div>
<div id="actionMiniPlateSub" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-3 d-grid"><button type='button' class="btn btn-dark" onclick="scrollHardTo('reservedCommandList')">명령으로</button></div>
<div class="col-5 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col-lg-6" id="general_public_record-position">
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
</div>
<div class="col-lg-6" id="general_log-position">
<div class="bg1 center s-border-tb"><b>개인 기록</b></div>
<div id="general_log" style="text-align:left;"><?= formatHistoryToHTML(getGeneralActionLogRecent($me['no'], 15)) ?></div>
</div>
<div class="col-12" id="world_history-position">
<div class="bg1 center s-border-tb"><b>중원 정세</b></div>
<div id="world_history" colspan=2 style="text-align:left;"><?= formatHistoryToHTML(getGlobalHistoryLogRecent(15)) ?></div>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div>
<div id="message_board" class="row gx-0">
<div class="message_input_form bg0 gx-0 row">
<div id="mailbox_list-col" class="col-6 col-lg-2 d-grid">
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
</select>
</div>
<div id="msg_input-col" class="col-12 col-lg-8 d-grid">
<input type="text" id="msg_input" maxlength="99" class="form-control">
</div>
<div id="msg_submit-col" class="col-6 col-lg-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&amp;갱신</button></div>
</div>
<div class="col-lg-6 board_side bg0"><a id="public_talk_position"></a>
<div class="board_header bg0">전체 메시지(최고99자)</div>
<section class="public_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="national_talk_position"></a>
<div class="board_header bg0">국가 메시지(최고99자)</div>
<section class="national_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="private_talk_position"></a>
<div class="board_header bg0">개인 메시지(최고99자)</div>
<section class="private_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="diplomacy_talk_position"></a>
<div class="board_header bg0">외교 메시지(최고99자)</div>
<section class="diplomacy_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
</section>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div><?= banner() ?>
</div>
</div>
<?php
if ($limitState == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
}
if ($me['newmsg'] == 1) {
MessageBox("새로운 서신이 도착했습니다!");
}
if ($me['newvote'] == 1) {
$develcost = $gameStor->develcost * 5;
MessageBox("설문조사에 참여하시면 금{$develcost}과 유니크템을 드립니다! (우측 상단 설문조사 메뉴)");
}
?>
</div>
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-lg-none p-0" id="navbar500">
<div class="container-fluid px-0">
<div class="collapse navbar-collapse">
<ul class="navbar-nav me-auto mx-auto">
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-sammo-base2" id="navbarGlobal" role="button" data-bs-toggle="dropdown" aria-expanded="false">
외부 메뉴
</div>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="navbarGlobal" id="navbarGlobalItems">
<?= allButton($gameStor->npcmode == 1, ['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item']) ?>
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle btn btn-sammo-nation" id="navbarNation" role="button" data-bs-toggle="dropdown" aria-expanded="false">
국가 메뉴
</div>
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-dark" id="navbarQuick" role="button" data-bs-toggle="dropdown" aria-expanded="false">
빠른 이동
</div>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown" id="navbarQuickItems">
<li><a class="dropdown-item disabled">국가 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('nation-msg-position')" class="dropdown-item">방침</button></li>
<li><button type="button" onclick="scrollHardTo('reservedCommandList')" class="dropdown-item">명령</button></li>
<li><button type="button" onclick="scrollHardTo('nation-position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('general-position')" class="dropdown-item">장수</button></li>
<li><button type="button" onclick="scrollHardTo('cityInfo')" class="dropdown-item">도시</button></li>
<li><a class="dropdown-item disabled">동향 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('mapZone')" class="dropdown-item">지도</button></li>
<li><button type="button" onclick="scrollHardTo('general_public_record-position')" class="dropdown-item">동향</button></li>
<li><button type="button" onclick="scrollHardTo('general_log-position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('world_history-position')" class="dropdown-item">정세</button></li>
<li><span>&nbsp;</span></li>
<li><a class="dropdown-item disabled">메시지</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('public_talk_position')" class="dropdown-item">전체</button></li>
<li><button type="button" onclick="scrollHardTo('national_talk_position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('private_talk_position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('diplomacy_talk_position')" class="dropdown-item">외교</button></li>
<li><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></li>
</ul>
</li>
<li class="nav-item">
<a class="refreshPage btn btn-sammo-base2 text-white" role="button">갱신</a>
</li>
</ul>
</div>
</div>
</nav>
</body>
</html>
+1 -11
View File
@@ -8,14 +8,4 @@ $session = Session::getInstance()->setReadOnly();
$db = DB::db(); $db = DB::db();
$updated = false; TurnExecutionHelper::executeAllCommand();
$locked = false;
$lastExecuted = TurnExecutionHelper::executeAllCommand($updated, $locked);
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
Json::die([
'result' => true,
'updated' => $updated,
'locked' => $locked,
'lastExecutedTick' => $lastExecuted,
'lastExecuted' => $clock->formatTick($lastExecuted, true),
]);
+14 -14
View File
@@ -222,7 +222,10 @@ function extractBattleOrder(WarUnit $defender, WarUnit $attacker)
$totalStat = ($realStat + $fullStat) / 2; $totalStat = ($realStat + $fullStat) / 2;
$totalCrew = $general->getVar('crew') / 1000000 * (($general->getVar('train') * $general->getVar('atmos')) ** 1.5); $totalCrew = $general->getVar('crew') / 1000000 * (($general->getVar('train') * $general->getVar('atmos')) ** 1.5);
return $totalStat + $totalCrew / 100; $value = $totalStat + $totalCrew / 100;
$value = $general->onCalcStat($general, 'battleOrder', $value, ['attacker' => $attacker->getGeneral()]);
$value = $attacker->getGeneral()->onCalcOpposeStat($general, 'battleOrder', $value, ['attacker' => $attacker->getGeneral()]);
return $value;
} }
function processWar_NG( function processWar_NG(
@@ -526,7 +529,7 @@ function DeleteConflict($nation)
function getConquerNation($city): int function getConquerNation($city): int
{ {
$conflict = Json::decode($city['conflict']); $conflict = Json::decode($city['conflict']);
return array_key_first($conflict); return Util::array_first_key($conflict);
} }
function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList) function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList)
@@ -718,17 +721,14 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
$attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} 긴급천도하였습니다."); $attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} 긴급천도하였습니다.");
$moveLog = "수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} <M>긴급천도</>합니다."; $moveLog = "수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} <M>긴급천도</>합니다.";
foreach ($db->queryAllLists( //아국 수뇌부에게 로그 전달
'SELECT no, officer_level FROM general WHERE nation=%i', foreach ($db->queryFirstColumn(
'SELECT no FROM general WHERE nation=%i AND officer_level>=5',
$defenderNationID $defenderNationID
) as [$defenderGeneralID, $defenderGeneralChiefLevel]) { ) as $defenderChiefID) {
$defenderLogger = new ActionLogger($defenderGeneralID, $defenderNationID, $year, $month); $chiefLogger = new ActionLogger($defenderChiefID, $defenderNationID, $year, $month);
$defenderLogger->pushGeneralActionLog($moveLog, ActionLogger::PLAIN); $chiefLogger->pushGeneralActionLog($moveLog, ActionLogger::PLAIN);
if($defenderGeneralChiefLevel >= 5){ $chiefLogger->flush();
$defenderLogger->pushGeneralActionLog("수뇌는 <G><b>{$minCityName}</b></>{$josaRo} 집합되었습니다.");
}
$defenderLogger->flush();
} }
//천도 //천도
@@ -785,8 +785,8 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
'officer_set' => 0, 'officer_set' => 0,
]; ];
if ($city['level'] > 3) { if ($city['level'] > 3) {
$query['def'] = GameConst::$defaultCityWall; $query['def'] = 1000;
$query['wall'] = GameConst::$defaultCityWall; $query['wall'] = 1000;
} else { } else {
$query['def'] = $db->sqleval('def_max/2'); $query['def'] = $db->sqleval('def_max/2');
$query['wall'] = $db->sqleval('wall_max/2'); $query['wall'] = $db->sqleval('wall_max/2');
+2 -2
View File
@@ -21,7 +21,7 @@ class BidUniqueAuction extends \sammo\BaseAPI
]) ])
->rule('int', 'amount') ->rule('int', 'amount')
->rule('int', 'auctionID') ->rule('int', 'auctionID')
->rule('boolean', 'extendCloseTick'); ->rule('boolean', 'extendCloseDate');
if (!$v->validate()) { if (!$v->validate()) {
return $v->errorStr(); return $v->errorStr();
@@ -38,7 +38,7 @@ class BidUniqueAuction extends \sammo\BaseAPI
{ {
$auctionID = $this->args['auctionID']; $auctionID = $this->args['auctionID'];
$amount = $this->args['amount']; $amount = $this->args['amount'];
$tryExtendCloseDate = $this->args['extendCloseTick'] ?? false; $tryExtendCloseDate = $this->args['extendCloseDate'] ?? false;
$generalID = $session->generalID; $generalID = $session->generalID;
$general = General::createObjFromDB($generalID); $general = General::createObjFromDB($generalID);
@@ -15,8 +15,6 @@ use sammo\General;
use sammo\Json; use sammo\Json;
use sammo\TimeUtil; use sammo\TimeUtil;
use sammo\Util; use sammo\Util;
use sammo\GameClock;
use sammo\KVStorage;
use function sammo\getAuctionLogRecent; use function sammo\getAuctionLogRecent;
@@ -35,13 +33,12 @@ class GetActiveResourceAuctionList extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$buyRiceList = []; $buyRiceList = [];
$sellRiceList = []; $sellRiceList = [];
/** @var AuctionInfo[] */ /** @var AuctionInfo[] */
$auctions = array_map(fn ($raw) => AuctionInfo::fromArray($raw), $db->query( $auctions = array_map(fn ($raw) => AuctionInfo::fromArray($raw), $db->query(
'SELECT * FROM `ng_auction` WHERE `type` IN %ls AND `finished` = 0 ORDER BY `close_tick` ASC', 'SELECT * FROM `ng_auction` WHERE `type` IN %ls AND `finished` = 0 ORDER BY `close_date` ASC',
[ [
AuctionType::BuyRice->value, AuctionType::BuyRice->value,
AuctionType::SellRice->value, AuctionType::SellRice->value,
@@ -90,8 +87,8 @@ class GetActiveResourceAuctionList extends \sammo\BaseAPI
'type' => $auction->type->value, 'type' => $auction->type->value,
'hostGeneralID' => $auction->hostGeneralID, 'hostGeneralID' => $auction->hostGeneralID,
'hostName' => $auction->detail->hostName, 'hostName' => $auction->detail->hostName,
'openDate' => $clock->formatTick($auction->openTick), 'openDate' => TimeUtil::format($auction->openDate, false),
'closeDate' => $clock->formatTick($auction->closeTick), 'closeDate' => TimeUtil::format($auction->closeDate, false),
'amount' => $auction->detail->amount, 'amount' => $auction->detail->amount,
'startBidAmount' => $auction->detail->startBidAmount, 'startBidAmount' => $auction->detail->startBidAmount,
'finishBidAmount' => $auction->detail->finishBidAmount, 'finishBidAmount' => $auction->detail->finishBidAmount,
@@ -14,8 +14,6 @@ use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey; use sammo\Enums\InheritanceKey;
use sammo\InheritancePointManager; use sammo\InheritancePointManager;
use sammo\TimeUtil; use sammo\TimeUtil;
use sammo\GameClock;
use sammo\KVStorage;
use sammo\Validator; use sammo\Validator;
use sammo\General; use sammo\General;
@@ -44,7 +42,6 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$generalID = $session->generalID; $generalID = $session->generalID;
$auctionID = $this->args['auctionID']; $auctionID = $this->args['auctionID'];
@@ -95,11 +92,9 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
'target' => $auction->target, 'target' => $auction->target,
'isCallerHost' => $auction->hostGeneralID === $generalID, 'isCallerHost' => $auction->hostGeneralID === $generalID,
'hostName' => $auction->detail->hostName, 'hostName' => $auction->detail->hostName,
'closeDate' => $clock->formatTick($auction->closeTick), 'closeDate' => TimeUtil::format($auction->closeDate, false),
'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt, 'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt,
'availableLatestBidCloseDate' => $auction->detail->availableLatestBidCloseTick === null 'availableLatestBidCloseDate' => TimeUtil::format($auction->detail->availableLatestBidCloseDate, false),
? null
: $clock->formatTick($auction->detail->availableLatestBidCloseTick),
], ],
'bidList' => $responseBid, 'bidList' => $responseBid,
'obfuscatedName' => $obfuscatedName, 'obfuscatedName' => $obfuscatedName,
@@ -12,8 +12,6 @@ use sammo\Enums\APIRecoveryType;
use sammo\Enums\AuctionType; use sammo\Enums\AuctionType;
use sammo\TimeUtil; use sammo\TimeUtil;
use sammo\Util; use sammo\Util;
use sammo\GameClock;
use sammo\KVStorage;
class GetUniqueItemAuctionList extends \sammo\BaseAPI class GetUniqueItemAuctionList extends \sammo\BaseAPI
{ {
@@ -30,13 +28,12 @@ class GetUniqueItemAuctionList extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$generalID = $session->generalID; $generalID = $session->generalID;
/** @var AuctionInfo[] */ /** @var AuctionInfo[] */
$auctions = array_map(fn($raw)=>AuctionInfo::fromArray($raw), $db->query( $auctions = array_map(fn($raw)=>AuctionInfo::fromArray($raw), $db->query(
'SELECT * FROM `ng_auction` WHERE `type` = %s ORDER BY `close_tick` ASC', 'SELECT * FROM `ng_auction` WHERE `type` = %s ORDER BY `close_date` ASC',
AuctionType::UniqueItem->value AuctionType::UniqueItem->value
) ?? []); ) ?? []);
@@ -88,11 +85,9 @@ class GetUniqueItemAuctionList extends \sammo\BaseAPI
'target' => $auction->target, 'target' => $auction->target,
'isCallerHost' => $auction->hostGeneralID === $generalID, 'isCallerHost' => $auction->hostGeneralID === $generalID,
'hostName' => $auction->detail->hostName, 'hostName' => $auction->detail->hostName,
'closeDate' => $clock->formatTick($auction->closeTick), 'closeDate' => TimeUtil::format($auction->closeDate, false),
'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt, 'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt,
'availableLatestBidCloseDate' => $auction->detail->availableLatestBidCloseTick === null 'availableLatestBidCloseDate' => TimeUtil::format($auction->detail->availableLatestBidCloseDate, false),
? null
: $clock->formatTick($auction->detail->availableLatestBidCloseTick),
'highestBid' => [ 'highestBid' => [
'generalName' => $highestBid->aux->generalName, 'generalName' => $highestBid->aux->generalName,
'amount' => $highestBid->amount, 'amount' => $highestBid->amount,
+3 -31
View File
@@ -6,11 +6,9 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\GameConst;
use sammo\GameClock;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\Util; use sammo\TimeUtil;
use function sammo\cutTurn; use function sammo\cutTurn;
@@ -32,21 +30,10 @@ class GetReservedCommand extends \sammo\BaseAPI
$commandList = []; $commandList = [];
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$generalID = $session->generalID; $generalID = $session->generalID;
$invalidTurnList = 0;
$rawTurn = $db->queryAllLists('SELECT turn_idx, action, arg, brief FROM general_turn WHERE general_id = %i ORDER BY turn_idx ASC', $generalID); $rawTurn = $db->queryAllLists('SELECT turn_idx, action, arg, brief FROM general_turn WHERE general_id = %i ORDER BY turn_idx ASC', $generalID);
foreach ($rawTurn as [$turn_idx, $action, $arg, $brief]) { foreach ($rawTurn as [$turn_idx, $action, $arg, $brief]) {
if($turn_idx < 0) {
$invalidTurnList = -1;
$turn_idx += GameConst::$maxTurn;
}
else if($turn_idx >= GameConst::$maxTurn) {
$invalidTurnList = 1;
$turn_idx -= GameConst::$maxTurn;
}
$commandList[$turn_idx] = [ $commandList[$turn_idx] = [
'action' => $action, 'action' => $action,
'brief' => $brief, 'brief' => $brief,
@@ -54,19 +41,6 @@ class GetReservedCommand extends \sammo\BaseAPI
]; ];
} }
if($invalidTurnList != 0){
if($invalidTurnList > 0){
$db->update('general_turn', [
'turn_idx' => $db->sqleval('turn_idx - %i', GameConst::$maxTurn)
], 'general_id=%i AND turn_idx >= %i', $generalID, GameConst::$maxTurn);
}
else{
$db->update('general_turn', [
'turn_idx' => $db->sqleval('turn_idx + %i', GameConst::$maxTurn)
], 'general_id=%i AND turn_idx < 0', $generalID);
}
}
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']); [$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
@@ -84,13 +58,11 @@ class GetReservedCommand extends \sammo\BaseAPI
return [ return [
'result' => true, 'result' => true,
'turnTimeTick' => Util::toInt($turnTime), 'turnTime' => $turnTime,
'turnTime' => $clock->formatTick(Util::toInt($turnTime)),
'turnTerm' => $turnTerm, 'turnTerm' => $turnTerm,
'year' => $year, 'year' => $year,
'month' => $month, 'month' => $month,
'date' => $clock->formatTick($clock->nowTick(), true), 'date' => TimeUtil::now(true),
'clockMode' => $clock->getMode(),
'turn' => $commandList, 'turn' => $commandList,
'autorun_limit' => $generalAux['autorun_limit'] ?? null, 'autorun_limit' => $generalAux['autorun_limit'] ?? null,
]; ];
@@ -0,0 +1,48 @@
<?php
namespace sammo\API\Command;
use sammo\Session;
use DateTimeInterface;
use sammo\Command\UserActionCommand;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\Json;
use sammo\KVStorage;
use sammo\TimeUtil;
use sammo\DTO\UserAction;
use function sammo\cutTurn;
class GetReservedUserAction extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$db = DB::db();
$generalID = $session->generalID;
$userActionKey = UserActionCommand::USER_ACTION_KEY;
$rawUserActions = $db->queryFirstField('SELECT JSON_QUERY(`aux`, %s) FROM general WHERE no=%i', "$.{$userActionKey}", $generalID);
if($rawUserActions === null){
$rawUserActions = '{}';
}
$userActions = UserAction::fromArray(Json::decode($rawUserActions));
return [
'result' => true,
'userActions' => $userActions->toArray(),
];
}
}
@@ -0,0 +1,91 @@
<?php
namespace sammo\API\Command;
use sammo\Session;
use DateTimeInterface;
use sammo\Command\UserActionCommand;
use sammo\DB;
use sammo\DTO\UserAction;
use sammo\DTO\UserActionItem;
use sammo\Enums\APIRecoveryType;
use sammo\GameConst;
use sammo\General;
use sammo\Json;
use sammo\KVStorage;
use sammo\Util;
use sammo\Validator;
use function sammo\buildUserActionCommandClass;
use function sammo\setGeneralCommand;
class ReserveUserAction extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('required', [
'turnIdx',
'action'
])
->rule('int', 'turnIdx')
->rule('max', 'turnIdx', GameConst::$maxTurn)
->rule('min', 'turnIdx', 0)
->rule('lengthMin', 'action', 1);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$turnIdx = $this->args['turnIdx'];
$action = $this->args['action'];
$userActionKey = UserActionCommand::USER_ACTION_KEY;
if($turnIdx < 0 || $turnIdx >= GameConst::$maxTurn){
return '올바르지 않은 턴입니다.';
}
if(!in_array($action, Util::array_flatten(GameConst::$availableUserActionCommand))){
return '사용할 수 없는 커맨드입니다.';
}
$db = DB::db();
$generalID = $session->generalID;
$rawUserActions = $db->queryFirstField('SELECT JSON_QUERY(`aux`, %s) FROM general WHERE no=%i', "$.{$userActionKey}", $generalID);
if(!$rawUserActions){
$rawUserActions = '{}';
}
$tmp = Json::decode($rawUserActions);
$userActions = UserAction::fromArray($tmp);
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheAll();
$general = General::createObjFromDB($generalID);
$item = buildUserActionCommandClass($action, $general, $gameStor->getAll());
$userActions->reserved[$turnIdx] = new UserActionItem(
$item->getRawClassName(),
$item->getBrief(),
null,
);
$db->update('general', [
'aux' => $db->sqleval('JSON_SET(`aux`, %s, JSON_EXTRACT(%s, "$"))', "$.{$userActionKey}", Json::encode($userActions->toArray())),
], 'no=%i', $generalID);
return [
'result' => true,
];
}
}
@@ -90,9 +90,6 @@ class BuildNationCandidate extends \sammo\BaseAPI
return '거병을 실패했습니다.'; return '거병을 실패했습니다.';
} }
$generalObj->setVar('killturn', $env['killturn']);
$generalObj->applyDB($db);
return null; return null;
} }
} }
+11 -24
View File
@@ -11,8 +11,7 @@ use sammo\Session;
use sammo\General; use sammo\General;
use sammo\JosaUtil; use sammo\JosaUtil;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\GameClock; use sammo\TimeUtil;
use sammo\Util;
use function sammo\addTurn; use function sammo\addTurn;
use function sammo\increaseRefresh; use function sammo\increaseRefresh;
@@ -38,14 +37,8 @@ class DieOnPrestart extends \sammo\BaseAPI
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']); $gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
$clock = GameClock::fromStorage($gameStor);
$nowTick = $clock->nowTick();
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID); $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID);
if (!$general) {
return '장수가 없습니다';
}
$lastRefresh = $db->queryFirstField( $lastRefresh = $db->queryFirstField(
'SELECT %b FROM general_access_log WHERE %b = %i', 'SELECT %b FROM general_access_log WHERE %b = %i',
GeneralAccessLogColumn::lastRefresh->value, GeneralAccessLogColumn::lastRefresh->value,
@@ -53,9 +46,8 @@ class DieOnPrestart extends \sammo\BaseAPI
$general['no'] $general['no']
); );
$generalObj = General::createObjFromDB($general['no']); if (!$general) {
if ($generalObj instanceof DummyGeneral) { return '장수가 없습니다';
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
} }
increaseRefresh("장수 삭제", 1); increaseRefresh("장수 삭제", 1);
@@ -69,21 +61,16 @@ class DieOnPrestart extends \sammo\BaseAPI
return '이미 국가에 소속되어있습니다.'; return '이미 국가에 소속되어있습니다.';
} }
$targetTime = $generalObj->getAuxVar('prestart_delete_after'); //서버 가오픈시 할 수 있는 행동
if (!is_int($targetTime)) { $targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
$targetTime = addTurn( if ($targetTime > TimeUtil::now()) {
$lastRefresh === null ? $nowTick : Util::toInt($lastRefresh), $targetTimeShort = substr($targetTime, 0, 19);
$gameStor->turnterm, return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
GameConst::$minTurnDieOnPrestart
);
$generalObj->setAuxVar('prestart_delete_after', $targetTime);
$generalObj->applyDB($db);
} }
//서버 가오픈시 할 수 있는 행동 $generalObj = General::createObjFromDB($general['no']);
if ($targetTime > $nowTick) { if ($generalObj instanceof DummyGeneral) {
$targetTimeShort = $clock->formatTick($targetTime); trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
} }
$generalName = $generalObj->getName(); $generalName = $generalObj->getName();
+34 -21
View File
@@ -5,28 +5,32 @@ namespace sammo\API\General;
use DateTimeInterface; use DateTimeInterface;
use MeekroDB; use MeekroDB;
use sammo\CityConst; use sammo\CityConst;
use sammo\Command\UserActionCommand;
use sammo\DB; use sammo\DB;
use sammo\DTO\UserAction;
use sammo\DTO\VoteInfo; use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\CityColumn; use sammo\Enums\CityColumn;
use sammo\Enums\GeneralAccessLogColumn; use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\GeneralAuxKey;
use sammo\Enums\GeneralColumn; use sammo\Enums\GeneralColumn;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn; use sammo\Enums\RankColumn;
use sammo\GameConst; use sammo\GameConst;
use sammo\GameClock;
use sammo\General; use sammo\General;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\LastTurn; use sammo\LastTurn;
use sammo\Validator; use sammo\Validator;
use sammo\Session; use sammo\Session;
use sammo\TimeUtil;
use sammo\Util; use sammo\Util;
use function sammo\buildNationCommandClass; use function sammo\buildNationCommandClass;
use function sammo\checkLimit; use function sammo\checkLimit;
use function sammo\getTournamentTermText; use function sammo\getTournamentTermText;
use function sammo\buildNationTypeClass; use function sammo\buildNationTypeClass;
use function sammo\buildUserActionCommandClass;
use function sammo\calcLeadershipBonus; use function sammo\calcLeadershipBonus;
use function sammo\checkSecretPermission; use function sammo\checkSecretPermission;
use function sammo\getBillByLevel; use function sammo\getBillByLevel;
@@ -101,11 +105,11 @@ class GetFrontInfo extends \sammo\BaseAPI
return $history; return $history;
} }
private function generateRecentRecord(int $generalID){ private function generateRecentRecord(int $generalID)
{
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$gameStor->cacheValues(['isunited', 'opentime', 'refresh']); $gameStor->cacheValues(['isunited', 'opentime', 'refresh']);
$lastHistoryID = $this->args['lastWorldHistoryID']; $lastHistoryID = $this->args['lastWorldHistoryID'];
@@ -159,7 +163,6 @@ class GetFrontInfo extends \sammo\BaseAPI
private function generateGlobalInfo(MeekroDB $db): array private function generateGlobalInfo(MeekroDB $db): array
{ {
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
[ [
$scenarioText, $extendedGeneral, $isFiction, $npcMode, $scenarioText, $extendedGeneral, $isFiction, $npcMode,
@@ -184,9 +187,8 @@ class GetFrontInfo extends \sammo\BaseAPI
$lastVote = null; $lastVote = null;
if ($lastVoteID) { if ($lastVoteID) {
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
$rawLastVote = VoteInfo::normalizeGameStorage($voteStor->getValue("vote_{$lastVoteID}"), $clock); $lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}"));
$lastVote = VoteInfo::fromGameStorage($rawLastVote, $clock); if ($lastVote->endDate && $lastVote->endDate < TimeUtil::now()) {
if ($rawLastVote['endTick'] !== null && $rawLastVote['endTick'] < $clock->nowTick()) {
$lastVote = null; $lastVote = null;
} }
} }
@@ -213,8 +215,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'month' => $month, 'month' => $month,
'autorunUser' => $autorunUser, 'autorunUser' => $autorunUser,
'turnterm' => $turnterm, 'turnterm' => $turnterm,
'lastExecutedTick' => $lastExecuted, 'lastExecuted' => $lastExecuted,
'lastExecuted' => $clock->formatTick(Util::toInt($lastExecuted), true),
'lastVoteID' => $lastVoteID, 'lastVoteID' => $lastVoteID,
'develCost' => $develCost, 'develCost' => $develCost,
'noticeMsg' => $noticeMsg, 'noticeMsg' => $noticeMsg,
@@ -228,8 +229,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'isLocked' => $isLocked, 'isLocked' => $isLocked,
'tournamentType' => $tournamentType, 'tournamentType' => $tournamentType,
'tournamentState' => $tournamentState, 'tournamentState' => $tournamentState,
'tournamentTimeTick' => $tournamentTime, 'tournamentTime' => $tournamentTime,
'tournamentTime' => $tournamentTime === null ? null : $clock->formatTick(Util::toInt($tournamentTime)),
'genCount' => $globalGenCount, 'genCount' => $globalGenCount,
'generalCntLimit' => $generalCntLimit, 'generalCntLimit' => $generalCntLimit,
'serverCnt' => $serverCnt, 'serverCnt' => $serverCnt,
@@ -252,7 +252,7 @@ class GetFrontInfo extends \sammo\BaseAPI
$nationID $nationID
); );
if($nationPopulation['cityCnt'] == 0){ if ($nationPopulation['cityCnt'] == 0) {
$nationPopulation = [ $nationPopulation = [
'cityCnt' => 0, 'cityCnt' => 0,
'now' => 0, 'now' => 0,
@@ -366,7 +366,8 @@ class GetFrontInfo extends \sammo\BaseAPI
public function generateGeneralInfo(MeekroDB $db, General $general, array $rawNation): array public function generateGeneralInfo(MeekroDB $db, General $general, array $rawNation): array
{ {
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env')); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getAll(true);
$permission = checkSecretPermission($general->getRaw()); $permission = checkSecretPermission($general->getRaw());
@@ -431,12 +432,8 @@ class GetFrontInfo extends \sammo\BaseAPI
'crew' => $general->getVar(GeneralColumn::crew), // number; 'crew' => $general->getVar(GeneralColumn::crew), // number;
'train' => $general->getVar(GeneralColumn::train), // number; 'train' => $general->getVar(GeneralColumn::train), // number;
'atmos' => $general->getVar(GeneralColumn::atmos), // number; 'atmos' => $general->getVar(GeneralColumn::atmos), // number;
'turntimeTick' => $general->getTurnTick(), // number; 'turntime' => $general->getVar(GeneralColumn::turntime), // string;
'turntime' => $general->getTurnTime(), // string; 'recent_war' => $general->getVar(GeneralColumn::recent_war), // string;
'recent_war_tick' => $general->getVar(GeneralColumn::recent_war), // number|null;
'recent_war' => $general->getVar(GeneralColumn::recent_war) === null
? null
: $clock->formatTick(Util::toInt($general->getVar(GeneralColumn::recent_war)), true), // string|null;
'horse' => $general->getVar(GeneralColumn::horse), // GameObjClassKey; 'horse' => $general->getVar(GeneralColumn::horse), // GameObjClassKey;
'weapon' => $general->getVar(GeneralColumn::weapon), // GameObjClassKey; 'weapon' => $general->getVar(GeneralColumn::weapon), // GameObjClassKey;
'book' => $general->getVar(GeneralColumn::book), // GameObjClassKey; 'book' => $general->getVar(GeneralColumn::book), // GameObjClassKey;
@@ -453,6 +450,21 @@ class GetFrontInfo extends \sammo\BaseAPI
'permission' => $permission, 'permission' => $permission,
]; ];
$rawUserAction = $general->getAuxVar(UserActionCommand::USER_ACTION_KEY) ?? [];
$userAction = UserAction::fromArray($rawUserAction);
$impossibleUserAction = [];
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
if ($userAction->nextAvailableTurn) {
foreach ($userAction->nextAvailableTurn as $command => $nextAvailableTurn) {
if ($nextAvailableTurn > $yearMonth) {
$impossibleUserAction[] = [$command, $nextAvailableTurn - $yearMonth];
}
}
}
$result['impossibleUserAction'] = $impossibleUserAction;
$nationID = $general->getNationID(); $nationID = $general->getNationID();
$troopID = $general->getVar(GeneralColumn::troop); $troopID = $general->getVar(GeneralColumn::troop);
if (!$troopID) { if (!$troopID) {
@@ -493,6 +505,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'name' => $troopName, 'name' => $troopName,
]; ];
return $result; return $result;
} }
@@ -554,7 +567,7 @@ class GetFrontInfo extends \sammo\BaseAPI
'result' => false, 'result' => false,
'reason' => '접속 제한중입니다.', 'reason' => '접속 제한중입니다.',
'recovery' => APIRecoveryType::GameQuota, 'recovery' => APIRecoveryType::GameQuota,
'recovery_arg' => $general->getTurnTime(), 'recovery_arg' => $general->getVar('turntime'),
]; ];
} }
@@ -586,7 +599,7 @@ class GetFrontInfo extends \sammo\BaseAPI
if ($globalInfo['lastVote']) { if ($globalInfo['lastVote']) {
$myLastVoteID = $db->queryFirstField('SELECT vote_id FROM vote WHERE general_id = %i ORDER BY vote_id DESC LIMIT 1', $generalID); $myLastVoteID = $db->queryFirstField('SELECT vote_id FROM vote WHERE general_id = %i ORDER BY vote_id DESC LIMIT 1', $generalID);
if($myLastVoteID) { if ($myLastVoteID) {
$auxInfo['myLastVote'] = $myLastVoteID; $auxInfo['myLastVote'] = $myLastVoteID;
} }
} }
@@ -0,0 +1,68 @@
<?php
namespace sammo\API\General;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\GameConst;
use sammo\General;
use sammo\Session;
use sammo\KVStorage;
use sammo\Util;
use function sammo\buildUserActionCommandClass;
class GetUserActionCommandTable extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$generalID = $session->generalID;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->turnOnCache();
$env = $gameStor->getAll();
$general = General::createObjFromDB($generalID);
$commandTable = [];
foreach (GameConst::$availableUserActionCommand as $commandCategory => $commandList) {
$subList = [];
foreach ($commandList as $commandClassName) {
$commandObj = buildUserActionCommandClass($commandClassName, $general, $env);
if (!$commandObj->canDisplay()) {
continue;
}
$subList[] = [
'value' => Util::getClassNameFromObj($commandObj),
'compensation' => $commandObj->getCompensationStyle(),
'possible' => $commandObj->hasMinConditionMet(),
'title' => $commandObj->getCommandDetailTitle(),
'simpleName' => $commandObj->getName(),
'reqArg' => $commandObj::$reqArg,
];
}
$commandTable[] = [
'category' => $commandCategory,
'values' => $subList
];
}
return [
'result' => true,
'commandTable' => $commandTable,
];
}
}
+21 -37
View File
@@ -11,7 +11,6 @@ use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralAccessLogColumn; use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\RankColumn; use sammo\Enums\RankColumn;
use sammo\GameConst; use sammo\GameConst;
use sammo\GameClock;
use sammo\GameUnitConst; use sammo\GameUnitConst;
use sammo\General; use sammo\General;
use sammo\InheritancePointManager; use sammo\InheritancePointManager;
@@ -55,7 +54,7 @@ class Join extends \sammo\BaseAPI
'leadership', 'leadership',
'strength', 'strength',
'intel', 'intel',
'inheritTurntimeZone', 'inheritTurntime',
]) ])
->rule('boolean', [ ->rule('boolean', [
'pic' 'pic'
@@ -73,8 +72,7 @@ class Join extends \sammo\BaseAPI
], GameConst::$defaultStatMax) ], GameConst::$defaultStatMax)
->rule('in', 'character', array_merge(GameConst::$availablePersonality, ['Random'])) ->rule('in', 'character', array_merge(GameConst::$availablePersonality, ['Random']))
->rule('in', 'inheritSpecial', GameConst::$availableSpecialWar) ->rule('in', 'inheritSpecial', GameConst::$availableSpecialWar)
->rule('min', 'inheritTurntimeZone', 0) ->rule('min', 'inheritTurntime', 0)
->rule('max', 'inheritTurntimeZone', 59)
->rule('in', 'inheritCity', array_keys(CityConst::all())) ->rule('in', 'inheritCity', array_keys(CityConst::all()))
->rule('integerArray', 'inheritBonusStat'); ->rule('integerArray', 'inheritBonusStat');
@@ -100,7 +98,7 @@ class Join extends \sammo\BaseAPI
} }
$gameID = UniqueConst::$serverID; $gameID = UniqueConst::$serverID;
$alreadyJoined = $db->queryFirstField('SELECT COUNT(*) FROM `inheritance_result` WHERE `server_id` = %s AND `owner` = %i', $gameID, $userID); $alreadyJoined = $db->queryFirstField('SELECT count(*) FROM `storage` WHERE `namespace` = %s AND `key` LIKE %s', 'inheritance_result', "{$gameID}_{$userID}_%");
if ($alreadyJoined) { if ($alreadyJoined) {
//이미 받았음 //이미 받았음
return 0; return 0;
@@ -141,32 +139,25 @@ class Join extends \sammo\BaseAPI
$intel = $this->args['intel']; $intel = $this->args['intel'];
$inheritSpecial = $this->args['inheritSpecial'] ?? null; $inheritSpecial = $this->args['inheritSpecial'] ?? null;
$inheritTurntimeZone = $this->args['inheritTurntimeZone'] ?? null; $inheritTurntime = $this->args['inheritTurntime'] ?? null;
$inheritCity = $this->args['inheritCity'] ?? null; $inheritCity = $this->args['inheritCity'] ?? null;
$inheritBonusStat = $this->args['inheritBonusStat'] ?? null; $inheritBonusStat = $this->args['inheritBonusStat'] ?? null;
if ($inheritTurntime !== null && $inheritCity !== null) {
return '턴과 도시를 동시에 지정할 수 없습니다.';
}
$rootDB = RootDB::db(); $rootDB = RootDB::db();
//회원 테이블에서 정보확인 //회원 테이블에서 정보확인
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr, `penalty` FROM member WHERE no=%i', $userID); $member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID);
if (!$member) { if (!$member) {
return "잘못된 접근입니다!!!"; return "잘못된 접근입니다!!!";
} }
$memberPenalty = Json::decode($member['penalty'] ?? "{}");
$penaltyInfo = array_merge($memberPenalty['any'] ?? [], $memberPenalty[DB::prefix()] ?? []);
$penalty = [];
foreach($penaltyInfo as $penaltyKey => $penaltyValue){
if(($penaltyValue['expire'] ?? 0) > TimeUtil::now()){
$penalty[$penaltyKey] = $penaltyValue['value'];
}
}
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['year', 'month', 'maxgeneral', 'scenario', 'show_img_level', 'block_general_create', 'turnterm', 'turntime', 'genius', 'npcmode']); $gameStor->cacheValues(['year', 'month', 'maxgeneral', 'scenario', 'show_img_level', 'block_general_create', 'turnterm', 'turntime', 'genius', 'npcmode']);
$clock = GameClock::fromStorage($gameStor);
########## 동일 정보 존재여부 확인. ########## ########## 동일 정보 존재여부 확인. ##########
$block_general_create = $gameStor->getValue('block_general_create'); $block_general_create = $gameStor->getValue('block_general_create');
@@ -224,7 +215,7 @@ class Join extends \sammo\BaseAPI
$userLogger = new UserLogger($userID, $admin['year'], $admin['month'], false); $userLogger = new UserLogger($userID, $admin['year'], $admin['month'], false);
$now = $clock->nowTick(); $now = TimeUtil::now(false);
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
'MakeGeneral', 'MakeGeneral',
@@ -241,7 +232,7 @@ class Join extends \sammo\BaseAPI
if ($inheritSpecial !== null) { if ($inheritSpecial !== null) {
$inheritRequiredPoint += GameConst::$inheritBornSpecialPoint; $inheritRequiredPoint += GameConst::$inheritBornSpecialPoint;
} }
if ($inheritTurntimeZone !== null) { if ($inheritTurntime !== null) {
$inheritRequiredPoint += GameConst::$inheritBornTurntimePoint; $inheritRequiredPoint += GameConst::$inheritBornTurntimePoint;
} }
@@ -356,20 +347,21 @@ class Join extends \sammo\BaseAPI
$experience *= 0.8; $experience *= 0.8;
} }
if ($inheritTurntimeZone !== null) { if ($inheritTurntime !== null) {
$inheritTurntime = $inheritTurntimeZone * $admin['turnterm']; $inheritTurntime = $inheritTurntime % ($admin['turnterm'] * 60);
$inheritTurntime += $rng->nextRangeInt(0, Util::clamp($admin['turnterm'] - 1, 0));
$userLogger->push(sprintf("턴 시간 %02d:%02d 로 지정", intdiv($inheritTurntime, 60), $inheritTurntime % 60), "inheritPoint"); $userLogger->push(sprintf("턴 시간 %02d:%02d 로 지정", intdiv($inheritTurntime, 60), $inheritTurntime % 60), "inheritPoint");
$inheritTurnMicrosecond = $rng->nextRangeInt(0, 999999); $inheritTurntime += $rng->nextRangeInt(0, 999999) / 1000000;
$turntime = cutTurn(Util::toInt($admin['turntime']), $admin['turnterm']) $turntime = new \DateTimeImmutable(cutTurn($admin['turntime'], $admin['turnterm']));
+ $clock->ticksFromSeconds($inheritTurntime) $turntime = $turntime->add(TimeUtil::secondsToDateInterval($inheritTurntime));
+ intdiv($inheritTurnMicrosecond * $clock->ticksPerSecond(), 1_000_000); $turntime = TimeUtil::format($turntime, true);
} else { } else {
$turntime = getRandTurn($rng, $admin['turnterm'], Util::toInt($admin['turntime'])); $turntime = getRandTurn($rng, $admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
} }
$now = TimeUtil::now(true);
if ($now >= $turntime) { if ($now >= $turntime) {
$turntime = addTurn($turntime, $admin['turnterm']); $turntime = addTurn($turntime, $admin['turnterm']);
} }
@@ -432,15 +424,7 @@ class Join extends \sammo\BaseAPI
'specage' => $specage, 'specage' => $specage,
'special' => $special, 'special' => $special,
'specage2' => $specage2, 'specage2' => $specage2,
'special2' => $special2, 'special2' => $special2
'penalty' => Json::encode($penalty),
'aux' => Json::encode([
'prestart_delete_after' => addTurn(
$now,
$admin['turnterm'],
GameConst::$minTurnDieOnPrestart
),
]),
]); ]);
$generalID = $db->insertId(); $generalID = $db->insertId();
$db->insert('general_access_log', [ $db->insert('general_access_log', [
+1 -5
View File
@@ -8,8 +8,6 @@ use DateTimeInterface;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\TurnExecutionHelper; use sammo\TurnExecutionHelper;
use sammo\UniqueConst; use sammo\UniqueConst;
use sammo\GameClock;
use sammo\KVStorage;
class ExecuteEngine extends \sammo\BaseAPI class ExecuteEngine extends \sammo\BaseAPI
{ {
@@ -37,13 +35,11 @@ class ExecuteEngine extends \sammo\BaseAPI
$updated = false; $updated = false;
$locked = false; $locked = false;
$lastExecuted = TurnExecutionHelper::executeAllCommand($updated, $locked); $lastExecuted = TurnExecutionHelper::executeAllCommand($updated, $locked);
$clock = GameClock::fromStorage(KVStorage::getStorage(DB::db(), 'game_env'));
return [ return [
'result' => true, 'result' => true,
'updated' => $updated, 'updated' => $updated,
'locked' => $locked, 'locked' => $locked,
'lastExecutedTick' => $lastExecuted, 'lastExecuted' => $lastExecuted,
'lastExecuted' => $clock->formatTick($lastExecuted, true),
]; ];
} }
} }
+2 -4
View File
@@ -3,7 +3,6 @@
namespace sammo\API\Global; namespace sammo\API\Global;
use sammo\DB; use sammo\DB;
use sammo\GameClock;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
@@ -55,7 +54,7 @@ class GeneralList extends \sammo\BaseAPI
$availableNextCall = $session->availableNextCallGetGeneralList ?? '2000-01-01 00:00:00'; $availableNextCall = $session->availableNextCallGetGeneralList ?? '2000-01-01 00:00:00';
$now = new \DateTimeImmutable(); $now = new \DateTimeImmutable();
if ($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 6) { if ($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5) {
return "장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : " . $availableNextCall; return "장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : " . $availableNextCall;
} }
@@ -146,8 +145,7 @@ class GeneralList extends \sammo\BaseAPI
if (static::$withToken) { if (static::$withToken) {
$gameStor = KVStorage::getStorage($db, 'game_env'); $now = (new \DateTimeImmutable())->format('Y-m-d H:i:s');
$now = GameClock::fromStorage($gameStor)->nowTick();
$tokens = []; $tokens = [];
foreach ($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token) { foreach ($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token) {
$validUntil = $token['valid_until']; $validUntil = $token['valid_until'];
+1 -5
View File
@@ -55,11 +55,7 @@ class GetCachedMap extends \sammo\BaseAPI
return 'cache 불가'; return 'cache 불가';
} }
$absolutePath = realpath('data/file_cache'); $storage = new \Nette\Caching\Storages\FileStorage('data/file_cache');
if (!$absolutePath) {
return 'cache 불가';
}
$storage = new \Nette\Caching\Storages\FileStorage($absolutePath);
$cache = new Cache($storage); $cache = new Cache($storage);
$now = TimeUtil::nowDateTimeImmutable(); $now = TimeUtil::nowDateTimeImmutable();
-4
View File
@@ -288,10 +288,6 @@ class GetConst extends \sammo\BaseAPI
if (!prepareDir($cacheDir)) { if (!prepareDir($cacheDir)) {
throw new RuntimeException('cache 폴더 없음'); throw new RuntimeException('cache 폴더 없음');
} }
$absolutePath = realpath($cacheDir);
if (!$absolutePath) {
throw new RuntimeException('cache 폴더 없음');
}
$storage = new \Nette\Caching\Storages\FileStorage($cacheDir); $storage = new \Nette\Caching\Storages\FileStorage($cacheDir);
$cache = new Cache($storage); $cache = new Cache($storage);
@@ -10,6 +10,7 @@ use sammo\Enums\RankColumn;
use sammo\GameConst; use sammo\GameConst;
use sammo\General; use sammo\General;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\TimeUtil;
use sammo\UserLogger; use sammo\UserLogger;
class BuyRandomUnique extends \sammo\BaseAPI class BuyRandomUnique extends \sammo\BaseAPI
@@ -55,7 +56,7 @@ class BuyRandomUnique extends \sammo\BaseAPI
$userLogger->push("{$reqAmount} 포인트로 랜덤 유니크 구입", "inheritPoint"); $userLogger->push("{$reqAmount} 포인트로 랜덤 유니크 구입", "inheritPoint");
$userLogger->flush(); $userLogger->flush();
$general->setAuxVar('inheritRandomUnique', true); $general->setAuxVar('inheritRandomUnique', TimeUtil::now());
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]); $inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqAmount); $general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqAmount);
$general->applyDB($db); $general->applyDB($db);
-154
View File
@@ -1,154 +0,0 @@
<?php
namespace sammo\API\InheritAction;
use sammo\Session;
use DateTimeInterface;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\MessageType;
use sammo\Enums\RankColumn;
use sammo\GameConst;
use sammo\General;
use sammo\KVStorage;
use sammo\Message;
use sammo\MessageTarget;
use sammo\RootDB;
use sammo\TimeUtil;
use sammo\UserLogger;
use sammo\Validator;
use function sammo\GetImageURL;
use function sammo\getNationStaticInfo;
/**
*
* 유산 포인트 1000 포인트를 사용하면 지정한 상대의 본래 유저명을 확인 가능.
* 개인 메시지로 전달되며, 이 기능이 사용되었음을 상대에게도 알림.
*/
class CheckOwner extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('required', [
'destGeneralID',
])
->rule('int', 'destGeneralID')
->rule('min', 'destGeneralID', 1);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null|string|array|APIRecoveryType
{
$userID = $session->userID;
$generalID = $session->generalID;
$destGeneralID = $this->args['destGeneralID'];
if ($generalID == $destGeneralID) {
return '자신의 정보는 확인할 수 없습니다.';
}
$general = General::createObjFromDB($generalID);
if ($userID != $general->getVar('owner')) {
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
}
$db = DB::db();
$destRawGeneral = $db->queryFirstRow('SELECT no,name,nation,owner,owner_name,imgsvr,picture FROM general WHERE no = %i', $destGeneralID);
if (!$destRawGeneral) {
return '대상 장수가 존재하지 않습니다.';
}
if (!$destRawGeneral['owner']) {
return '대상 장수는 NPC입니다.';
}
$gameStor = KVStorage::getStorage($db, 'game_env');
if ($gameStor->isunited) {
return '이미 천하가 통일되었습니다.';
}
$reqPoint = GameConst::$inheritCheckOwnerPoint;
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
if ($previousPoint < $reqPoint) {
return '충분한 유산 포인트를 가지고 있지 않습니다.';
}
$userLogger = new UserLogger($userID);
$userLogger->push("{$reqPoint} 포인트로 장수 소유자 확인", "inheritPoint");
$userLogger->flush();
$destGeneralName = $destRawGeneral['name'];
$destGeneralOwnerName = $destRawGeneral['owner_name'];
if (!$destGeneralOwnerName) {
$rootDB = RootDB::db();
$destGeneralOwnerName = $rootDB->queryFirstField('SELECT name FROM member WHERE no = %i', $destRawGeneral['owner']) ?? '알수없음';
}
$src = new MessageTarget(0, '', 0, 'System', '#000000');
if (true) {
$staticNation = $general->getStaticNation();
$dest = new MessageTarget(
$generalID,
$general->getName(),
$general->getNationID(),
$staticNation['name'],
$staticNation['color'],
GetImageURL($general->getVar('imgsvr'), $general->getVar('picture'))
);
$msg = new Message(
MessageType::private,
$src,
$dest,
"{$destGeneralName}의 소유자는 {$destGeneralOwnerName} 입니다.",
Message::gameNow(),
new \DateTime('9999-12-31'),
[]
);
$msg->send(true);
}
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqPoint);
$general->applyDB($db);
if(true){
$destStaticNation = getNationStaticInfo($destRawGeneral['nation']);
$dest = new MessageTarget(
$destGeneralID,
$destGeneralName,
$destRawGeneral['nation'],
$destStaticNation['name'],
$destStaticNation['color'],
GetImageURL($destRawGeneral['imgsvr'], $destRawGeneral['picture'])
);
$msg = new Message(
MessageType::private,
$src,
$dest,
"소유자명이 누군가에 의해 확인되었습니다.",
Message::gameNow(),
new \DateTime('9999-12-31'),
[]
);
$msg->send(true);
}
return null;
}
}
-188
View File
@@ -1,188 +0,0 @@
<?php
namespace sammo\API\InheritAction;
use sammo\Session;
use DateTimeInterface;
use sammo\CentennialAllStarGrowthService;
use sammo\DB;
use sammo\Enums\APIRecoveryType;
use sammo\Enums\RankColumn;
use sammo\GameConst;
use sammo\General;
use sammo\KVStorage;
use sammo\LiteHashDRBG;
use sammo\RandUtil;
use sammo\UniqueConst;
use sammo\UserLogger;
use sammo\Util;
use sammo\Validator;
class ResetStat extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('required', [
'leadership',
'strength',
'intel',
])
->rule('int', [
'leadership',
'strength',
'intel',
])
->rule('min', [
'leadership',
'strength',
'intel'
], GameConst::$defaultStatMin)
->rule('max', [
'leadership',
'strength',
'intel'
], GameConst::$defaultStatMax)
->rule('integerArray', 'inheritBonusStat');
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
//General.aux 쓰므로 lock;
return static::REQ_GAME_LOGIN;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$userID = $session->userID;
$generalID = $session->generalID;
$leadership = $this->args['leadership'];
$strength = $this->args['strength'];
$intel = $this->args['intel'];
$inheritBonusStat = $this->args['inheritBonusStat'] ?? null;
if ($leadership + $strength + $intel != GameConst::$defaultStatTotal) {
return "능력치 총합이 " . GameConst::$defaultStatTotal . "이 아닙니다. 다시 입력해주세요!";
}
if ($inheritBonusStat) {
if (count($inheritBonusStat) != 3) {
return "보너스 능력치가 잘못 지정되었습니다. 다시 입력해주세요!";
}
foreach ($inheritBonusStat as $stat) {
if ($stat < 0) {
return "보너스 능력치가 음수입니다. 다시 입력해주세요!";
}
}
$sum = array_sum($inheritBonusStat);
if ($sum == 0) {
$inheritBonusStat = null;
} else if ($sum < 3 || $sum > 5) {
return "보너스 능력치 합이 잘못 지정되었습니다. 다시 입력해주세요!";
}
}
$general = General::createObjFromDB($generalID);
if ($userID != $general->getVar('owner')) {
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
}
$userLogger = new UserLogger($userID);
if($general->getNPCType() != 0){
return 'NPC는 능력치 초기화를 할 수 없습니다.';
}
if (!CentennialAllStarGrowthService::isStatResetAllowed()) {
return '100기 올스타 장수는 능력치 초기화를 사용할 수 없습니다.';
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues([
'isunited',
'season',
]);
if ($gameStor->isunited) {
return '이미 천하가 통일되었습니다.';
}
$userStor = KVStorage::getStorage($db, "user_{$userID}");
$lastUserStatReset = $userStor->getValue('last_stat_reset') ?? [];
$gameSeason = $gameStor->getValue('season');
if (array_search($gameSeason, $lastUserStatReset) !== false) {
return '이번 시즌에 이미 능력치를 초기화하셨습니다.';
}
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
$reqAmount = 0;
if ($inheritBonusStat !== null) {
$reqAmount += GameConst::$inheritBornStatPoint;
}
if ($previousPoint < $reqAmount) {
return '충분한 유산 포인트를 가지고 있지 않습니다.';
}
$userLogger->push("통솔 {$leadership}, 무력 {$strength}, 지력 {$intel} 스탯 재설정", "inheritPoint");
if ($inheritBonusStat) {
$pleadership = $inheritBonusStat[0] ?? 0;
$pstrength = $inheritBonusStat[1] ?? 0;
$pintel = $inheritBonusStat[2] ?? 0;
$userLogger->push("{$reqAmount}로 통솔 {$pleadership}, 무력 {$pstrength}, 지력 {$pintel} 보너스 능력치 적용", "inheritPoint");
} else {
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'ResetStat',
$userID,
)));
$pleadership = 0;
$pstrength = 0;
$pintel = 0;
foreach (Util::range($rng->nextRangeInt(3, 5)) as $statIdx) {
switch ($rng->choiceUsingWeight([$leadership, $strength, $intel])) {
case 0:
$pleadership++;
break;
case 1:
$pstrength++;
break;
case 2:
$pintel++;
break;
}
}
$userLogger->push("통솔 {$pleadership}, 무력 {$pstrength}, 지력 {$pintel} 보너스 능력치 적용", "inheritPoint");
}
$leadership += $pleadership;
$strength += $pstrength;
$intel += $pintel;
$lastUserStatReset[] = $gameSeason;
$general->setVar('leadership', $leadership);
$general->setVar('strength', $strength);
$general->setVar('intel', $intel);
$userLogger->flush();
$inheritStor->setValue('previous', [$previousPoint - $reqAmount, null]);
$userStor->setValue('last_stat_reset', $lastUserStatReset);
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqAmount);
$general->applyDB($db);
return null;
}
}
@@ -64,11 +64,13 @@ class ResetTurnTime extends \sammo\BaseAPI
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$turnTerm = $gameStor->getValue('turnterm'); $turnTerm = $gameStor->getValue('turnterm');
$currTurnTime = new DateTimeImmutable($general->getTurnTime());
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed, UniqueConst::$hiddenSeed,
'ResetTurnTime', 'ResetTurnTime',
$userID, $userID,
$general->getAuxVar('nextTurnTimeBase') ?? $general->getTurnTick() $general->getAuxVar('nextTurnTimeBase') ?? $general->getTurnTime()
))); )));
$afterTurn = $rng->nextFloat1() * $turnTerm * 60; $afterTurn = $rng->nextFloat1() * $turnTerm * 60;
+6 -20
View File
@@ -7,12 +7,9 @@ use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\MessageType; use sammo\Enums\MessageType;
use sammo\Enums\PenaltyKey;
use sammo\Json;
use sammo\Message; use sammo\Message;
use sammo\MessageTarget; use sammo\MessageTarget;
use sammo\Validator; use sammo\Validator;
use sammo\Util;
use function sammo\checkLimit; use function sammo\checkLimit;
use function sammo\checkSecretPermission; use function sammo\checkSecretPermission;
@@ -44,7 +41,7 @@ class SendMessage extends \sammo\BaseAPI
private function genPublicMessage(MessageTarget $src, string $text): Message private function genPublicMessage(MessageTarget $src, string $text): Message
{ {
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$msg = new Message( $msg = new Message(
@@ -62,7 +59,7 @@ class SendMessage extends \sammo\BaseAPI
private function genNationalMessage(MessageTarget $src, string $text): Message private function genNationalMessage(MessageTarget $src, string $text): Message
{ {
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$dest = new MessageTarget(0, '', $src->nationID, $src->nationName, $src->color); $dest = new MessageTarget(0, '', $src->nationID, $src->nationName, $src->color);
@@ -82,7 +79,7 @@ class SendMessage extends \sammo\BaseAPI
private function genDiplomacyMessage(MessageTarget $src, int $destNationID, string $text): Message|string private function genDiplomacyMessage(MessageTarget $src, int $destNationID, string $text): Message|string
{ {
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$destNation = getNationStaticInfo($destNationID); $destNation = getNationStaticInfo($destNationID);
@@ -107,7 +104,7 @@ class SendMessage extends \sammo\BaseAPI
private function genPrivateMessage(MessageTarget $src, int $destGeneralID, int $permission, string $text): Message|string private function genPrivateMessage(MessageTarget $src, int $destGeneralID, int $permission, string $text): Message|string
{ {
$now = Message::gameNow(); $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31'); $unlimited = new \DateTime('9999-12-31');
$db = DB::db(); $db = DB::db();
@@ -173,8 +170,6 @@ class SendMessage extends \sammo\BaseAPI
return '장수가 없습니다.'; return '장수가 없습니다.';
} }
$penalty = Json::decode($me['penalty'] ?? '{}');
$limitState = checkLimit($me['refresh_score']); $limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) { if ($limitState >= 2) {
return '접속 제한입니다.'; return '접속 제한입니다.';
@@ -192,9 +187,6 @@ class SendMessage extends \sammo\BaseAPI
// 전체 메세지 // 전체 메세지
if ($mailbox === Message::MAILBOX_PUBLIC) { if ($mailbox === Message::MAILBOX_PUBLIC) {
if($penalty[PenaltyKey::NoSendPublicMsg->value] ?? 0) {
return '공개 메세지를 보낼 수 없습니다.';
}
$msgID = $this->genPublicMessage($src, $text)->send(); $msgID = $this->genPublicMessage($src, $text)->send();
return [ return [
'msgType' => 'public', 'msgType' => 'public',
@@ -234,14 +226,8 @@ class SendMessage extends \sammo\BaseAPI
$now = new \DateTime(); $now = new \DateTime();
$lastMsg = new \DateTime($session->lastMsg ?? '0000-00-00'); $lastMsg = new \DateTime($session->lastMsg ?? '0000-00-00');
$msg_interval = $now->getTimestamp() - $lastMsg->getTimestamp(); $msg_interval = $now->getTimestamp() - $lastMsg->getTimestamp();
if ($msg_interval < 2) {
if($penalty[PenaltyKey::NoSendPrivateMsg->value] ?? 0) { return '개인메세지는 2초당 1건만 보낼 수 있습니다!';
return '개인 메세지를 보낼 수 없습니다.';
}
$msg_min_interval = $penalty[PenaltyKey::SendPrivateMsgDelay->value] ?? 2;
if ($msg_interval < $msg_min_interval) {
return "개인메세지는 {$msg_min_interval}초당 1건만 보낼 수 있습니다!";
} }
$session->lastMsg = $now->format('Y-m-d H:i:s'); $session->lastMsg = $now->format('Y-m-d H:i:s');
+1 -1
View File
@@ -50,7 +50,7 @@ class UploadImage extends \sammo\BaseAPI
} }
$extension = ltrim($contentType, 'image/'); $extension = ltrim($contentType, 'image/');
$validExtensions = ['png', 'jpeg', 'jpg', 'gif', 'webp', 'avif']; $validExtensions = ['png', 'jpeg', 'jpg', 'gif', 'webp'];
if (!in_array(strtolower($extension), $validExtensions)) { if (!in_array(strtolower($extension), $validExtensions)) {
return '지원하지 않는 이미지 파일입니다: ' . $contentType; return '지원하지 않는 이미지 파일입니다: ' . $contentType;
} }
+54 -8
View File
@@ -3,12 +3,13 @@
namespace sammo\API\Nation; namespace sammo\API\Nation;
use ArrayObject; use ArrayObject;
use sammo\Command\UserActionCommand;
use sammo\DB; use sammo\DB;
use sammo\DTO\UserAction;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode; use sammo\Enums\GeneralLiteQueryMode;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\General; use sammo\General;
use sammo\GameClock;
use sammo\GeneralLite; use sammo\GeneralLite;
use sammo\Session; use sammo\Session;
use sammo\Util; use sammo\Util;
@@ -118,6 +119,9 @@ class GeneralList extends \sammo\BaseAPI
'reservedCommand' => 1, 'reservedCommand' => 1,
'autorun_limit' => 1, 'autorun_limit' => 1,
'impossibleUserAction' => 1,
'reservedUserAction' => 1,
]; ];
public function validateArgs(): ?string public function validateArgs(): ?string
@@ -154,7 +158,8 @@ class GeneralList extends \sammo\BaseAPI
$me = $db->queryFirstRow( $me = $db->queryFirstRow(
'SELECT refresh_score, turntime, belong, nation, officer_level, permission, penalty FROM `general` 'SELECT refresh_score, turntime, belong, nation, officer_level, permission, penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $session->getUserID() LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i',
$session->getUserID()
); );
$limitState = checkLimit($me['refresh_score']); $limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) { if ($limitState >= 2) {
@@ -265,14 +270,55 @@ class GeneralList extends \sammo\BaseAPI
'honorText' => fn ($rawGeneral) => getHonor($rawGeneral['experience']), 'honorText' => fn ($rawGeneral) => getHonor($rawGeneral['experience']),
'dedLevelText' => fn ($rawGeneral) => getDedLevelText($rawGeneral['dedlevel']), 'dedLevelText' => fn ($rawGeneral) => getDedLevelText($rawGeneral['dedlevel']),
//'0000-00-00 11:23'; //'0000-00-00 11:23';
'turntime' => fn ($rawGeneral) => GameClock::fromStorage($gameStor) 'turntime' => fn ($rawGeneral) => substr($rawGeneral['turntime'], 0, 19),
->formatTick(Util::toInt($rawGeneral['turntime'])), 'recent_war' => fn ($rawGeneral) => substr($rawGeneral['recent_war'], 0, 19),
'recent_war' => fn ($rawGeneral) => $rawGeneral['recent_war'] === null
? null
: GameClock::fromStorage($gameStor)->formatTick(Util::toInt($rawGeneral['recent_war'])),
'bill' => fn ($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']), 'bill' => fn ($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']),
'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null, 'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null,
'autorun_limit' => fn ($rawGeneral) => ($rawGeneral['aux'] ?? [])['autorun_limit'] ?? 0, 'autorun_limit' => fn ($rawGeneral) => ($rawGeneral['aux'] ?? [])['autorun_limit'] ?? 0,
'impossibleUserAction' => function ($rawGeneral) use ($env) {
$rawUserAction = ($rawGeneral['aux'] ?? [])[UserActionCommand::USER_ACTION_KEY] ?? [];
$userAction = UserAction::fromArray($rawUserAction);
$impossibleUserAction = [];
$yearMonth = Util::joinYearMonth($env['year'], $env['month']);
if ($userAction->nextAvailableTurn) {
foreach ($userAction->nextAvailableTurn as $command => $nextAvailableTurn) {
if ($nextAvailableTurn > $yearMonth) {
$impossibleUserAction[] = [$command, $nextAvailableTurn - $yearMonth];
}
}
}
return $impossibleUserAction;
},
'reservedUserAction' => function ($rawGeneral) use ($env) {
$rawUserAction = ($rawGeneral['aux'] ?? [])[UserActionCommand::USER_ACTION_KEY] ?? [];
$userAction = UserAction::fromArray($rawUserAction);
$reservedUserAction = [];
$emptyTurnObj = [
'brief' => '휴식',
'action' => '휴식',
'arg' => [],
];
for($i = 0; $i < 5; $i++){
$reservedUserAction[] = $emptyTurnObj;
}
if ($userAction->reserved) {
foreach ($userAction->reserved as $turnIdx => $reserved) {
if($turnIdx >= 5){
continue;
}
$reservedUserAction[$turnIdx] = [
'brief' => $reserved->brief,
'action' => $reserved->command,
'arg' => [],
];
}
}
return $reservedUserAction;
},
]; ];
foreach ($rankColumns as $rankKey) { foreach ($rankColumns as $rankKey) {
@@ -317,7 +363,7 @@ class GeneralList extends \sammo\BaseAPI
foreach ($rawGeneralList as $rawGeneral) { foreach ($rawGeneralList as $rawGeneral) {
//General 생성? //General 생성?
if (key_exists('aux', $rawGeneral)) { if (key_exists('aux', $rawGeneral)) {
$rawGeneral['aux'] = \sammo\Json::decode($rawGeneral['aux']); $rawGeneral['aux'] = \sammo\JSON::decode($rawGeneral['aux']);
} }
$item = []; $item = [];
+2 -3
View File
@@ -6,8 +6,8 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\GameClock;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\TimeUtil;
use sammo\Validator; use sammo\Validator;
use sammo\WebUtil; use sammo\WebUtil;
@@ -51,9 +51,8 @@ class SetNotice extends \sammo\BaseAPI
$nationID = $me['nation']; $nationID = $me['nation'];
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$gameNow = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow();
$nationStor->nationNotice = [ $nationStor->nationNotice = [
'date'=>$gameNow, 'date'=>TimeUtil::now(),
'msg'=>WebUtil::htmlPurify($msg), 'msg'=>WebUtil::htmlPurify($msg),
'author'=>$me['name'], 'author'=>$me['name'],
'authorID'=>$me['no'], 'authorID'=>$me['no'],
@@ -8,10 +8,10 @@ use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\GameConst; use sammo\GameConst;
use sammo\GameClock;
use sammo\General; use sammo\General;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\TimeUtil;
use sammo\Util; use sammo\Util;
use function sammo\checkLimit; use function sammo\checkLimit;
@@ -39,7 +39,6 @@ class GetReservedCommand extends \sammo\BaseAPI
increaseRefresh("사령부", 1); increaseRefresh("사령부", 1);
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$userID = $session->userID; $userID = $session->userID;
$me = $db->queryFirstRow( $me = $db->queryFirstRow(
@@ -52,8 +51,7 @@ class GetReservedCommand extends \sammo\BaseAPI
$nationID = $me['nation']; $nationID = $me['nation'];
$limitState = checkLimit($me['refresh_score']); $limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) { if ($limitState >= 2) {
$limitTime = GameClock::fromStorage($gameStor)->formatTick(Util::toInt($me['turntime']), true); return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$me['turntime']})";
return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$limitTime})";
} }
$permission = checkSecretPermission($me); $permission = checkSecretPermission($me);
@@ -75,11 +73,6 @@ class GetReservedCommand extends \sammo\BaseAPI
} }
$nationTurnList = []; $nationTurnList = [];
//혹시 정규 턴을 벗어난 턴이 있는지 체크
$invalidUnderTurnList = [];
$invalidOverTurnList = [];
foreach ($db->queryAllLists( foreach ($db->queryAllLists(
'SELECT officer_level, turn_idx, action, arg, brief FROM nation_turn WHERE nation_id = %i ORDER BY officer_level DESC, turn_idx ASC', 'SELECT officer_level, turn_idx, action, arg, brief FROM nation_turn WHERE nation_id = %i ORDER BY officer_level DESC, turn_idx ASC',
$me['nation'] $me['nation']
@@ -87,14 +80,6 @@ class GetReservedCommand extends \sammo\BaseAPI
if (!key_exists($officer_level, $nationTurnList)) { if (!key_exists($officer_level, $nationTurnList)) {
$nationTurnList[$officer_level] = []; $nationTurnList[$officer_level] = [];
} }
if($turn_idx < 0){
$invalidUnderTurnList[$officer_level] = $turn_idx;
$turn_idx += GameConst::$maxChiefTurn;
}
else if($turn_idx >= GameConst::$maxChiefTurn){
$invalidOverTurnList[$officer_level] = $turn_idx;
$turn_idx -= GameConst::$maxChiefTurn;
}
$nationTurnList[$officer_level][$turn_idx] = [ $nationTurnList[$officer_level][$turn_idx] = [
'action' => $action, 'action' => $action,
'brief' => $brief, 'brief' => $brief,
@@ -102,21 +87,6 @@ class GetReservedCommand extends \sammo\BaseAPI
]; ];
} }
if($invalidUnderTurnList){
$db->update(
'nation_turn', [
'turn_idx' => $db->sqleval('`turn_idx` + %i', GameConst::$maxChiefTurn)
], 'nation_id = %i AND officer_level IN %li AND turn_idx < 0', $me['nation'], array_keys($invalidUnderTurnList)
);
}
if($invalidOverTurnList){
$db->update(
'nation_turn', [
'turn_idx' => $db->sqleval('`turn_idx` - %i', GameConst::$maxChiefTurn)
], 'nation_id = %i AND officer_level IN %li AND turn_idx >= %i', $me['nation'], array_keys($invalidOverTurnList), GameConst::$maxChiefTurn
);
}
$troopList = []; $troopList = [];
foreach ($db->queryAllLists( foreach ($db->queryAllLists(
'SELECT troop_leader, `name` FROM troop WHERE `nation` = %i', 'SELECT troop_leader, `name` FROM troop WHERE `nation` = %i',
@@ -158,8 +128,7 @@ class GetReservedCommand extends \sammo\BaseAPI
'year' => $year, 'year' => $year,
'month' => $month, 'month' => $month,
'turnTerm' => $turnTerm, 'turnTerm' => $turnTerm,
'date' => $clock->formatTick($clock->nowTick(), true), 'date' => TimeUtil::now(true),
'clockMode' => $clock->getMode(),
'chiefList' => $nationChiefList, 'chiefList' => $nationChiefList,
'troopList' => $troopList, 'troopList' => $troopList,
'isChief' => ($me['officer_level'] > 4), 'isChief' => ($me['officer_level'] > 4),
+5 -20
View File
@@ -6,9 +6,6 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\GeneralLite;
use sammo\StaticEventHandler;
class ExitTroop extends \sammo\BaseAPI class ExitTroop extends \sammo\BaseAPI
{ {
@@ -27,35 +24,23 @@ class ExitTroop extends \sammo\BaseAPI
$generalID = $session->generalID; $generalID = $session->generalID;
$db = DB::db(); $db = DB::db();
$me = GeneralLite::createObjFromDB($generalID, ['troop'], GeneralLiteQueryMode::Lite); $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID);
if (!$me) {
return '장수 정보를 불러올 수 없습니다.';
}
$troopID = $me->getVar('troop');
if($troopID == 0){ if($troopID == 0){
return '부대에 소속되어 있지 않습니다.'; return '부대에 소속되어 있지 않습니다.';
} }
if($troopID != $generalID){ if($generalID != $troopID){
StaticEventHandler::handleEvent($me, null, $this::class, [ $db->update('general', [
"isTroopLeader" => false, 'troop' => 0,
], $this->args); ], '`no` = %i', $generalID);
$me->setVar('troop', 0);
$me->applyDB($db);
return null; return null;
} }
//부대장이다. //부대장이다.
StaticEventHandler::handleEvent($me, null, $this::class, [
"isTroopLeader" => true,
], $this->args);
$db->update('general', [ $db->update('general', [
'troop' => 0, 'troop' => 0,
], '`troop` = %i', $troopID); ], '`troop` = %i', $troopID);
$db->delete('troop', 'troop_leader = %i', $troopID); $db->delete('troop', 'troop_leader = %i', $troopID);
$me->setVar('troop', 0);
$me->applyDB($db);
return null; return null;
} }
+9 -17
View File
@@ -6,9 +6,6 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\GeneralLite;
use sammo\StaticEventHandler;
use sammo\StringUtil; use sammo\StringUtil;
use sammo\Validator; use sammo\Validator;
@@ -35,22 +32,16 @@ class JoinTroop extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$generalID = $session->generalID; $userID = $session->userID;
$troopID = $this->args['troopID']; $troopID = $this->args['troopID'];
$db = DB::db(); $db = DB::db();
$me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
$me = GeneralLite::createObjFromDB($generalID, ['troop'], GeneralLiteQueryMode::Lite); if ($me['troop'] != 0) {
if(!$me){
return '장수 정보를 불러올 수 없습니다.';
}
if($me->getVar('troop') != 0){
return '이미 부대에 소속되어 있습니다.'; return '이미 부대에 소속되어 있습니다.';
} }
$nationID = $me['nation'];
$nationID = $me->getNationID(); if ($nationID == 0) {
if($nationID == 0){
return '국가에 소속되어 있지 않습니다.'; return '국가에 소속되어 있지 않습니다.';
} }
@@ -58,10 +49,11 @@ class JoinTroop extends \sammo\BaseAPI
if (!$troopExists) { if (!$troopExists) {
return '부대가 올바르지 않습니다.'; return '부대가 올바르지 않습니다.';
} }
$generalID = $me['no'];
$me->setVar('troop', $troopID); $db->update('general', [
StaticEventHandler::handleEvent($me, null, $this::class, [], $this->args); 'troop' => $troopID,
$me->applyDB($db); ], '`no` = %i AND `troop` = %i', $generalID, 0);
return null; return null;
} }
+4 -9
View File
@@ -6,9 +6,6 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\GeneralLite;
use sammo\StaticEventHandler;
use sammo\Validator; use sammo\Validator;
class KickFromTroop extends \sammo\BaseAPI class KickFromTroop extends \sammo\BaseAPI
@@ -40,8 +37,7 @@ class KickFromTroop extends \sammo\BaseAPI
$generalID = $this->args['generalID']; $generalID = $this->args['generalID'];
$db = DB::db(); $db = DB::db();
$destGeneral = GeneralLite::createObjFromDB($generalID, ['troop'], GeneralLiteQueryMode::Lite); $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID);
$troopID = $destGeneral->getVar('troop');
if($troopID == 0){ if($troopID == 0){
return '부대에 소속되어 있지 않습니다.'; return '부대에 소속되어 있지 않습니다.';
} }
@@ -54,10 +50,9 @@ class KickFromTroop extends \sammo\BaseAPI
return '부대장을 추방할 수 없습니다.'; return '부대장을 추방할 수 없습니다.';
} }
StaticEventHandler::handleEvent($destGeneral, null, $this::class, [], $this->args); $db->update('general', [
$destGeneral->setVar('troop', 0); 'troop' => 0,
$destGeneral->applyDB($db); ], '`no` = %i AND `troop` = %i', $generalID, $troopID);
return null; return null;
} }
} }
+9 -11
View File
@@ -6,9 +6,6 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\GeneralLite;
use sammo\StaticEventHandler;
use sammo\StringUtil; use sammo\StringUtil;
use sammo\Validator; use sammo\Validator;
@@ -35,23 +32,24 @@ class NewTroop extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$generalID = $session->generalID; $userID = $session->userID;
$troopName = StringUtil::neutralize($this->args['troopName']); $troopName = StringUtil::neutralize($this->args['troopName']);
if(!$troopName){ if(!$troopName){
return '부대 이름이 없습니다.'; return '부대 이름이 없습니다.';
} }
$db = DB::db(); $db = DB::db();
$me = GeneralLite::createObjFromDB($generalID, ['troop'], GeneralLiteQueryMode::Lite); $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
$troopID = $me->getVar('troop'); if($me['troop'] != 0){
if($troopID != 0){
return '이미 부대에 소속되어 있습니다.'; return '이미 부대에 소속되어 있습니다.';
} }
$nationID = $me->getNationID(); $nationID = $me['nation'];
if($nationID == 0){ if($nationID == 0){
return '국가에 소속되어 있지 않습니다.'; return '국가에 소속되어 있지 않습니다.';
} }
$generalID = $me['no'];
$db->insert('troop', [ $db->insert('troop', [
'name'=>$troopName, 'name'=>$troopName,
'troop_leader'=>$generalID, 'troop_leader'=>$generalID,
@@ -62,9 +60,9 @@ class NewTroop extends \sammo\BaseAPI
return '부대가 생성되지 않았습니다. 버그일 수 있습니다.'; return '부대가 생성되지 않았습니다. 버그일 수 있습니다.';
} }
$me->setVar('troop', $generalID); $db->update('general', [
StaticEventHandler::handleEvent($me, null, $this::class, [], $this->args); 'troop'=>$generalID
$me->applyDB($db); ], '`no` = %i', $generalID);
return null; return null;
} }
+5 -8
View File
@@ -6,9 +6,6 @@ use sammo\Session;
use DateTimeInterface; use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\GeneralLite;
use sammo\StaticEventHandler;
use sammo\StringUtil; use sammo\StringUtil;
use sammo\Validator; use sammo\Validator;
@@ -39,12 +36,13 @@ class SetTroopName extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$generalID = $session->generalID; $userID = $session->userID;
$db = DB::db(); $db = DB::db();
$me = GeneralLite::createObjFromDB($generalID, ['troop', 'permission', 'penalty'], GeneralLiteQueryMode::Lite); $me = $db->queryFirstRow('SELECT `no`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
$permission = checkSecretPermission($me->getRaw(), false); $permission = checkSecretPermission($me, false);
$troopID = $this->args['troopID']; $troopID = $this->args['troopID'];
$generalID = $me['no'];
if($generalID != $troopID && $permission < 4){ if($generalID != $troopID && $permission < 4){
return "권한이 부족합니다."; return "권한이 부족합니다.";
} }
@@ -54,7 +52,7 @@ class SetTroopName extends \sammo\BaseAPI
return '부대 이름이 없습니다.'; return '부대 이름이 없습니다.';
} }
$nationID = $me->getNationID(); $nationID = $me['nation'];
$db->update('troop', [ $db->update('troop', [
'name'=>$troopName 'name'=>$troopName
], 'troop_leader=%i AND `nation`=%i',$troopID, $nationID); ], 'troop_leader=%i AND `nation`=%i',$troopID, $nationID);
@@ -62,7 +60,6 @@ class SetTroopName extends \sammo\BaseAPI
if($db->affectedRows() == 0){ if($db->affectedRows() == 0){
return '부대가 없습니다.'; return '부대가 없습니다.';
} }
StaticEventHandler::handleEvent($me, null, $this::class, [], $this->args);
return null; return null;
} }
+3 -4
View File
@@ -10,9 +10,8 @@ use sammo\Enums\GeneralLiteQueryMode;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\General; use sammo\General;
use sammo\GeneralLite; use sammo\GeneralLite;
use sammo\GameClock;
use sammo\KVStorage;
use sammo\Session; use sammo\Session;
use sammo\TimeUtil;
use sammo\Validator; use sammo\Validator;
class AddComment extends \sammo\BaseAPI class AddComment extends \sammo\BaseAPI
@@ -48,8 +47,7 @@ class AddComment extends \sammo\BaseAPI
$generalName = $general->getName(); $generalName = $general->getName();
$nationID = $general->getNationID(); $nationID = $general->getNationID();
$nationName = $general->getStaticNation()['name']; $nationName = $general->getStaticNation()['name'];
$db = DB::db(); $date = TimeUtil::now();
$date = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'))->formatNow();
$comment = new VoteComment( $comment = new VoteComment(
@@ -63,6 +61,7 @@ class AddComment extends \sammo\BaseAPI
date: $date date: $date
); );
$db = DB::db();
$db->insert('vote_comment', $comment->toArray()); $db->insert('vote_comment', $comment->toArray());
return null; return null;
+1 -6
View File
@@ -8,7 +8,6 @@ use sammo\DB;
use sammo\DTO\VoteComment; use sammo\DTO\VoteComment;
use sammo\DTO\VoteInfo; use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\GameClock;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\Validator; use sammo\Validator;
@@ -36,16 +35,13 @@ class GetVoteDetail extends \sammo\BaseAPI
{ {
$voteID = $this->args['voteID']; $voteID = $this->args['voteID'];
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
$rawVote = $voteStor->getValue("vote_{$voteID}"); $rawVote = $voteStor->getValue("vote_{$voteID}");
if (!$rawVote) { if (!$rawVote) {
return '설문조사가 없습니다.'; return '설문조사가 없습니다.';
} }
$rawVote = VoteInfo::normalizeGameStorage($rawVote, $clock); $voteInfo = VoteInfo::fromArray($rawVote);
$voteInfo = VoteInfo::fromGameStorage($rawVote, $clock);
$isOpen = $rawVote['endTick'] === null || $rawVote['endTick'] >= $clock->nowTick();
$votes = array_map(fn ($arr) => [Json::decode($arr[0]), $arr[1]], $db->queryAllLists( $votes = array_map(fn ($arr) => [Json::decode($arr[0]), $arr[1]], $db->queryAllLists(
@@ -74,7 +70,6 @@ class GetVoteDetail extends \sammo\BaseAPI
'comments' => $comments, 'comments' => $comments,
'myVote' => $myVote, 'myVote' => $myVote,
'userCnt' => $userCnt, 'userCnt' => $userCnt,
'isOpen' => $isOpen,
]; ];
} }
} }
+3 -5
View File
@@ -6,7 +6,6 @@ use DateTimeInterface;
use sammo\DB; use sammo\DB;
use sammo\DTO\VoteInfo; use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\GameClock;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\Session; use sammo\Session;
@@ -26,17 +25,16 @@ class GetVoteList extends \sammo\BaseAPI
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{ {
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
$votes = []; $votes = [];
foreach($voteStor->getAll() as $voteKey => $rawVote){ foreach($voteStor->getAll() as $voteKey => $rawVote){
if(preg_match('/^vote_(\d+)$/D', $voteKey, $matches) !== 1){ if(!str_starts_with($voteKey, 'vote_')){
continue; continue;
} }
$voteID = (int)$matches[1]; $voteID = (int)substr($voteKey, 5);
$votes[$voteID] = VoteInfo::fromGameStorage($rawVote, $clock); $votes[$voteID] = VoteInfo::fromArray($rawVote);
} }
return [ return [
+14 -23
View File
@@ -7,9 +7,8 @@ use sammo\DB;
use sammo\DTO\VoteInfo; use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\RootDB;
use sammo\Session; use sammo\Session;
use sammo\GameClock; use sammo\TimeUtil;
use sammo\Util; use sammo\Util;
use sammo\Validator; use sammo\Validator;
@@ -37,7 +36,7 @@ class NewVote extends \sammo\BaseAPI
return null; return null;
} }
function closeOldVote(int $voteID, KVStorage $voteStor, GameClock $clock) function closeOldVote(int $voteID, KVStorage $voteStor)
{ {
$db = DB::db(); $db = DB::db();
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
@@ -45,14 +44,13 @@ class NewVote extends \sammo\BaseAPI
if (!$rawLastVoteInfo) { if (!$rawLastVoteInfo) {
return; return;
} }
$rawLastVoteInfo = VoteInfo::normalizeGameStorage($rawLastVoteInfo, $clock); $lastVoteInfo = VoteInfo::fromArray($rawLastVoteInfo);
if ($rawLastVoteInfo['endTick'] !== null) { if ($lastVoteInfo->endDate) {
return; return;
} }
$rawLastVoteInfo['endTick'] = $clock->nowTick(); $lastVoteInfo->endDate = TimeUtil::now();
$rawLastVoteInfo['endDate'] = $clock->formatTick($rawLastVoteInfo['endTick']); $voteStor->setValue("vote_{$voteID}", $lastVoteInfo->toArray());
$voteStor->setValue("vote_{$voteID}", $rawLastVoteInfo);
} }
function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
@@ -72,11 +70,7 @@ class NewVote extends \sammo\BaseAPI
$multipleOptions = 0; $multipleOptions = 0;
} }
$db = DB::db(); $now = TimeUtil::now();
$gameStor = KVStorage::getStorage($db, 'game_env');
$clock = GameClock::fromStorage($gameStor);
$nowTick = $clock->nowTick();
$now = $clock->formatTick($nowTick);
/** @var ?string */ /** @var ?string */
$endDate = $this->args['endDate'] ?? null; $endDate = $this->args['endDate'] ?? null;
/** @var string[] */ /** @var string[] */
@@ -88,9 +82,9 @@ class NewVote extends \sammo\BaseAPI
if($endDate !== null){ if($endDate !== null){
try{ try{
$oNow = new \DateTimeImmutable($now);
$oEndDate = new \DateTimeImmutable($endDate); $oEndDate = new \DateTimeImmutable($endDate);
$endTick = $clock->dateTimeToTick($oEndDate); if($oEndDate < $oNow){
if($endTick < $nowTick){
return '종료일이 이미 지났습니다.'; return '종료일이 이미 지났습니다.';
} }
} }
@@ -99,7 +93,9 @@ class NewVote extends \sammo\BaseAPI
} }
} }
$userName = $session->userName; $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$lastVote = $gameStor->getValue('lastVote') ?? 0; $lastVote = $gameStor->getValue('lastVote') ?? 0;
$voteID = $lastVote + 1; $voteID = $lastVote + 1;
@@ -107,26 +103,21 @@ class NewVote extends \sammo\BaseAPI
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
if (!($this->args['keepOldVote'] ?? false)) { if (!($this->args['keepOldVote'] ?? false)) {
$this->closeOldVote($lastVote, $voteStor, $clock); $this->closeOldVote($lastVote, $voteStor);
} }
$multipleOptions = Util::valueFit($multipleOptions, 0, count($options)); $multipleOptions = Util::valueFit($multipleOptions, 0, count($options));
$voteInfo = new VoteInfo( $voteInfo = new VoteInfo(
id: $voteID, id: $voteID,
title: $title, title: $title,
opener: $userName ?? '[SYSTEM]',
multipleOptions: $multipleOptions, multipleOptions: $multipleOptions,
startDate: $now, startDate: $now,
endDate: $endDate, endDate: $endDate,
options: $options, options: $options,
); );
$voteStor->setValue("vote_{$voteID}", $voteInfo->toArray() + [ $voteStor->setValue("vote_{$voteID}", $voteInfo->toArray());
'startTick' => $nowTick,
'endTick' => $endDate === null ? null : $clock->dateTimeToTick(new \DateTimeImmutable($endDate)),
]);
$gameStor->setValue('lastVote', $voteID); $gameStor->setValue('lastVote', $voteID);
$db->update('general', [ $db->update('general', [
+2 -5
View File
@@ -8,7 +8,6 @@ use sammo\DTO\VoteInfo;
use sammo\Enums\APIRecoveryType; use sammo\Enums\APIRecoveryType;
use sammo\Enums\GeneralQueryMode; use sammo\Enums\GeneralQueryMode;
use sammo\General; use sammo\General;
use sammo\GameClock;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\LiteHashDRBG; use sammo\LiteHashDRBG;
@@ -55,17 +54,15 @@ class Vote extends \sammo\BaseAPI
return '선택한 항목이 없습니다.'; return '선택한 항목이 없습니다.';
} }
$db = DB::db(); $db = DB::db();
$clock = GameClock::fromStorage(KVStorage::getStorage($db, 'game_env'));
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
$rawVoteInfo = $voteStor->getValue("vote_{$voteID}"); $rawVoteInfo = $voteStor->getValue("vote_{$voteID}");
if (!$rawVoteInfo) { if (!$rawVoteInfo) {
return '설문조사가 없습니다.'; return '설문조사가 없습니다.';
} }
$rawVoteInfo = VoteInfo::normalizeGameStorage($rawVoteInfo, $clock); $voteInfo = VoteInfo::fromArray($rawVoteInfo);
$voteInfo = VoteInfo::fromGameStorage($rawVoteInfo, $clock);
if ($rawVoteInfo['endTick'] !== null && $rawVoteInfo['endTick'] < $clock->nowTick()) { if ($voteInfo->endDate && $voteInfo->endDate < new \DateTimeImmutable()) {
return '설문조사가 종료되었습니다.'; return '설문조사가 종료되었습니다.';
} }
+8 -12
View File
@@ -8,11 +8,6 @@ use sammo\Util;
abstract class AbsFromUserPool extends AbsGeneralPool{ abstract class AbsFromUserPool extends AbsGeneralPool{
protected static function getCandidateWeight(array $info, int $owner): int|float
{
return array_sum($info['dex'] ?? []);
}
public function occupyGeneralName(): bool public function occupyGeneralName(): bool
{ {
$generalID = $this->getGeneralBuilder()->getGeneralID(); $generalID = $this->getGeneralBuilder()->getGeneralID();
@@ -30,9 +25,8 @@ abstract class AbsFromUserPool extends AbsGeneralPool{
} }
static public function pickGeneralFromPool(\MeekroDB $db, RandUtil $rng, int $owner, int $pickCnt, ?string $prefix=null):array{ static public function pickGeneralFromPool(\MeekroDB $db, RandUtil $rng, int $owner, int $pickCnt, ?string $prefix=null):array{
$gameStor = KVStorage::getStorage($db, 'game_env'); $oNow = new \DateTimeImmutable();
$clock = GameClock::fromStorage($gameStor); $now = $oNow->format('Y-m-d H:i:s');
$now = $clock->nowTick();
$db->update('select_pool', [ $db->update('select_pool', [
'reserved_until'=>null, 'reserved_until'=>null,
@@ -42,15 +36,17 @@ abstract class AbsFromUserPool extends AbsGeneralPool{
$pool = []; $pool = [];
foreach($db->query('SELECT id, unique_name, info FROM select_pool WHERE reserved_until IS NULL AND general_id IS NULL', $pickCnt) as $cand){ foreach($db->query('SELECT id, unique_name, info FROM select_pool WHERE reserved_until IS NULL AND general_id IS NULL', $pickCnt) as $cand){
$cand['info'] = Json::decode($cand['info']); $cand['info'] = Json::decode($cand['info']);
$pool[] = [$cand, static::getCandidateWeight($cand['info'], $owner)]; $dexTotal = array_sum($cand['info']['dex']);
$pool[] = [$cand, $dexTotal];
} }
if(count($pool) < $pickCnt){ if(count($pool) < $pickCnt){
throw new \RuntimeException('pool 부족'); throw new \RuntimeException('pool 부족');
} }
$result = []; $gameStor = KVStorage::getStorage($db, 'game_env');
$validUntil = $now + GameClock::TICKS_PER_TURN * 2; $result = [];
$validUntil = TimeUtil::nowAddMinutes(2 * $gameStor->turnterm);
while(count($result) < $pickCnt){ while(count($result) < $pickCnt){
$cand = $rng->choiceUsingWeightPair($pool); $cand = $rng->choiceUsingWeightPair($pool);
$poolID = $cand['id']; $poolID = $cand['id'];
@@ -73,4 +69,4 @@ abstract class AbsFromUserPool extends AbsGeneralPool{
return array_values($result); return array_values($result);
} }
} }

Some files were not shown because too many files have changed in this diff Show More