Compare commits

...
38 Commits
Author SHA1 Message Date
Hide_D 6282445f7d feat: 토너먼트 베팅에서 모든 NPC가 10원씩 베팅함
- 추가로 베팅 공지
2021-11-16 23:12:32 +09:00
Hide_D bf244533f7 game: 국력, 랜임 계산식에서 유저장 전투력 계수를 NPC의 1.5로 설정 2021-11-16 22:40:47 +09:00
Hide_D 5ebfaf24ee feat: 토너먼트 비중을 강제로 조정 2021-11-16 22:18:29 +09:00
Hide_D 0c0283dc02 feat: '능동 행동 수' 유산 포인트 추가
- 거병, 건국, 방량, 선양, 모반
- 임관, 랜덤임관, 장수대상임관, 등용수락, 하야
- 출병(500명 이상, 훈사 7070 초과)
- 인재탐색 성공(난도에 따라 추가 보정)
- 첩보(예외, 0.5)
- 증축, 감축, 국기변경, 국호변경, 천도성공
2021-11-16 21:38:55 +09:00
Hide_D 375b08be87 feat: NPC정책 최대 포상량 지정 2021-11-16 20:45:16 +09:00
Hide_D cbc8f94b0a game: 국고가 2000 밑으로 가더라도 무조건 물자조달만 하지는 않게 수정정 2021-11-16 20:01:50 +09:00
Hide_D bdac8d163d game: 전특 요구 포인트 감소, 버프 요구 포인트 감소 2021-11-16 19:37:16 +09:00
Hide_D 1f61f37841 fix: 토큰 갱신 시 UserID가 잘못된 버그 수정정 2021-11-14 22:55:37 +09:00
Hide_D 51d523ae72 game: 국력 계산식에 랜덤임관 계산식 일부를 반영 2021-11-14 18:45:28 +09:00
Hide_D 3f9e4962e6 fix: 서버 정지로 의심되는 opcache_reset 해제
- 현재 validate timestamp를 켜서 사용하도록 유도
2021-11-14 13:31:30 +09:00
Hide_D f8fc4fe56b misc: 미활용 함수/상수 제거 2021-11-14 13:20:19 +09:00
Hide_D fb64b7e412 feat: NPC 거병, 이동 로직 대폭 개선
- 근처에 세울 도시를 보고 거병
- 원하는 도시를 정하고 그 도시를 향해 이동
2021-11-14 05:06:39 +09:00
Hide_D 3209cfbc45 fix: warning 제거거 2021-11-14 04:15:04 +09:00
Hide_D 8a99476136 game: 랜덤임관 평가 기준 변경
- 전투 기준을 총 전투 대신 대인 전투로
- 내정 능력에 무력, 지력 비율 반영영
2021-11-14 02:51:40 +09:00
Hide_D eb80f8d111 feat: 자율행동 표기를 휴식(자율행동)으로 변경 2021-11-14 02:47:53 +09:00
Hide_D afde3ce54d game: 랜덤임관 가중치 변경 2021-11-14 02:39:09 +09:00
Hide_D c4b61fec17 game: 작위 보상에도 최대 보유 유니크 수 적용 2021-11-14 00:50:09 +09:00
Hide_D 0b74abf300 game: 랜덤임관 로직에 전투력과 내정능력을 적극적으로 반영영 2021-11-14 00:46:46 +09:00
Hide_D e6c3c9f1d4 fix: 자율턴에서 '월' 표기 빠짐 2021-11-13 16:48:49 +09:00
Hide_D 4e7560b4ed feat: 자율행동 휴식을 명시적으로 자율행동으로 표기 2021-11-13 16:37:47 +09:00
Hide_D 542491b278 feat: 자율턴 한계 표기 2021-11-13 16:33:11 +09:00
Hide_D d36439355d fix: 자율행동턴 시간 제한이 동작하지 않던 버그 수정 2021-11-13 16:05:03 +09:00
Hide_D 4a80815b39 game: 기간별 최대 유니크 획득 수 변경경 2021-11-13 02:25:52 +09:00
Hide_D 6dc57f2566 fix: 자동로그인 과정 버그 수정정 2021-11-11 00:37:29 +09:00
Hide_D 07e8511ce1 game: snipe_combat 제거거 2021-11-08 23:31:56 +09:00
Hide_D 8e927831f5 fix: dummySession 인자 수정정 2021-11-08 23:27:37 +09:00
Hide_D 2c533d2ab3 dep: package update 2021-11-08 16:10:01 +09:00
Hide_D 38208750e7 game: 수비자는 전멸 시 증가하는 사기량을 50%만 적용 2021-11-08 15:20:23 +09:00
Hide_D df14d7c306 game: 반계 효과 유니크 시도 확률 반감 2021-11-08 15:16:15 +09:00
Hide_D b3612db7d2 game: 피장파장 턴을 60턴 기준으로 변경(72턴 동일) 2021-11-08 15:11:24 +09:00
Hide_D 8d90da659e game: 피장파장 딜레이를 최소 72턴으로로 2021-11-08 15:10:45 +09:00
Hide_D f8ddbc0622 game: 종횡가 전략 딜레이를 1/2에서 3/4으로로 2021-11-08 15:08:21 +09:00
Hide_D 673b7054aa 자동 로그인 (#196)
자동 로그인 구현

- login_token 테이블
- reqNonce -> loginByToken
- sha512(token + nonce)

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/196
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-11-08 04:23:07 +09:00
Hide_D 1472cbf257 game: 장비매매 시 도구 유니크 덮어지지 않게 2021-10-29 02:21:53 +09:00
Hide_D d806935c58 fix: 작위 보상이 군주인 경우 반영이 안되는 버그 수정 2021-10-27 02:04:10 +09:00
Hide_D 6b56eb79e1 fix: 403 페이지 redirect 버그 수정 2021-10-27 01:29:19 +09:00
Hide_D d2aea16744 balance: 초기 +5%, -2% 추가가 2021-10-16 21:50:41 +09:00
Hide_D bb800f032e balance: 쌍무쌍 적용 불가, 무쌍 중반 이후 대폭 너프프 2021-10-16 21:22:28 +09:00
849 changed files with 6065 additions and 21672 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<title>닫혀 있습니다.</title> <title>닫혀 있습니다.</title>
<script> <script>
setTimeout(function(){ setTimeout(function(){
window.location = window.location+'/../'; window.location.href = '../';
}, 5000); }, 5000);
</script> </script>
<style> <style>
+1 -2
View File
@@ -8,7 +8,7 @@
], ],
"config": { "config": {
"platform": { "platform": {
"php": "7.4" "php": "8.0"
} }
}, },
"require": { "require": {
@@ -16,7 +16,6 @@
"sergeytsalkov/meekrodb": "^2.3", "sergeytsalkov/meekrodb": "^2.3",
"league/plates": "^3.3", "league/plates": "^3.3",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^6.3",
"scssphp/scssphp": "^1.0",
"monolog/monolog": "^1.23", "monolog/monolog": "^1.23",
"firephp/firephp-core": "^0.4.0", "firephp/firephp-core": "^0.4.0",
"vlucas/valitron": "^1.4", "vlucas/valitron": "^1.4",
Generated
+214 -221
View File
@@ -4,7 +4,7 @@
"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": "317938cff7b30806f4e385a70f4943fc", "content-hash": "94cfbcb22b9f475e421ad5009391006f",
"packages": [ "packages": [
{ {
"name": "brandonwamboldt/utilphp", "name": "brandonwamboldt/utilphp",
@@ -122,16 +122,16 @@
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
"version": "3.2.5", "version": "3.2.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/semver.git", "url": "https://github.com/composer/semver.git",
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" "reference": "83e511e247de329283478496f7a1e114c9517506"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506",
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "reference": "83e511e247de329283478496f7a1e114c9517506",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -183,7 +183,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/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.2.5" "source": "https://github.com/composer/semver/tree/3.2.6"
}, },
"funding": [ "funding": [
{ {
@@ -199,7 +199,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-05-24T12:41:47+00:00" "time": "2021-10-25T11:34:17+00:00"
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
@@ -267,34 +267,30 @@
}, },
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
"version": "2.0.3", "version": "2.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/inflector.git", "url": "https://github.com/doctrine/inflector.git",
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^7.0", "doctrine/coding-standard": "^8.2",
"phpstan/phpstan": "^0.11", "phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.11", "phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.11", "phpstan/phpstan-strict-rules": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"vimeo/psalm": "^4.10"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Doctrine\\Inflector\\": "lib/Doctrine/Inflector" "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
@@ -342,7 +338,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.x" "source": "https://github.com/doctrine/inflector/tree/2.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -358,7 +354,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2020-05-29T15:13:26+00:00" "time": "2021-10-22T20:16:43+00:00"
}, },
{ {
"name": "erusev/parsedown", "name": "erusev/parsedown",
@@ -674,16 +670,16 @@
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "1.4.1", "version": "1.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -695,7 +691,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.4-dev" "dev-master": "1.5-dev"
} }
}, },
"autoload": { "autoload": {
@@ -711,10 +707,25 @@
"MIT" "MIT"
], ],
"authors": [ "authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{ {
"name": "Michael Dowling", "name": "Michael Dowling",
"email": "mtdowling@gmail.com", "email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling" "homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
} }
], ],
"description": "Guzzle promises library", "description": "Guzzle promises library",
@@ -723,22 +734,36 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.4.1" "source": "https://github.com/guzzle/promises/tree/1.5.1"
}, },
"time": "2021-03-07T09:25:29+00:00" "funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
"type": "tidelift"
}
],
"time": "2021-10-22T20:56:57+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "1.8.2", "version": "1.8.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "dc960a912984efb74d0a90222870c72c87f10c91" "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
"reference": "dc960a912984efb74d0a90222870c72c87f10c91", "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -775,13 +800,34 @@
"MIT" "MIT"
], ],
"authors": [ "authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{ {
"name": "Michael Dowling", "name": "Michael Dowling",
"email": "mtdowling@gmail.com", "email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling" "homepage": "https://github.com/mtdowling"
}, },
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{ {
"name": "Tobias Schultze", "name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion" "homepage": "https://github.com/Tobion"
} }
], ],
@@ -798,22 +844,36 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.8.2" "source": "https://github.com/guzzle/psr7/tree/1.8.3"
}, },
"time": "2021-04-26T09:17:50+00:00" "funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"time": "2021-10-05T13:56:00+00:00"
}, },
{ {
"name": "illuminate/bus", "name": "illuminate/bus",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/bus.git", "url": "https://github.com/illuminate/bus.git",
"reference": "808097c0dfd893309bd77b00139586c516b965c9" "reference": "be400399687b97d5558a224e970060fd5d5f2735"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/bus/zipball/808097c0dfd893309bd77b00139586c516b965c9", "url": "https://api.github.com/repos/illuminate/bus/zipball/be400399687b97d5558a224e970060fd5d5f2735",
"reference": "808097c0dfd893309bd77b00139586c516b965c9", "reference": "be400399687b97d5558a224e970060fd5d5f2735",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -853,20 +913,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": "2021-08-10T16:49:48+00:00" "time": "2021-10-21T19:19:36+00:00"
}, },
{ {
"name": "illuminate/collections", "name": "illuminate/collections",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/collections.git", "url": "https://github.com/illuminate/collections.git",
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d" "reference": "05f286ec5fd2dd286e8384577047efc375c8954c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/18fa841df912ec56849351dd6ca8928e8a98b69d", "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c",
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d", "reference": "05f286ec5fd2dd286e8384577047efc375c8954c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -907,20 +967,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": "2021-09-08T12:48:16+00:00" "time": "2021-10-22T18:01:46+00:00"
}, },
{ {
"name": "illuminate/container", "name": "illuminate/container",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/container.git", "url": "https://github.com/illuminate/container.git",
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0" "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/container/zipball/862b64ea4ab56e307a1676104a1b93295d347ad0", "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d",
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0", "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -958,20 +1018,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": "2021-09-09T13:55:23+00:00" "time": "2021-09-15T14:32:50+00:00"
}, },
{ {
"name": "illuminate/contracts", "name": "illuminate/contracts",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/contracts.git", "url": "https://github.com/illuminate/contracts.git",
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913" "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1006,20 +1066,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": "2021-09-08T12:09:40+00:00" "time": "2021-10-22T18:01:46+00:00"
}, },
{ {
"name": "illuminate/database", "name": "illuminate/database",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/database.git", "url": "https://github.com/illuminate/database.git",
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693" "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/acc11d6839ddb3b694bc6585177fa5141b70c693", "url": "https://api.github.com/repos/illuminate/database/zipball/43c7ffb6299ae55b000b286cf1278afd268ef29f",
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693", "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1033,7 +1093,7 @@
"symfony/console": "^5.1.4" "symfony/console": "^5.1.4"
}, },
"suggest": { "suggest": {
"doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).",
"fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
"illuminate/console": "Required to use the database commands (^8.0).", "illuminate/console": "Required to use the database commands (^8.0).",
"illuminate/events": "Required to use the observers with Eloquent (^8.0).", "illuminate/events": "Required to use the observers with Eloquent (^8.0).",
@@ -1074,20 +1134,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": "2021-09-13T18:43:43+00:00" "time": "2021-10-29T19:46:53+00:00"
}, },
{ {
"name": "illuminate/events", "name": "illuminate/events",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/events.git", "url": "https://github.com/illuminate/events.git",
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e" "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/events/zipball/7def78033f29cd0c0383513b27c291d233a7f90e", "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d",
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e", "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1129,11 +1189,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": "2021-08-16T21:45:47+00:00" "time": "2021-09-15T14:32:50+00:00"
}, },
{ {
"name": "illuminate/macroable", "name": "illuminate/macroable",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/macroable.git", "url": "https://github.com/illuminate/macroable.git",
@@ -1179,7 +1239,7 @@
}, },
{ {
"name": "illuminate/pipeline", "name": "illuminate/pipeline",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/pipeline.git", "url": "https://github.com/illuminate/pipeline.git",
@@ -1227,16 +1287,16 @@
}, },
{ {
"name": "illuminate/support", "name": "illuminate/support",
"version": "v8.61.0", "version": "v8.69.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/support.git", "url": "https://github.com/illuminate/support.git",
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30" "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/b0a21c41163381dd9a5abbd68fe85ed7b4247d30", "url": "https://api.github.com/repos/illuminate/support/zipball/a8851b7001530d3c11626a81449ed9b63dd10db7",
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30", "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1246,7 +1306,7 @@
"illuminate/collections": "^8.0", "illuminate/collections": "^8.0",
"illuminate/contracts": "^8.0", "illuminate/contracts": "^8.0",
"illuminate/macroable": "^8.0", "illuminate/macroable": "^8.0",
"nesbot/carbon": "^2.31", "nesbot/carbon": "^2.53.1",
"php": "^7.3|^8.0", "php": "^7.3|^8.0",
"voku/portable-ascii": "^1.4.8" "voku/portable-ascii": "^1.4.8"
}, },
@@ -1255,8 +1315,8 @@
}, },
"suggest": { "suggest": {
"illuminate/filesystem": "Required to use the composer class (^8.0).", "illuminate/filesystem": "Required to use the composer class (^8.0).",
"league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0).", "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).",
"ramsey/uuid": "Required to use Str::uuid() (^4.0).", "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).",
"symfony/process": "Required to use the composer class (^5.1.4).", "symfony/process": "Required to use the composer class (^5.1.4).",
"symfony/var-dumper": "Required to use the dd function (^5.1.4).", "symfony/var-dumper": "Required to use the dd function (^5.1.4).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
@@ -1291,7 +1351,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": "2021-09-13T18:43:43+00:00" "time": "2021-10-29T13:34:03+00:00"
}, },
{ {
"name": "league/plates", "name": "league/plates",
@@ -1490,16 +1550,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.53.1", "version": "2.54.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5",
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045", "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1510,6 +1570,7 @@
"symfony/translation": "^3.4 || ^4.0 || ^5.0" "symfony/translation": "^3.4 || ^4.0 || ^5.0"
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.0 || ^3.0",
"doctrine/orm": "^2.7", "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",
@@ -1580,7 +1641,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-09-06T09:29:23+00:00" "time": "2021-11-01T21:22:20+00:00"
}, },
{ {
"name": "netresearch/jsonmapper", "name": "netresearch/jsonmapper",
@@ -1773,20 +1834,20 @@
}, },
{ {
"name": "nette/utils", "name": "nette/utils",
"version": "v3.2.2", "version": "v3.2.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/utils.git", "url": "https://github.com/nette/utils.git",
"reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", "url": "https://api.github.com/repos/nette/utils/zipball/9cd80396ca58d7969ab44fc7afcf03624dfa526e",
"reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2 <8.1" "php": ">=7.2 <8.2"
}, },
"conflict": { "conflict": {
"nette/di": "<3.0.6" "nette/di": "<3.0.6"
@@ -1852,9 +1913,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/utils/issues", "issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v3.2.2" "source": "https://github.com/nette/utils/tree/v3.2.5"
}, },
"time": "2021-03-03T22:53:25+00:00" "time": "2021-09-20T10:50:11+00:00"
}, },
{ {
"name": "pguardiario/phpuri", "name": "pguardiario/phpuri",
@@ -2110,16 +2171,16 @@
}, },
{ {
"name": "phpdocumentor/reflection-docblock", "name": "phpdocumentor/reflection-docblock",
"version": "5.2.2", "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": "069a785b2141f5bcf49f3e353548dc1cce6df556" "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2130,7 +2191,8 @@
"webmozart/assert": "^1.9.1" "webmozart/assert": "^1.9.1"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "~1.3.2" "mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -2160,22 +2222,22 @@
"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/master" "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
}, },
"time": "2020-09-03T19:13:55+00:00" "time": "2021-10-19T17:43:47+00:00"
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
"version": "1.4.0", "version": "1.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git", "url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2183,7 +2245,8 @@
"phpdocumentor/reflection-common": "^2.0" "phpdocumentor/reflection-common": "^2.0"
}, },
"require-dev": { "require-dev": {
"ext-tokenizer": "*" "ext-tokenizer": "*",
"psalm/phar": "^4.8"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@@ -2209,26 +2272,26 @@
"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.4.0" "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1"
}, },
"time": "2020-09-17T18:55:26+00:00" "time": "2021-10-02T14:08:47+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
"version": "1.1.1", "version": "1.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/container.git", "url": "https://github.com/php-fig/container.git",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.0" "php": ">=7.4.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@@ -2257,9 +2320,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-fig/container/issues", "issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.1" "source": "https://github.com/php-fig/container/tree/1.1.2"
}, },
"time": "2021-03-05T17:36:06+00:00" "time": "2021-11-05T16:50:12+00:00"
}, },
{ {
"name": "psr/http-message", "name": "psr/http-message",
@@ -2461,23 +2524,23 @@
}, },
{ {
"name": "sabre/event", "name": "sabre/event",
"version": "5.1.2", "version": "5.1.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sabre-io/event.git", "url": "https://github.com/sabre-io/event.git",
"reference": "c120bec57c17b6251a496efc82b732418b49d50a" "reference": "d7da22897125d34d7eddf7977758191c06a74497"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sabre-io/event/zipball/c120bec57c17b6251a496efc82b732418b49d50a", "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497",
"reference": "c120bec57c17b6251a496efc82b732418b49d50a", "reference": "d7da22897125d34d7eddf7977758191c06a74497",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "~2.16.1", "friendsofphp/php-cs-fixer": "~2.17.1",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^0.12",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0"
}, },
@@ -2523,80 +2586,7 @@
"issues": "https://github.com/sabre-io/event/issues", "issues": "https://github.com/sabre-io/event/issues",
"source": "https://github.com/fruux/sabre-event" "source": "https://github.com/fruux/sabre-event"
}, },
"time": "2020-10-03T11:02:22+00:00" "time": "2021-11-04T06:51:17+00:00"
},
{
"name": "scssphp/scssphp",
"version": "v1.6.0",
"source": {
"type": "git",
"url": "https://github.com/scssphp/scssphp.git",
"reference": "b83594e2323c5d6e80785df3f91b9d1d32aad530"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/b83594e2323c5d6e80785df3f91b9d1d32aad530",
"reference": "b83594e2323c5d6e80785df3f91b9d1d32aad530",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-json": "*",
"php": ">=5.6.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4",
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
"sass/sass-spec": "*",
"squizlabs/php_codesniffer": "~3.5",
"symfony/phpunit-bridge": "^5.1",
"twbs/bootstrap": "~5.0",
"twbs/bootstrap4": "4.6.0",
"zurb/foundation": "~6.5"
},
"suggest": {
"ext-iconv": "Can be used as fallback when ext-mbstring is not available",
"ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
},
"bin": [
"bin/pscss"
],
"type": "library",
"autoload": {
"psr-4": {
"ScssPhp\\ScssPhp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anthon Pang",
"email": "apang@softwaredevelopment.ca",
"homepage": "https://github.com/robocoder"
},
{
"name": "Cédric Morin",
"email": "cedric@yterium.com",
"homepage": "https://github.com/Cerdic"
}
],
"description": "scssphp is a compiler for SCSS written in PHP.",
"homepage": "http://scssphp.github.io/scssphp/",
"keywords": [
"css",
"less",
"sass",
"scss",
"stylesheet"
],
"support": {
"issues": "https://github.com/scssphp/scssphp/issues",
"source": "https://github.com/scssphp/scssphp/tree/v1.6.0"
},
"time": "2021-07-02T16:28:10+00:00"
}, },
{ {
"name": "sergeytsalkov/meekrodb", "name": "sergeytsalkov/meekrodb",
@@ -2648,16 +2638,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v5.3.6", "version": "v5.3.10",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
"reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2727,7 +2717,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v5.3.6" "source": "https://github.com/symfony/console/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -2743,7 +2733,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-07-27T19:10:22+00:00" "time": "2021-10-26T09:30:15+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@@ -2814,16 +2804,16 @@
}, },
{ {
"name": "symfony/lock", "name": "symfony/lock",
"version": "v4.4.27", "version": "v4.4.33",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/lock.git", "url": "https://github.com/symfony/lock.git",
"reference": "6ca476d4ac992802f2a4043929f68f1818449486" "reference": "567d29b1bc6e3937652054dafc069151d17824a9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/6ca476d4ac992802f2a4043929f68f1818449486", "url": "https://api.github.com/repos/symfony/lock/zipball/567d29b1bc6e3937652054dafc069151d17824a9",
"reference": "6ca476d4ac992802f2a4043929f68f1818449486", "reference": "567d29b1bc6e3937652054dafc069151d17824a9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2872,7 +2862,7 @@
"semaphore" "semaphore"
], ],
"support": { "support": {
"source": "https://github.com/symfony/lock/tree/v4.4.27" "source": "https://github.com/symfony/lock/tree/v4.4.33"
}, },
"funding": [ "funding": [
{ {
@@ -2888,7 +2878,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-07-23T15:41:52+00:00" "time": "2021-10-05T20:27:01+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@@ -3620,16 +3610,16 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v5.3.3", "version": "v5.3.10",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3683,7 +3673,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v5.3.3" "source": "https://github.com/symfony/string/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -3699,20 +3689,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-06-27T11:44:38+00:00" "time": "2021-10-27T18:21:46+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v5.3.7", "version": "v5.3.10",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6" "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6", "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa",
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6", "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3778,7 +3768,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/v5.3.7" "source": "https://github.com/symfony/translation/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -3794,7 +3784,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2021-08-26T08:22:53+00:00" "time": "2021-10-10T06:43:24+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
@@ -3876,16 +3866,16 @@
}, },
{ {
"name": "tysonandre/var_representation_polyfill", "name": "tysonandre/var_representation_polyfill",
"version": "0.0.2", "version": "0.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/TysonAndre/var_representation_polyfill.git", "url": "https://github.com/TysonAndre/var_representation_polyfill.git",
"reference": "3f17999ee1f257319ddc6721dd26ebbc5d175f33" "reference": "0a942e74e18af5514749895507bc6ca7ab96399a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/3f17999ee1f257319ddc6721dd26ebbc5d175f33", "url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/0a942e74e18af5514749895507bc6ca7ab96399a",
"reference": "3f17999ee1f257319ddc6721dd26ebbc5d175f33", "reference": "0a942e74e18af5514749895507bc6ca7ab96399a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3896,6 +3886,9 @@
"phan/phan": "^4.0", "phan/phan": "^4.0",
"phpunit/phpunit": "^8.5.0" "phpunit/phpunit": "^8.5.0"
}, },
"suggest": {
"ext-var_representation": "*"
},
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@@ -3914,16 +3907,16 @@
"name": "Tyson Andre" "name": "Tyson Andre"
} }
], ],
"description": "Polyfill for var_representation", "description": "Polyfill for var_representation: convert a variable to a string in a way that fixes the shortcomings of var_export",
"keywords": [ "keywords": [
"var_export", "var_export",
"var_representation" "var_representation"
], ],
"support": { "support": {
"issues": "https://github.com/TysonAndre/var_representation_polyfill/issues", "issues": "https://github.com/TysonAndre/var_representation_polyfill/issues",
"source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.0.2" "source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.1"
}, },
"time": "2021-06-26T18:55:02+00:00" "time": "2021-08-16T00:12:50+00:00"
}, },
{ {
"name": "vlucas/valitron", "name": "vlucas/valitron",
@@ -4181,7 +4174,7 @@
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
"php": "7.4" "php": "8.0"
}, },
"plugin-api-version": "2.0.0" "plugin-api-version": "2.0.0"
} }
+25
View File
@@ -151,3 +151,28 @@ function logExceptionByCustomHandler(\Throwable $e)
throw $e; throw $e;
} }
set_exception_handler('\\sammo\\logExceptionByCustomHandler'); set_exception_handler('\\sammo\\logExceptionByCustomHandler');
function getAPIExecutorClass($path){
static $basePath = __NAMESPACE__.'\\API\\';
if(is_string($path)){
}
else if(is_array($path)){
$path = join('\\', $path);
}
else{
throw new \InvalidArgumentException("{$path}는 올바른 API 지시자가 아님");
}
$classPath = str_replace('/', '\\', $basePath.$path);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$path}는 올바른 API 경로가 아님");
}
function buildAPIExecutorClass($type, string $rootPath, array $args):\sammo\BaseAPI{
$class = getAPIExecutorClass($type);
return new $class($rootPath, $args);
}
+17 -2
View File
@@ -58,7 +58,7 @@ CREATE TABLE `member_log` (
INDEX `action` (`member_no`, `action_type`, `date`), INDEX `action` (`member_no`, `action_type`, `date`),
INDEX `member` (`member_no`, `date`) INDEX `member` (`member_no`, `date`)
) )
ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; ENGINE=Aria DEFAULT CHARSET=utf8mb4;
################### ###################
# KV storage # KV storage
@@ -72,4 +72,19 @@ CREATE TABLE if not exists `storage` (
UNIQUE INDEX `key` (`namespace`, `key`) UNIQUE INDEX `key` (`namespace`, `key`)
) )
COLLATE='utf8mb4_general_ci' COLLATE='utf8mb4_general_ci'
ENGINE=MyISAM ENGINE=Aria;
CREATE TABLE `login_token` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL,
`base_token` VARCHAR(20) NOT NULL COLLATE 'utf8mb4_general_ci',
`reg_ip` VARCHAR(40) NOT NULL COLLATE 'utf8mb4_general_ci',
`reg_date` DATETIME NOT NULL,
`expire_date` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `by_token` (`base_token`),
INDEX `by_date` (`user_id`, `expire_date`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=Aria
;
+43 -19
View File
@@ -1348,17 +1348,29 @@ function triggerTournament()
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['tournament', 'tnmt_trig']); [$tournament, $tnmt_trig, $tnmt_pattern] = $gameStor->getValuesAsArray(['tournament', 'tnmt_trig', 'tnmt_pattern']);
//현재 토너먼트 없고, 자동개시 걸려있을때, 40%확률 //현재 토너먼트 없고, 자동개시 걸려있을때, 40%확률
if ($admin['tournament'] == 0 && $admin['tnmt_trig'] > 0 && rand() % 100 < 40) { if($tournament != 0){
$type = rand() % 5; // 0 : 전력전, 1 : 통솔전, 2 : 일기토, 3 : 설전 return;
}
if($tnmt_trig == 0){
return;
}
if(!Util::randBool(0.4)){
return;
}
if(!$tnmt_pattern){
// 0 : 전력전, 1 : 통솔전, 2 : 일기토, 3 : 설전
//전력전 40%, 통, 일, 설 각 20% //전력전 40%, 통, 일, 설 각 20%
if ($type > 3) { $tnmt_pattern = [0, 0, 1, 2, 3];
$type = 0; shuffle($tnmt_pattern);
}
startTournament($admin['tnmt_trig'], $type);
} }
$tnmt_type = array_pop($tnmt_pattern);
$gameStor->setValue('tnmt_pattern', $tnmt_pattern);
startTournament($tnmt_trig, $tnmt_type);
} }
function CheckHall($no) function CheckHall($no)
@@ -1840,21 +1852,26 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
return false; return false;
} }
$inheritUnique = $general->getAuxVar('inheritUniqueTrial'); $itemTypeCnt = count(GameConst::$allItems);
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique)) {
LogText("유니크 준비?? {$general->getID()}", $inheritUnique); [$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
$trialResult = tryInheritUniqueItem($general, $acquireType); $relYear = $year - $startYear;
if ($trialResult) { $maxTrialCountByYear = 1;
return true; foreach(GameConst::$maxUniqueItemLimit as $tmpVals){
[$targetYear, $targetTrialCnt] = $tmpVals;
if($relYear < $targetYear){
break;
} }
$maxTrialCountByYear = $targetTrialCnt;
} }
$itemTypeCnt = count(GameConst::$allItems); $trialCnt = Util::valueFit($itemTypeCnt, null, $maxTrialCountByYear);
$trialCnt = $itemTypeCnt; $maxCnt = $itemTypeCnt;
foreach ($general->getItems() as $item) { foreach ($general->getItems() as $item) {
if (!$item->isBuyable()) { if (!$item->isBuyable()) {
$trialCnt -= 1; $trialCnt -= 1;
$maxCnt -= 1;
} }
} }
@@ -1866,10 +1883,17 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
$userLogger = new UserLogger($general->getVar('owner')); $userLogger = new UserLogger($general->getVar('owner'));
$userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint"); $userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
} }
tryRollbackInheritUniqueItem($general);
return false; return false;
} }
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique)) {
$trialResult = tryInheritUniqueItem($general, $acquireType);
if ($trialResult) {
return true;
}
}
$scenario = $gameStor->scenario; $scenario = $gameStor->scenario;
$genCount = $db->queryFirstField('SELECT count(*) FROM general WHERE npc<2'); $genCount = $db->queryFirstField('SELECT count(*) FROM general WHERE npc<2');
@@ -1899,7 +1923,7 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
$prob = 1; $prob = 1;
} }
foreach (Util::range($trialCnt) as $_idx) { foreach (Util::range($maxCnt) as $_idx) {
if (Util::randBool($prob)) { if (Util::randBool($prob)) {
$result = true; $result = true;
break; break;
@@ -1907,10 +1931,10 @@ function tryUniqueItemLottery(General $general, string $acquireType = '아이템
$prob *= $moreProb; $prob *= $moreProb;
} }
if (!$result) { if (!$result) {
LogText("{$general->getName()}, {$general->getID()} 유니크 실패 {$trialCnt}", $prob); LogText("{$general->getName()}, {$general->getID()} 유니크 실패 {$maxCnt}", $prob);
return false; return false;
} }
LogText("{$general->getName()}, {$general->getID()} 유니크 성공 {$trialCnt}", $prob); LogText("{$general->getName()}, {$general->getID()} 유니크 성공 {$maxCnt}", $prob);
return giveRandomUniqueItem($general, $acquireType); return giveRandomUniqueItem($general, $acquireType);
} }
-25
View File
@@ -357,31 +357,6 @@ function buildNationCommandClass(?string $type, General $generalObj, array $env,
return new $class($generalObj, $env, $lastTurn, $arg); return new $class($generalObj, $env, $lastTurn, $arg);
} }
function getAPIExecutorClass($path){
static $basePath = __NAMESPACE__.'\\API\\';
if(is_string($path)){
}
else if(is_array($path)){
$path = join('\\', $path);
}
else{
throw new \InvalidArgumentException("{$path}는 올바른 API 지시자가 아님");
}
$classPath = str_replace('/', '\\', $basePath.$path);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$path}는 올바른 API 경로가 아님");
}
function buildAPIExecutorClass($type, string $rootPath, array $args):\sammo\BaseAPI{
$class = getAPIExecutorClass($type);
return new $class($rootPath, $args);
}
function getWarUnitTriggerClass(string $type){ function getWarUnitTriggerClass(string $type){
static $basePath = __NAMESPACE__.'\\WarUnitTrigger\\'; static $basePath = __NAMESPACE__.'\\WarUnitTrigger\\';
$classPath = ($basePath.$type); $classPath = ($basePath.$type);
+29 -10
View File
@@ -167,7 +167,8 @@ function checkSupply()
} }
} }
function updateGeneralNumber(){ function updateGeneralNumber()
{
$db = DB::db(); $db = DB::db();
foreach ($db->queryAllLists('SELECT nation, count(*) FROM general WHERE npc != 5 GROUP BY nation') as [$nationID, $gennum]) { foreach ($db->queryAllLists('SELECT nation, count(*) FROM general WHERE npc != 5 GROUP BY nation') as [$nationID, $gennum]) {
if ($nationID === 0) { if ($nationID === 0) {
@@ -370,7 +371,11 @@ function postUpdateMonthly()
sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop_max+agri_max+comm_max+secu_max+wall_max+def_max)/100 sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop_max+agri_max+comm_max+secu_max+wall_max+def_max)/100
) from city where nation=A.nation and supply=1 ) from city where nation=A.nation and supply=1
)) ))
+(select sum(leadership+strength+intel) from general where nation=A.nation) +(select SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`npc` < 2 THEN 1.5 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)*2 + (SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/2)
FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = \'killcrew_person\'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = \'deathcrew_person\'
WHERE g.nation = A.nation)
+(select round(sum(dex1+dex2+dex3+dex4+dex5)/1000) from general where nation=A.nation) +(select round(sum(dex1+dex2+dex3+dex4+dex5)/1000) from general where nation=A.nation)
+(select round(sum(experience+dedication)/100) from general where nation=A.nation) +(select round(sum(experience+dedication)/100) from general where nation=A.nation)
+(select round(avg(connect)) from general where nation=A.nation) +(select round(avg(connect)) from general where nation=A.nation)
@@ -435,8 +440,7 @@ function postUpdateMonthly()
foreach ($db->queryAllLists('SELECT me,you FROM diplomacy WHERE state=0 AND term <= 1 ORDER BY me desc, you desc') as [$me, $you]) { foreach ($db->queryAllLists('SELECT me,you FROM diplomacy WHERE state=0 AND term <= 1 ORDER BY me desc, you desc') as [$me, $you]) {
if ($me < $you) { if ($me < $you) {
$key = "{$me}_{$you}"; $key = "{$me}_{$you}";
} } else {
else{
$key = "{$you}_{$me}"; $key = "{$you}_{$me}";
} }
if (!key_exists($key, $stopWarList)) { if (!key_exists($key, $stopWarList)) {
@@ -624,14 +628,25 @@ function updateNationState()
$targetKillTurn $targetKillTurn
); );
$nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux'], 2); $nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux'], 2);
$chiefObj = null; $chiefID = null;
$uniqueLotteryWeightList = []; $uniqueLotteryWeightList = [];
[$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
$relYear = $year - $startYear;
$maxTrialCountByYear = 1;
foreach (GameConst::$maxUniqueItemLimit as $tmpVals) {
[$targetYear, $targetTrialCnt] = $tmpVals;
if ($relYear < $targetYear) {
break;
}
$maxTrialCountByYear = $targetTrialCnt;
}
foreach ($nationGenList as $nationGen) { foreach ($nationGenList as $nationGen) {
if ($nationGen->getVar('officer_level') == 12) { if ($nationGen->getVar('officer_level') == 12) {
$chiefObj = $nationGen; $chiefID = $nationGen->getID();
} }
$trialCnt = count(GameConst::$allItems); $trialCnt = min($maxTrialCountByYear, count(GameConst::$allItems));
foreach ($nationGen->getItems() as $item) { foreach ($nationGen->getItems() as $item) {
if (!$item->isBuyable()) { if (!$item->isBuyable()) {
@@ -670,8 +685,10 @@ function updateNationState()
$winnerObj->applyDB($db); $winnerObj->applyDB($db);
} }
if($chiefObj){ if ($chiefID) {
$chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], 2);
$chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff); $chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff);
$chiefObj->applyDB($db);
} }
} }
} }
@@ -1150,7 +1167,8 @@ function checkEmperior()
LogHistory(); LogHistory();
} }
function resetInheritanceUser(int $userID, bool $isRebirth=false):float{ function resetInheritanceUser(int $userID, bool $isRebirth = false): float
{
$rebirthDegraded = [ $rebirthDegraded = [
'dex' => 0.5, 'dex' => 0.5,
]; ];
@@ -1188,7 +1206,8 @@ function resetInheritanceUser(int $userID, bool $isRebirth=false):float{
return $totalPoint; return $totalPoint;
} }
function updateMaxDomesticCritical(General $general, $score){ function updateMaxDomesticCritical(General $general, $score)
{
$maxDomesticCritical = $general->getAuxVar('max_domestic_critical') ?? 0; $maxDomesticCritical = $general->getAuxVar('max_domestic_critical') ?? 0;
$maxDomesticCritical += $score / 2; $maxDomesticCritical += $score / 2;
$general->setAuxVar('max_domestic_critical', $maxDomesticCritical); $general->setAuxVar('max_domestic_critical', $maxDomesticCritical);
-11
View File
@@ -77,12 +77,6 @@ function pushProcessLog($log) {
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_processlog.txt", $log); pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_processlog.txt", $log);
} }
function pushStepLog($log) {
$date = date('Y_m_d');
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt", $log);
}
function pushLockLog($log) { function pushLockLog($log) {
$date = date('Y_m_d'); $date = date('Y_m_d');
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_locklog.txt", $log); pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_locklog.txt", $log);
@@ -378,8 +372,6 @@ function getGlobalActionLogWithDate(int $year, int $month):array {
} }
function LogHistory($isFirst=0) { function LogHistory($isFirst=0) {
if(STEP_LOG) pushStepLog(TimeUtil::now().', LogHistory Start');
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$obj = $gameStor->getValues(['startyear', 'year', 'month']); $obj = $gameStor->getValues(['startyear', 'year', 'month']);
@@ -426,8 +418,6 @@ function LogHistory($isFirst=0) {
return -($lhs['power']<=>$rhs['power']); return -($lhs['power']<=>$rhs['power']);
}); });
if(STEP_LOG) pushStepLog(TimeUtil::now().', contents collected');
$db->insert('ng_history', [ $db->insert('ng_history', [
'server_id' => UniqueConst::$serverID, 'server_id' => UniqueConst::$serverID,
'year' => $year, 'year' => $year,
@@ -438,6 +428,5 @@ function LogHistory($isFirst=0) {
'nations' => Json::encode($nations), 'nations' => Json::encode($nations),
]); ]);
if(STEP_LOG) pushStepLog(TimeUtil::now().', LogHistory Finish');
return true; return true;
} }
+50 -8
View File
@@ -8,8 +8,7 @@ function processTournament() {
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']); $admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']);
$now = new \DateTime(); $now = new \DateTime();
$admin['now'] = $now->format('Y-m-d H:i:s'); $offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
$admin['offset'] = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
//수동일땐 무시 //수동일땐 무시
if($admin['tnmt_auto'] == 0) { return; } if($admin['tnmt_auto'] == 0) { return; }
@@ -18,8 +17,11 @@ function processTournament() {
$tnmt = $admin['tournament']; $tnmt = $admin['tournament'];
$phase = $admin['phase']; $phase = $admin['phase'];
if($offset < 0){
return;
}
//현시간이 스탬프 지나친경우 //현시간이 스탬프 지나친경우
if($admin['offset'] >= 0) {
switch($admin['tnmt_auto']) { switch($admin['tnmt_auto']) {
case 1: $unit = 720; break; case 1: $unit = 720; break;
case 2: $unit = 420; break; case 2: $unit = 420; break;
@@ -32,7 +34,7 @@ function processTournament() {
} }
//업데이트 횟수 //업데이트 횟수
$iter = intdiv($admin['offset'], $unit) + 1; $iter = intdiv($offset, $unit) + 1;
for($i=0; $i < $iter; $i++) { for($i=0; $i < $iter; $i++) {
switch($tnmt) { switch($tnmt) {
@@ -55,6 +57,7 @@ function processTournament() {
case 5: //배정중 case 5: //배정중
final16set(); final16set();
$tnmt = 6; $phase = 0; $tnmt = 6; $phase = 0;
startBetting();
break; break;
case 6: //베팅중 case 6: //베팅중
$tnmt = 7; $phase = 0; $tnmt = 7; $phase = 0;
@@ -111,7 +114,6 @@ function processTournament() {
$gameStor->phase = $phase; $gameStor->phase = $phase;
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s'); $gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
} }
}
function getTournamentTerm() { function getTournamentTerm() {
$db = DB::db(); $db = DB::db();
@@ -296,11 +298,51 @@ function startTournament($auto, $type) {
['설전','책사'], ['설전','책사'],
][$type]; ][$type];
$history[] = "<S>◆</>{$admin['year']}{$admin['month']}월:{$openerText}<C>{$typeText}</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>{$genTypeText}</span>들을 모집하고 있습니다!"; $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월:<B><b>【대회】</b></>{$openerText}<C>{$typeText}</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>{$genTypeText}</span>들을 모집하고 있습니다!";
pushGlobalHistoryLog($history, $admin['year'], $admin['month']); pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
} }
function startBetting(){
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
pushGlobalHistoryLog([
"<S>◆</>{$year}{$month}월:<B><b>【대회】</b></>우승자를 예상하는 <C>내기</>가 진행중입니다! 호사가의 참여를 기다립니다!"
], $year, $month);
$betGold = 10;
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE npc >= 2 AND gold >= (500 + %i)', $betGold);
$npcBet = [];
$betSum = [
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
];
foreach($npcList as $npcID){
$target = Util::randRangeInt(0, 15);
$betSum[$target] += $betGold;
$npcBet[] = [$npcID, $target];
}
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $betGold),
], 'no IN %li', $npcList);
foreach($npcBet as [$npcID, $betTarget]){
$targetKey = "bet{$betTarget}";
$db->update('betting', [
"bet{$betTarget}"=>$db->sqleval('%b + %i', $targetKey, $betGold),
], 'general_id = %i', $npcID);
}
foreach($betSum as $betTarget=>$betSumGold){
$targetKey = "bet{$betTarget}";
$db->update('betting', [
"bet{$betTarget}"=>$db->sqleval('%b + %i', $targetKey, $betSumGold),
], 'general_id = 0');
}
}
function fillLowGenAll() { function fillLowGenAll() {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
@@ -785,8 +827,8 @@ function setGift($tnmt_type, $tnmt, $phase) {
$josaYiWinner = JosaUtil::pick($winner['name'], '이'); $josaYiWinner = JosaUtil::pick($winner['name'], '이');
$josaYiRunnerUp = JosaUtil::pick($runnerUp['name'], '이'); $josaYiRunnerUp = JosaUtil::pick($runnerUp['name'], '이');
$winnerLogger->pushGlobalHistoryLog("<C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH); $winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
$winnerLogger->pushGlobalHistoryLog("<C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH); $winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
$generalObjList = General::createGeneralObjListFromDB(array_keys($resultHelper)); $generalObjList = General::createGeneralObjListFromDB(array_keys($resultHelper));
+5 -2
View File
@@ -21,9 +21,11 @@ foreach($rawTurn as [$turn_idx, $action, $arg, $brief]){
]; ];
} }
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']); [$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
$turnTime = $db->queryFirstField('SELECT turntime FROM general WHERE no=%i', $generalID); [$turnTime, $rawGeneralAux] = $db->queryFirstList('SELECT turntime, aux FROM general WHERE no=%i', $generalID);
$generalAux = Json::decode($rawGeneralAux??'{}');
if(cutTurn($turnTime, $turnTerm) > cutTurn($lastExecute, $turnTerm)){ if(cutTurn($turnTime, $turnTerm) > cutTurn($lastExecute, $turnTerm)){
//이미 이번달에 실행된 턴이다. //이미 이번달에 실행된 턴이다.
@@ -42,5 +44,6 @@ Json::die([
'year'=>$year, 'year'=>$year,
'month'=>$month, 'month'=>$month,
'date'=>TimeUtil::now(true), 'date'=>TimeUtil::now(true),
'turn'=>$commandList 'turn'=>$commandList,
'autorun_limit'=> $generalAux['autorun_limit']??null,
]); ]);
-4
View File
@@ -20,10 +20,6 @@ $loader->addClassMap((function () {
//디버그용 매크로 //디버그용 매크로
ini_set("session.cache_expire", 10080); // minutes ini_set("session.cache_expire", 10080); // minutes
// 각종 변수
define('STEP_LOG', true);
define('PROCESS_LOG', true);
ob_start(); ob_start();
// 에러 메세지 출력 // 에러 메세지 출력
+2
View File
@@ -264,12 +264,14 @@ function processWar_NG(
$attackerCrewTypeCoef = $attacker->getCrewType()->getAttackCoef($defender->getCrewType()) * $defender->getCrewType()->getDefenceCoef($attacker->getCrewType()); $attackerCrewTypeCoef = $attacker->getCrewType()->getAttackCoef($defender->getCrewType()) * $defender->getCrewType()->getDefenceCoef($attacker->getCrewType());
$defenderCrewTypeCoef = $defender->getCrewType()->getAttackCoef($attacker->getCrewType()) * $attacker->getCrewType()->getDefenceCoef($defender->getCrewType()); $defenderCrewTypeCoef = $defender->getCrewType()->getAttackCoef($attacker->getCrewType()) * $attacker->getCrewType()->getDefenceCoef($defender->getCrewType());
/*
if($attackerCrewTypeCoef > $defenderCrewTypeCoef && $attacker instanceof WarUnitGeneral){ if($attackerCrewTypeCoef > $defenderCrewTypeCoef && $attacker instanceof WarUnitGeneral){
$attacker->getGeneral()->increaseInheritancePoint('snipe_combat', 1); $attacker->getGeneral()->increaseInheritancePoint('snipe_combat', 1);
} }
if($defenderCrewTypeCoef > $attackerCrewTypeCoef && $defender instanceof WarUnitGeneral){ if($defenderCrewTypeCoef > $attackerCrewTypeCoef && $defender instanceof WarUnitGeneral){
$defender->getGeneral()->increaseInheritancePoint('snipe_combat', 1); $defender->getGeneral()->increaseInheritancePoint('snipe_combat', 1);
} }
*/
$attackerName = $attacker->getName(); $attackerName = $attacker->getName();
$attackerCrewTypeName = $attacker->getCrewTypeName(); $attackerCrewTypeName = $attacker->getCrewTypeName();
@@ -15,7 +15,7 @@ class che_반계_백우선 extends \sammo\BaseItem{
protected $id = 45; protected $id = 45;
protected $rawName = '백우선'; protected $rawName = '백우선';
protected $name = '백우선(반계)'; protected $name = '백우선(반계)';
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림'; protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 20% 확률로 되돌림';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -29,7 +29,7 @@ class che_반계_백우선 extends \sammo\BaseItem{
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*301), new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*301, 0.2),
new che_반계발동($unit) new che_반계발동($unit)
); );
} }
@@ -15,7 +15,7 @@ class che_반계_파초선 extends \sammo\BaseItem{
protected $id = 45; protected $id = 45;
protected $rawName = '파초선'; protected $rawName = '파초선';
protected $name = '파초선(반계)'; protected $name = '파초선(반계)';
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림'; protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 20% 확률로 되돌림';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -29,7 +29,7 @@ class che_반계_파초선 extends \sammo\BaseItem{
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*302), new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM +BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*302, 0.2),
new che_반계발동($unit) new che_반계발동($unit)
); );
} }
@@ -16,12 +16,12 @@ class che_서적_07_사마법 extends \sammo\BaseStatItem{
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->info .= "<br>[전투] 상대의 계략을 20% 확률로 되돌림"; $this->info .= "<br>[전투] 상대의 계략을 10% 확률로 되돌림";
} }
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*207, 0.2), new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*207, 0.1),
new che_반계발동($unit) new che_반계발동($unit)
); );
} }
@@ -16,12 +16,12 @@ class che_서적_12_산해경 extends \sammo\BaseStatItem{
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
$this->info .= "<br>[전투] 상대의 계략을 20% 확률로 되돌림"; $this->info .= "<br>[전투] 상대의 계략을 10% 확률로 되돌림";
} }
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM, 0.2), new che_반계시도($unit, BaseWarUnitTrigger::TYPE_ITEM, 0.1),
new che_반계발동($unit) new che_반계발동($unit)
); );
} }
@@ -11,25 +11,29 @@ class event_전투특기_무쌍 extends \sammo\BaseItem{
protected $id = 61; protected $id = 61;
protected $rawName = '비급'; protected $rawName = '비급';
protected $name = '비급(무쌍)'; protected $name = '비급(무쌍)';
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대50%)<br>승리 수만큼 피해 0.05%씩 감소(최대20%)'; protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
protected $cost = 100; protected $cost = 100;
protected $buyable = true; protected $buyable = true;
protected $consumable = false; protected $consumable = false;
protected $reqSecu = 3000; protected $reqSecu = 3000;
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){ if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
return $value += 0.1; return $value += 0.1;
} }
return $value; return $value;
} }
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$attackMultiplier = 1.1; $generalWarSpecial = $unit->getGeneral()->getSpecialWar();
$defenceMultiplier = 0.95; if($generalWarSpecial !== null && $generalWarSpecial->getName() == '무쌍'){
return [1, 1];
}
$attackMultiplier = 1.05;
$defenceMultiplier = 0.98;
$killnum = $unit->getGeneral()->getRankVar('killnum'); $killnum = $unit->getGeneral()->getRankVar('killnum');
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.5); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.2); $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
return [$attackMultiplier, $defenceMultiplier]; return [$attackMultiplier, $defenceMultiplier];
} }
} }
+1 -1
View File
@@ -35,7 +35,7 @@ class che_종횡가 extends \sammo\BaseNation{
public function onCalcStrategic(string $turnType, string $varType, $value){ public function onCalcStrategic(string $turnType, string $varType, $value){
if($varType == 'delay'){ if($varType == 'delay'){
return Util::round($value / 2); return Util::round($value * 3 / 4);
} }
if($varType == 'globalDelay'){ if($varType == 'globalDelay'){
return Util::round($value / 2); return Util::round($value / 2);
@@ -10,7 +10,7 @@ class che_event_무쌍 extends \sammo\BaseSpecial{
protected $id = 61; protected $id = 61;
protected $name = '무쌍'; protected $name = '무쌍';
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대40%)<br>승리 수만큼 피해 0.05%씩 감소(최대30%)'; protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
static $selectWeightType = SpecialityHelper::WEIGHT_NORM; static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
static $selectWeight = 1; static $selectWeight = 1;
@@ -19,18 +19,22 @@ class che_event_무쌍 extends \sammo\BaseSpecial{
]; ];
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){ if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
return $value += 0.1; return $value += 0.1;
} }
return $value; return $value;
} }
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$attackMultiplier = 1.1; $generalWarSpecial = $unit->getGeneral()->getSpecialWar();
$defenceMultiplier = 1; if($generalWarSpecial !== null && $generalWarSpecial->getName() == '무쌍'){
return [1, 1];
}
$attackMultiplier = 1.05;
$defenceMultiplier = 0.98;
$killnum = $unit->getGeneral()->getRankVar('killnum'); $killnum = $unit->getGeneral()->getRankVar('killnum');
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.4); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.3); $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
return [$attackMultiplier, $defenceMultiplier]; return [$attackMultiplier, $defenceMultiplier];
} }
} }
+6 -6
View File
@@ -10,7 +10,7 @@ class che_무쌍 extends \sammo\BaseSpecial{
protected $id = 61; protected $id = 61;
protected $name = '무쌍'; protected $name = '무쌍';
protected $info = '[전투] 대미지 +10%, 피해 -5%, 공격 시 필살 확률 +10%p, <br>승리 수만큼 대미지 0.20%씩 추가 상승(최대50%)<br>승리 수만큼 피해 0.05%씩 감소(최대20%)'; protected $info = '[전투] 대미지 +5%, 피해 -2%, 공격 시 필살 확률 +10%p, <br>승리 수의 로그 비례로 대미지 상승(10회 ⇒ +5%, 40회 ⇒ +15%)<br>승리 수의 로그 비례로 피해 감소(10회 ⇒ -2%, 40회 ⇒ -6%)';
static $selectWeightType = SpecialityHelper::WEIGHT_NORM; static $selectWeightType = SpecialityHelper::WEIGHT_NORM;
static $selectWeight = 1; static $selectWeight = 1;
@@ -19,18 +19,18 @@ class che_무쌍 extends \sammo\BaseSpecial{
]; ];
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warCriticalRatio' && $aux['isAttacker']??false){ if($statName === 'warCriticalRatio' && ($aux['isAttacker']??false)){
return $value += 0.1; return $value += 0.1;
} }
return $value; return $value;
} }
public function getWarPowerMultiplier(WarUnit $unit):array{ public function getWarPowerMultiplier(WarUnit $unit):array{
$attackMultiplier = 1.1; $attackMultiplier = 1.05;
$defenceMultiplier = 0.95; $defenceMultiplier = 0.98;
$killnum = $unit->getGeneral()->getRankVar('killnum'); $killnum = $unit->getGeneral()->getRankVar('killnum');
$attackMultiplier += Util::valueFit($killnum * 0.01 * 0.2, null, 0.5); $attackMultiplier += log(max(1, $killnum / 5), 2) / 20;
$defenceMultiplier -= Util::valueFit($killnum * 0.01 * 0.05, null, 0.2); $defenceMultiplier -= log(max(1, $killnum / 5), 2) / 50;
return [$attackMultiplier, $defenceMultiplier]; return [$attackMultiplier, $defenceMultiplier];
} }
} }
+2
View File
@@ -137,6 +137,7 @@ class AutorunNationPolicy {
public $reqNPCDevelRice = 500; public $reqNPCDevelRice = 500;
public $minimumResourceActionAmount = 1000; public $minimumResourceActionAmount = 1000;
public $maximumResourceActionAmount = 10000;
public $minNPCWarLeadership = 40; public $minNPCWarLeadership = 40;
public $minWarCrew = 1500; public $minWarCrew = 1500;
@@ -164,6 +165,7 @@ class AutorunNationPolicy {
'reqNPCDevelRice'=>500, 'reqNPCDevelRice'=>500,
'minimumResourceActionAmount'=>1000, 'minimumResourceActionAmount'=>1000,
'maximumResourceActionAmount'=>10000,
'minNPCWarLeadership'=>40, 'minNPCWarLeadership'=>40,
'minWarCrew'=>1500, 'minWarCrew'=>1500,
+1
View File
@@ -162,6 +162,7 @@ class che_거병 extends Command\GeneralCommand{
$exp = 100; $exp = 100;
$ded = 100; $ded = 100;
$general->increaseInheritancePoint('active_action', 1);
$general->addExperience($exp); $general->addExperience($exp);
$general->addDedication($ded); $general->addDedication($ded);
$general->setVar('belong', 1); $general->setVar('belong', 1);
+1
View File
@@ -188,6 +188,7 @@ class che_건국 extends Command\GeneralCommand
refreshNationStaticInfo(); refreshNationStaticInfo();
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
tryUniqueItemLottery($general, '건국'); tryUniqueItemLottery($general, '건국');
@@ -194,7 +194,7 @@ class che_등용수락 extends Command\GeneralCommand{
} }
$db->update('nation', $setScoutNationValues, 'nation=%i', $destNationID); $db->update('nation', $setScoutNationValues, 'nation=%i', $destNationID);
$general->increaseInheritancePoint('active_action', 1);
$general->setVar('permission', 'normal'); $general->setVar('permission', 'normal');
$general->setVar('belong', 1); $general->setVar('belong', 1);
$general->setVar('officer_level', 1); $general->setVar('officer_level', 1);
+20 -26
View File
@@ -181,51 +181,44 @@ class che_랜덤임관 extends Command\GeneralCommand
$generalsCnt = []; $generalsCnt = [];
if ($notIn) { if ($notIn) {
$rawGeneralsCnt = $db->query( $rawGeneralsCnt = $db->query(
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE (npc < 4 OR npc = 6) AND nation.gennum < %i AND nation.scout=0 AND nation.nation NOT IN %li GROUP BY general.nation, general.npc', "SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`npc` < 2 THEN 1.5 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower
FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person'
LEFT JOIN `nation` AS n ON g.`nation` = n.`nation`
WHERE g.`npc` IN (0, 1, 2, 3, 6) AND g.nation != 0 AND n.scout=0 AND n.gennum < %i AND n.nation NOT IN %li
GROUP BY g.`nation`",
$genLimit, $genLimit,
$notIn $notIn
); );
} else { } else {
$rawGeneralsCnt = $db->query( $rawGeneralsCnt = $db->query(
'SELECT general.nation as nation, nation.gennum, nation.name, npc, count(*) as cnt FROM general JOIN nation ON general.nation = nation.nation WHERE (npc < 4 OR npc = 6) AND nation.gennum < %i AND nation.scout=0 GROUP BY general.nation, general.npc', "SELECT g.`nation`, n.`gennum`, n.name, SUM((ra.value + 100)/(rb.value + 100)*(CASE WHEN g.`npc` < 2 THEN 1.5 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)) AS warpower, SUM(SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/5 AS develpower
FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = 'killcrew_person'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = 'deathcrew_person'
LEFT JOIN `nation` AS n ON g.`nation` = n.`nation`
WHERE g.`npc` IN (0, 1, 2, 3, 6) AND g.nation != 0 AND n.scout=0 AND n.gennum < %i
GROUP BY g.`nation`",
$genLimit $genLimit
); );
} }
foreach ($rawGeneralsCnt as $nation) { foreach ($rawGeneralsCnt as $nation) {
$nationID = $nation['nation']; $calcCnt = $nation['warpower'] + $nation['develpower'];
if (!\key_exists($nationID, $generalsCnt)) {
$generalsCnt[$nationID] = [
'nation' => $nationID,
'gennum' => $nation['gennum'],
'name' => $nation['name'],
'cnt' => 0,
];
$generalsCnt[$nationID]['cnt'] = 0;
}
if ($nation['npc'] <= 2) {
$calcCnt = $nation['cnt'];
} else {
$calcCnt = $nation['cnt'] / 2;
}
if ($general->getNPCType() < 2 && Util::starts_with($nation['name'], 'ⓤ')) { if ($general->getNPCType() < 2 && Util::starts_with($nation['name'], 'ⓤ')) {
$calcCnt *= 100; $calcCnt *= 100;
} }
$generalsCnt[$nationID]['cnt'] += $calcCnt; $generalsCnt[] = [$nation, (1 / $calcCnt)**3];
} }
$randVals = []; if ($generalsCnt) {
foreach ($generalsCnt as $testNation) { $destNation = Util::choiceRandomUsingWeightPair($generalsCnt);
$randVals[] = [$testNation, 1 / $testNation['cnt']];
}
if ($randVals) {
$destNation = Util::choiceRandomUsingWeightPair($randVals);
} }
} }
@@ -292,6 +285,7 @@ class che_랜덤임관 extends Command\GeneralCommand
$general->setAuxVar('joinedNations', $joinedNations); $general->setAuxVar('joinedNations', $joinedNations);
} }
$general->increaseInheritancePoint('active_action', 1);
$general->addExperience($exp); $general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
@@ -96,6 +96,7 @@ class che_모반시도 extends Command\GeneralCommand{
$lordLogger->pushGeneralHistoryLog("<D><b>{$generalName}</b></>의 모반으로 인해 <D><b>{$nationName}</b></>의 군주자리를 박탈당함"); $lordLogger->pushGeneralHistoryLog("<D><b>{$generalName}</b></>의 모반으로 인해 <D><b>{$nationName}</b></>의 군주자리를 박탈당함");
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->increaseInheritancePoint('active_action', 1);
$general->checkStatChange(); $general->checkStatChange();
tryRollbackInheritUniqueItem($general); tryRollbackInheritUniqueItem($general);
$general->applyDB($db); $general->applyDB($db);
+1 -1
View File
@@ -121,7 +121,7 @@ class che_방랑 extends Command\GeneralCommand{
], 'me=%i OR you=%i', $nationID, $nationID); ], 'me=%i OR you=%i', $nationID, $nationID);
refreshNationStaticInfo(); refreshNationStaticInfo();
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
tryRollbackInheritUniqueItem($general); tryRollbackInheritUniqueItem($general);
$general->applyDB($db); $general->applyDB($db);
+1
View File
@@ -135,6 +135,7 @@ class che_선양 extends Command\GeneralCommand
$logger->pushGeneralHistoryLog("<D><b>{$nationName}</b></>의 군주자리를 <Y>{$destGeneralName}</>에게 선양"); $logger->pushGeneralHistoryLog("<D><b>{$nationName}</b></>의 군주자리를 <Y>{$destGeneralName}</>에게 선양");
$destLogger->pushGeneralHistoryLog("<D><b>{$nationName}</b></>의 군주자리를 물려 받음"); $destLogger->pushGeneralHistoryLog("<D><b>{$nationName}</b></>의 군주자리를 물려 받음");
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
tryRollbackInheritUniqueItem($general); tryRollbackInheritUniqueItem($general);
@@ -210,6 +210,7 @@ class che_인재탐색 extends Command\GeneralCommand
$exp = 200; $exp = 200;
$ded = 300; $ded = 300;
$general->increaseInheritancePoint('active_action', Util::valueFit(sqrt(1 / $foundProp), 1));
$general->increaseVarWithLimit('gold', -$reqGold, 0); $general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->increaseVarWithLimit('rice', -$reqRice, 0); $general->increaseVarWithLimit('rice', -$reqRice, 0);
$general->addExperience($exp); $general->addExperience($exp);
+1
View File
@@ -171,6 +171,7 @@ class che_임관 extends Command\GeneralCommand{
$general->setAuxVar('joinedNations', $joinedNations); $general->setAuxVar('joinedNations', $joinedNations);
} }
$general->increaseInheritancePoint('active_action', 1);
$general->addExperience($exp); $general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
@@ -89,7 +89,7 @@ class che_장비매매 extends Command\GeneralCommand{
else if($itemCode == $general->getVar($itemType)){ else if($itemCode == $general->getVar($itemType)){
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.'); $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 가지고 있습니다.');
} }
else if($itemType != 'item' && !buildItemClass($general->getVar($itemType))->isBuyable()){ else if(!buildItemClass($general->getVar($itemType))->isBuyable()){
$this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.'); $this->fullConditionConstraints[] = ConstraintHelper::AlwaysFail('이미 진귀한 것을 가지고 있습니다.');
} }
} }
@@ -176,6 +176,7 @@ class che_장수대상임관 extends Command\GeneralCommand{
$general->setAuxVar('joinedNations', $joinedNations); $general->setAuxVar('joinedNations', $joinedNations);
} }
$general->increaseInheritancePoint('active_action', 1);
$general->addExperience($exp); $general->addExperience($exp);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
+1
View File
@@ -211,6 +211,7 @@ class che_첩보 extends Command\GeneralCommand
$ded = Util::randRangeInt(1, 70); $ded = Util::randRangeInt(1, 70);
[$reqGold, $reqRice] = $this->getCost(); [$reqGold, $reqRice] = $this->getCost();
$general->increaseInheritancePoint('active_action', 0.5);//NOTE: 첩보만 예외!
$general->increaseVarWithLimit('gold', -$reqGold, 0); $general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->increaseVarWithLimit('rice', -$reqRice, 0); $general->increaseVarWithLimit('rice', -$reqRice, 0);
$general->addExperience($exp); $general->addExperience($exp);
+5 -1
View File
@@ -223,9 +223,13 @@ class che_출병 extends Command\GeneralCommand
$this->destCity['term'] = 3; $this->destCity['term'] = 3;
$general->addDex($general->getCrewTypeObj(), $general->getVar('crew') / 100); $general->addDex($general->getCrewTypeObj(), $general->getVar('crew') / 100);
if($general->getVar('crew') > 500 && $general->getVar('train') * $general->getVar('atmos') > 70 * 70){
//500명 이상, 모훈출, 모사출
$general->increaseInheritancePoint('active_action', 1);
}
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->applyDB($db); $general->applyDB($db);
processWar($general, $this->nation, $this->destCity); processWar($general, $this->nation, $this->destCity);
+1
View File
@@ -101,6 +101,7 @@ class che_하야 extends Command\GeneralCommand{
$general->setVar('officer_city', 0); $general->setVar('officer_city', 0);
$general->setVar('belong', 0); $general->setVar('belong', 0);
$general->setVar('makelimit', 12); $general->setVar('makelimit', 12);
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn(static::getName(), $this->arg)); $this->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange(); $general->checkStatChange();
+1
View File
@@ -199,6 +199,7 @@ class che_감축 extends Command\NationCommand{
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaUl} <M>감축</>하였습니다."); $logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaUl} <M>감축</>하였습니다.");
$logger->pushGlobalHistoryLog("<M><b>【감축】</b></><D><b>{$nationName}</b></>{$josaYiNation} <G><b>{$destCityName}</b></>{$josaUl} <M>감축</>하였습니다."); $logger->pushGlobalHistoryLog("<M><b>【감축】</b></><D><b>{$nationName}</b></>{$josaYiNation} <G><b>{$destCityName}</b></>{$josaUl} <M>감축</>하였습니다.");
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0)); $this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db); $general->applyDB($db);
@@ -146,6 +146,7 @@ class che_국기변경 extends Command\NationCommand
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <span style='color:{$color};'><b>국기</b></span>를 변경하였습니다"); $logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <span style='color:{$color};'><b>국기</b></span>를 변경하였습니다");
$logger->pushGlobalHistoryLog("<S><b>【국기변경】</b></><D><b>{$nationName}</b></>{$josaYiNation} <span style='color:{$color};'><b>국기</b></span>를 변경하였습니다."); $logger->pushGlobalHistoryLog("<S><b>【국기변경】</b></><D><b>{$nationName}</b></>{$josaYiNation} <span style='color:{$color};'><b>국기</b></span>를 변경하였습니다.");
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0)); $this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db); $general->applyDB($db);
return true; return true;
@@ -152,6 +152,7 @@ class che_국호변경 extends Command\NationCommand
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} 국호를 <D><b>{$newNationName}</b></>{$josaRo} 변경합니다."); $logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} 국호를 <D><b>{$newNationName}</b></>{$josaRo} 변경합니다.");
$logger->pushGlobalHistoryLog("<S><b>【국호변경】</b></><D><b>{$nationName}</b></>{$josaYiNation} 국호를 <D><b>{$newNationName}</b></>{$josaRo} 변경합니다."); $logger->pushGlobalHistoryLog("<S><b>【국호변경】</b></><D><b>{$nationName}</b></>{$josaYiNation} 국호를 <D><b>{$newNationName}</b></>{$josaRo} 변경합니다.");
$general->increaseInheritancePoint('active_action', 1);
$this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0)); $this->setResultTurn(new LastTurn($this->getName(), $this->arg, 0));
$general->applyDB($db); $general->applyDB($db);
return true; return true;
+1
View File
@@ -162,6 +162,7 @@ class che_증축 extends Command\NationCommand{
$general->addExperience(5 * ($this->getPreReqTurn() + 1)); $general->addExperience(5 * ($this->getPreReqTurn() + 1));
$general->addDedication(5 * ($this->getPreReqTurn() + 1)); $general->addDedication(5 * ($this->getPreReqTurn() + 1));
$general->increaseInheritancePoint('active_action', 1);
$josaUl = JosaUtil::pick($destCityName, '을'); $josaUl = JosaUtil::pick($destCityName, '을');
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
+1
View File
@@ -218,6 +218,7 @@ class che_천도 extends Command\NationCommand
'capset' => $db->sqleval('capset + 1'), 'capset' => $db->sqleval('capset + 1'),
], 'nation=%i', $nationID); ], 'nation=%i', $nationID);
$general->increaseInheritancePoint('active_action', 1);
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>{$josaRo} 천도했습니다. <1>$date</>"); $logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>{$josaRo} 천도했습니다. <1>$date</>");
$logger->pushGeneralHistoryLog("<G><b>{$destCityName}</b></>{$josaRo} <M>천도</>명령"); $logger->pushGeneralHistoryLog("<G><b>{$destCityName}</b></>{$josaRo} <M>천도</>명령");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaRo} <M>천도</> 명령"); $logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaRo} <M>천도</> 명령");
@@ -184,6 +184,7 @@ class che_초토화 extends Command\NationCommand{
\sammo\refreshNationStaticInfo(); \sammo\refreshNationStaticInfo();
\sammo\SetNationFront($nationID); \sammo\SetNationFront($nationID);
$general->increaseInheritancePoint('active_action', 1);
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>{$josaUl} 초토화했습니다. <1>$date</>"); $logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>{$josaUl} 초토화했습니다. <1>$date</>");
$logger->pushGeneralHistoryLog("<G><b>{$destCityName}</b></>{$josaUl} <M>초토화</> 명령"); $logger->pushGeneralHistoryLog("<G><b>{$destCityName}</b></>{$josaUl} <M>초토화</> 명령");
$logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaUl} <M>초토화</> 명령"); $logger->pushNationalHistoryLog("<Y>{$generalName}</>{$josaYi} <G><b>{$destCityName}</b></>{$josaUl} <M>초토화</> 명령");
@@ -132,6 +132,7 @@ class che_피장파장 extends Command\NationCommand{
$nextTerm = Util::round(sqrt($genCount*2)*10); $nextTerm = Util::round(sqrt($genCount*2)*10);
$nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm); $nextTerm = $this->generalObj->onCalcStrategic($this->getName(), 'delay', $nextTerm);
$nextTerm = Util::valueFit($nextTerm, Util::round(static::$delayCnt * 1.2));
return $nextTerm; return $nextTerm;
} }
+10 -3
View File
@@ -195,14 +195,21 @@ class GameConstBase
'che_은둔', 'None' 'che_은둔', 'None'
]; ];
public static $inheritBornSpecialPoint = 12000; public static $maxUniqueItemLimit = [
[-1, 1],
[3, 2],
[10, 3],
[20, 4]
];
public static $inheritBornSpecialPoint = 6000;
public static $inheritBornTurntimePoint = 3000; public static $inheritBornTurntimePoint = 3000;
public static $inheritBornCityPoint = 1000; public static $inheritBornCityPoint = 1000;
public static $inheritBornStatPoint = 1000; public static $inheritBornStatPoint = 1000;
public static $inheritItemUniqueMinPoint = 5000; public static $inheritItemUniqueMinPoint = 5000;
public static $inheritItemRandomPoint = 3000; public static $inheritItemRandomPoint = 3000;
public static $inheritBuffPoints = [0, 250, 750, 1500, 2500, 3750]; public static $inheritBuffPoints = [0, 200, 600, 1200, 2000, 3000];
public static $inheritSpecificSpecialPoint = 5000; public static $inheritSpecificSpecialPoint = 4000;
public static $inheritResetAttrPointBase = [1000, 1000, 2000, 3000];//필요하면 늘려서 쓰기 public static $inheritResetAttrPointBase = [1000, 1000, 2000, 3000];//필요하면 늘려서 쓰기
public static $allItems = [ public static $allItems = [
+2 -1
View File
@@ -58,7 +58,8 @@ class General implements iAction
'lived_month' => [true, 1, '생존'], 'lived_month' => [true, 1, '생존'],
'max_belong' => [false, 10, '최대 임관년 수'], 'max_belong' => [false, 10, '최대 임관년 수'],
'max_domestic_critical' => [true, 1, '최대 연속 내정 성공'], 'max_domestic_critical' => [true, 1, '최대 연속 내정 성공'],
'snipe_combat' => [true, 10, '병종 상성 우위 횟수'], 'active_action' => [true, 3, '능동 행동 수'],
//'snipe_combat' => [true, 10, '병종 상성 우위 횟수'],
'combat' => [['rank', 'warnum'], 5, '전투 횟수'], 'combat' => [['rank', 'warnum'], 5, '전투 횟수'],
'sabotage' => [['rank', 'firenum'], 20, '계략 성공 횟수'], 'sabotage' => [['rank', 'firenum'], 20, '계략 성공 횟수'],
'unifier' => [true, 1, '천통 기여'], 'unifier' => [true, 1, '천통 기여'],
+96 -38
View File
@@ -116,19 +116,19 @@ class GeneralAI
$nationStor = KVStorage::getStorage($db, $this->nation['nation'], 'nation_env'); $nationStor = KVStorage::getStorage($db, $this->nation['nation'], 'nation_env');
$nationStor->cacheValues(['npc_nation_policy', 'npc_general_policy', 'prev_income_gold', 'prev_income_rice']); $nationStor->cacheValues(['npc_nation_policy', 'npc_general_policy', 'prev_income_gold', 'prev_income_rice']);
$this->nationPolicy = new AutorunNationPolicy($general, $this->env['autorun_user']['options'], $nationStor->getValue('npc_nation_policy'), $gameStor->getValue('npc_nation_policy'), $this->nation, $this->env); $this->nationPolicy = new AutorunNationPolicy($general, $this->env['autorun_user']['options']??null, $nationStor->getValue('npc_nation_policy'), $gameStor->getValue('npc_nation_policy'), $this->nation, $this->env);
$this->generalPolicy = new AutorunGeneralPolicy($general, $this->env['autorun_user']['options'], $nationStor->getValue('npc_general_policy'), $gameStor->getValue('npc_general_policy'), $this->nation, $this->env); $this->generalPolicy = new AutorunGeneralPolicy($general, $this->env['autorun_user']['options']??null, $nationStor->getValue('npc_general_policy'), $gameStor->getValue('npc_general_policy'), $this->nation, $this->env);
$prevIncomeGold = $nationStor->prev_income_gold ?? 1000; $prevIncomeGold = $nationStor->prev_income_gold ?? 1000;
$prevIncomeRice = $nationStor->prev_income_rice ?? 1000; $prevIncomeRice = $nationStor->prev_income_rice ?? 1000;
$this->maxResourceActionAmount = Util::round(max( $this->maxResourceActionAmount = Util::valueFit(Util::round(max(
$this->nationPolicy->minimumResourceActionAmount, $this->nationPolicy->minimumResourceActionAmount,
$prevIncomeGold / 10, $prevIncomeGold / 10,
$prevIncomeRice / 10, $prevIncomeRice / 10,
$this->nation['gold'] / 5, $this->nation['gold'] / 5,
$this->nation['rice'] / 5, $this->nation['rice'] / 5,
($this->env['year'] - $this->env['startyear'] - 3) * 1000 ($this->env['year'] - $this->env['startyear'] - 3) * 1000
), -2); ), -2), null, $this->nationPolicy->maximumResourceActionAmount);
if ($this->maxResourceActionAmount > GameConst::$maxResourceActionAmount) { if ($this->maxResourceActionAmount > GameConst::$maxResourceActionAmount) {
$this->maxResourceActionAmount = GameConst::$maxResourceActionAmount; $this->maxResourceActionAmount = GameConst::$maxResourceActionAmount;
} }
@@ -2091,7 +2091,7 @@ class GeneralAI
$cmdList = []; $cmdList = [];
if ($nation['rice'] < GameConst::$baserice) { if (($nation['rice'] < GameConst::$baserice) && Util::randBool(0.3)) {
return null; return null;
} }
@@ -2226,7 +2226,7 @@ class GeneralAI
$city = $this->city; $city = $this->city;
$nation = $this->nation; $nation = $this->nation;
if ($nation['rice'] < GameConst::$baserice) { if (($nation['rice'] < GameConst::$baserice) && Util::randBool(0.3)) {
return null; return null;
} }
@@ -2665,7 +2665,7 @@ class GeneralAI
$city = $this->city; $city = $this->city;
$nation = $this->nation; $nation = $this->nation;
if ($nation['rice'] < GameConst::$baserice) { if (($nation['rice'] < GameConst::$baserice) && Util::randBool(0.7)) {
return null; return null;
} }
@@ -2938,10 +2938,6 @@ class GeneralAI
return null; return null;
} }
if ($this->nation['rice'] < GameConst::$baserice) {
return null;
}
$this->categorizeNationCities(); $this->categorizeNationCities();
$this->categorizeNationGeneral(); $this->categorizeNationGeneral();
@@ -2970,9 +2966,6 @@ class GeneralAI
protected function do내정워프(): ?GeneralCommand protected function do내정워프(): ?GeneralCommand
{ {
if ($this->nation['rice'] < GameConst::$baserice) {
return null;
}
if (($this->genType & self::t통솔장) && in_array($this->dipState, [self::d징병, self::d직전, self::d전쟁])) { if (($this->genType & self::t통솔장) && in_array($this->dipState, [self::d징병, self::d직전, self::d전쟁])) {
return null; return null;
} }
@@ -3082,7 +3075,7 @@ class GeneralAI
$general = $this->general; $general = $this->general;
$lordCities = $db->queryFirstColumn('SELECT city.city as city FROM general LEFT JOIN city ON general.city = city.city WHERE general.officer_level = 12 AND city.nation = 0'); $lordCities = $db->queryFirstColumn('SELECT city.city as city FROM general LEFT JOIN city ON general.city = city.city WHERE general.officer_level = 12 AND city.nation = 0');
$nationCities = $db->queryFirstColumn('SELECT city a FROM city WHERE nation != 0'); $nationCities = $db->queryFirstColumn('SELECT city FROM city WHERE nation != 0');
$occupiedCities = []; $occupiedCities = [];
foreach ($lordCities as $tCityId) { foreach ($lordCities as $tCityId) {
@@ -3092,38 +3085,62 @@ class GeneralAI
$occupiedCities[$tCityId] = 1; $occupiedCities[$tCityId] = 1;
} }
$movingTargetCityID = $general->getAuxVar('movingTargetCityID');
$currCityID = $general->getCityID(); $currCityID = $general->getCityID();
$targetCity = []; if($movingTargetCityID === $currCityID){
$movingTargetCityID = null;
}
else if(key_exists($movingTargetCityID, $occupiedCities)){
$movingTargetCityID = null;
}
if($movingTargetCityID === null){
//어느 도시로 갈 것인가?
$candidateCities = [];
foreach(searchDistance($currCityID, 4) as $testCityID => $dist){
if(key_exists($testCityID, $occupiedCities)){
continue;
}
$cityLevel = CityConst::byID($testCityID)->level;
if ($cityLevel < 5 || 6 < $cityLevel) {
continue;
}
$candidateCities[] = [$testCityID, 1 / pow(2, $dist)];
}
if(!$candidateCities){
return null;
}
$movingTargetCityID = Util::choiceRandomUsingWeightPair($candidateCities);
$general->setAuxVar('movingTargetCityID', $movingTargetCityID);
}
if($movingTargetCityID == $currCityID){
return buildGeneralCommandClass('che_인재탐색', $general, $this->env);
}
$distMap = searchDistance($movingTargetCityID, 99);
$targetDistance = $distMap[$currCityID];
$candidateCities = [];
//NOTE: 최단 거리가 현재 도시에서 '어떻게 가야' 가장 짧은지 알 수가 없으므로, 한칸 간 다음 계산하기로
//출발지가 정해져 있으므로, searchAllDistanceByCityList는 비효율적.
foreach (array_keys(CityConst::byID($currCityID)->path) as $nearCityID) { foreach (array_keys(CityConst::byID($currCityID)->path) as $nearCityID) {
if (CityConst::byID($nearCityID)->level < 4) { $cityLevel = CityConst::byID($nearCityID)->level;
$targetCity[$nearCityID] = 0.5; if(5 <= $cityLevel && $cityLevel <= 6 && !key_exists($nearCityID, $occupiedCities)){
} else if (!key_exists($nearCityID, $occupiedCities)) { //바로 옆 도시로 이동하면 건국 가능하다면? 가보자
$targetCity[$nearCityID] = 2; $candidateCities[] = [$nearCityID, 10];
} else {
$targetCity[$nearCityID] = 0;
} }
if($distMap[$nearCityID] + 1 == $targetDistance){
$distanceFrom = searchDistance($nearCityID, 4, true); $candidateCities[] = [$nearCityID, 1];
foreach ($distanceFrom as $distance => $distCities) {
foreach ($distCities as $distCity) {
if (key_exists($distCity, $occupiedCities)) {
continue;
}
if (CityConst::byID($distCity)->level < 4) {
continue;
}
$targetCity[$nearCityID] += 1 / (2 ** $distance);
} }
} }
if(!$candidateCities){
return null;
} }
$cmd = buildGeneralCommandClass('che_이동', $general, $this->env, [ $cmd = buildGeneralCommandClass('che_이동', $general, $this->env, [
'destCityID' => Util::choiceRandomUsingWeight($targetCity) 'destCityID' => Util::choiceRandomUsingWeightPair($candidateCities)
]); ]);
if (!$cmd->hasFullConditionMet()) { if (!$cmd->hasFullConditionMet()) {
return null; return null;
@@ -3146,6 +3163,43 @@ class GeneralAI
return null; return null;
} }
$currentCityLevel = CityConst::byID($general->getCityID())->level;
if (($currentCityLevel < 5 || 6 < $currentCityLevel) && Util::randBool(0.5)){
return null;
}
$db = DB::db();
$lordCities = $db->queryFirstColumn('SELECT city.city as city FROM general LEFT JOIN city ON general.city = city.city WHERE general.officer_level = 12 AND city.nation = 0');
$nationCities = $db->queryFirstColumn('SELECT city FROM city WHERE nation != 0');
$occupiedCities = [];
foreach ($lordCities as $tCityId) {
$occupiedCities[$tCityId] = 2;
}
foreach ($nationCities as $tCityId) {
$occupiedCities[$tCityId] = 1;
}
$availableNearCity = false;
foreach(searchDistance($general->getCityID(), 3) as $targetCityID => $dist){
if(key_exists($targetCityID, $occupiedCities)){
continue;
}
$cityLevel = CityConst::byID($targetCityID)->level;
if($cityLevel < 5 || 6 < $cityLevel){
continue;
}
if($dist == 3 && Util::randBool()){
continue;
}
$availableNearCity = true;
break;
}
if(!$availableNearCity){
return null;
}
$prop = Util::randF() * (GameConst::$defaultStatNPCMax + GameConst::$chiefStatMin) / 2; $prop = Util::randF() * (GameConst::$defaultStatNPCMax + GameConst::$chiefStatMin) / 2;
$ratio = ($this->fullLeadership + $this->fullStrength + $this->fullIntel) / 3; $ratio = ($this->fullLeadership + $this->fullStrength + $this->fullIntel) / 3;
@@ -3156,7 +3210,7 @@ class GeneralAI
//XXX: 건국기한 2년 //XXX: 건국기한 2년
$more = Util::valueFit(3 - $this->env['year'] + $this->env['init_year'], 1, 3); $more = Util::valueFit(3 - $this->env['year'] + $this->env['init_year'], 1, 3);
if (!Util::randBool(0.005 * $more)) { if (!Util::randBool(0.0075 * $more)) {
return null; return null;
} }
@@ -3175,6 +3229,8 @@ class GeneralAI
return null; return null;
} }
$this->general->setAuxVar('movingTargetCityID', null);
return $cmd; return $cmd;
} }
@@ -3191,6 +3247,8 @@ class GeneralAI
return null; return null;
} }
$this->general->setAuxVar('movingTargetCityID', null);
return $cmd; return $cmd;
} }
+1 -1
View File
@@ -128,7 +128,7 @@ class ResetHelper{
} }
} }
opcache_reset(); //opcache_reset();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->resetValues(); $gameStor->resetValues();
+21 -1
View File
@@ -238,6 +238,7 @@ class TurnExecutionHelper
$turnObj = new static($general); $turnObj = new static($general);
$env = $gameStor->getAll(true); $env = $gameStor->getAll(true);
[$startYear, $year, $month, $turnterm] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'turnterm']);
$hasNationTurn = false; $hasNationTurn = false;
if ($general->getVar('nation') != 0 && $general->getVar('officer_level') >= 5) { if ($general->getVar('nation') != 0 && $general->getVar('officer_level') >= 5) {
@@ -263,13 +264,22 @@ class TurnExecutionHelper
$turnObj->preprocessCommand($env); $turnObj->preprocessCommand($env);
if ($general->getNPCType() >= 2 || ($autorun_user['limit_minutes'] ?? false)) { if ($general->getNPCType() >= 2){
$ai = new GeneralAI($turnObj->getGeneral());
} else {
$limitYearMonth = $general->getAuxVar('autorun_limit')??Util::joinYearMonth($year-2, $month);
if(Util::joinYearMonth($year, $month) < $limitYearMonth){
$ai = new GeneralAI($turnObj->getGeneral()); $ai = new GeneralAI($turnObj->getGeneral());
} }
}
$hasReservedTurn = false;
if (!$turnObj->processBlocked()) { if (!$turnObj->processBlocked()) {
if ($hasNationTurn) { if ($hasNationTurn) {
if (!($nationCommandObj instanceof Command\Nation\휴식)) {
$hasReservedTurn = true;
}
if ($ai && ($general->getAuxVar('use_auto_nation_turn') ?? 1)) { if ($ai && ($general->getAuxVar('use_auto_nation_turn') ?? 1)) {
$nationCommandObj = $ai->chooseNationTurn($nationCommandObj); $nationCommandObj = $ai->chooseNationTurn($nationCommandObj);
$cityName = CityConst::byID($general->getCityID())->name; $cityName = CityConst::byID($general->getCityID())->name;
@@ -283,6 +293,9 @@ class TurnExecutionHelper
} }
$generalCommandObj = $general->getReservedTurn(0, $env); $generalCommandObj = $general->getReservedTurn(0, $env);
if (!($generalCommandObj instanceof Command\General\휴식)) {
$hasReservedTurn = true;
}
if ($ai) { if ($ai) {
$newGeneralCommandObj = $ai->chooseGeneralTurn($generalCommandObj); // npc AI 처리 $newGeneralCommandObj = $ai->chooseGeneralTurn($generalCommandObj); // npc AI 처리
@@ -302,6 +315,13 @@ class TurnExecutionHelper
$currentTurn = $general->getTurnTime(); $currentTurn = $general->getTurnTime();
$general->increaseVarWithLimit('myset', 3, null, 9); $general->increaseVarWithLimit('myset', 3, null, 9);
if(($autorun_user['limit_minutes']??false) && $general->getNPCType() < 2 && $hasReservedTurn){
$autorun_limit = Util::joinYearMonth($year, $month);
$autorun_limit += intdiv($autorun_user['limit_minutes'], $turnterm);
$general->setAuxVar('autorun_limit', $autorun_limit);
}
$turnObj->updateTurnTime(); $turnObj->updateTurnTime();
$turnObj->applyDB(); $turnObj->applyDB();
} }
+6
View File
@@ -157,7 +157,13 @@ class WarUnitGeneral extends WarUnit
$general->increaseRankVar('occupied', 1); $general->increaseRankVar('occupied', 1);
} }
if($this->isAttacker()){
$general->multiplyVarWithLimit('atmos', 1.1, null, GameConst::$maxAtmosByWar); $general->multiplyVarWithLimit('atmos', 1.1, null, GameConst::$maxAtmosByWar);
}
else{
$general->multiplyVarWithLimit('atmos', 1.05, null, GameConst::$maxAtmosByWar);
}
$this->addStatExp(1); $this->addStatExp(1);
} }
+8
View File
@@ -154,6 +154,14 @@
title="포상/몰수/헌납/삼/팜 최소 단위" title="포상/몰수/헌납/삼/팜 최소 단위"
>연산결과가 단위보다 적다면 수행하지 않습니다.</NumberInputWithInfo >연산결과가 단위보다 적다면 수행하지 않습니다.</NumberInputWithInfo
> >
</div>
<div class="col">
<NumberInputWithInfo
v-model="nationPolicy.maximumResourceActionAmount"
:step="100"
title="포상/몰수/헌납/삼/팜 최대 단위"
>연산결과가 단위보다 크다면, 값에 맞춥니다.</NumberInputWithInfo
>
</div> </div>
<div class="col"> <div class="col">
<NumberInputWithInfo <NumberInputWithInfo
+1
View File
@@ -125,6 +125,7 @@ export type NationPolicy = {
reqNPCDevelGold: number, reqNPCDevelGold: number,
reqNPCDevelRice: number, reqNPCDevelRice: number,
minimumResourceActionAmount: number, minimumResourceActionAmount: number,
maximumResourceActionAmount: number,
minNPCWarLeadership: number, minNPCWarLeadership: number,
minWarCrew: number, minWarCrew: number,
minNPCRecruitCityPopulation: number, minNPCRecruitCityPopulation: number,
+122 -5
View File
@@ -11,9 +11,12 @@ import { unwrap_any } from '../util/unwrap_any';
import { sha512 } from 'js-sha512'; import { sha512 } from 'js-sha512';
import { unwrap } from '../util/unwrap'; import { unwrap } from '../util/unwrap';
import { InvalidResponse } from '../defs'; import { InvalidResponse } from '../defs';
import internal from 'stream';
import { delay } from '../util/delay';
type LoginResponse = { type LoginResponse = {
result: true, result: true,
nextToken: [number, string] | undefined,
} | { } | {
result: false, result: false,
reqOTP: boolean, reqOTP: boolean,
@@ -29,6 +32,19 @@ type OTPResponse = {
reason: string, reason: string,
} }
type AutoLoginNonceResponse = {
result: true,
loginNonce: string,
} | InvalidResponse;
type AutoLoginResponse = {
result: true,
nextToken: [number, string] | undefined,
} | {
result: false,
silent: boolean,
reason: string,
}
declare global { declare global {
interface Window { interface Window {
getOAuthToken: (mode: string, scope_list: string[]) => void; getOAuthToken: (mode: string, scope_list: string[]) => void;
@@ -41,6 +57,92 @@ declare const kakao_oauth_redirect_uri: string;
let oauthMode: string | null = null; let oauthMode: string | null = null;
const TOKEN_VERSION = 1;
const LOGIN_TOKEN_KEY = 'sammo_login_token';
function regNextToken(tokenInfo: [number, string]) {
localStorage.setItem(LOGIN_TOKEN_KEY, JSON.stringify([TOKEN_VERSION, tokenInfo, Date.now()]));
}
function getToken(): [number, string] | undefined {
const trialToken = localStorage.getItem(LOGIN_TOKEN_KEY);
if (!trialToken) {
return;
}
const tokenItems = JSON.parse(trialToken);
if (tokenItems[0] != TOKEN_VERSION) {
console.log(tokenItems);
resetToken();
return;
}
const [, token,] = tokenItems;
return token;
}
function resetToken(){
localStorage.removeItem(LOGIN_TOKEN_KEY);
}
async function tryAutoLogin() {
try {
const tokenInfo = getToken();
if (!tokenInfo) {
return;
}
const [tokenID, token] = tokenInfo;
const result = await axios.post<AutoLoginNonceResponse>('api.php', {
path: ["Login", "ReqNonce"]
});
if(!result){
//api 에러.
return;
}
if(!result.data.result){
resetToken();
return;
}
const nonce = result.data.loginNonce;
const hashedToken = sha512(token + nonce);
const _loginResult = await axios.post<AutoLoginResponse>('api.php', {
path: ["Login", "LoginByToken"],
args: {
'hashedToken':hashedToken,
'token_id':tokenID,
}
});
if(!_loginResult){
return;
}
const loginResult = _loginResult.data;
if(!loginResult.result){
if(!loginResult.silent){
alert(loginResult.reason);
}
console.error(loginResult.reason);
return;
}
if(loginResult.nextToken){
regNextToken(loginResult.nextToken);
}
window.location.href = "./";
}
catch(e){
console.error(e);
return;
}
}
function getOAuthToken(mode: string, scope_list?: string[] | string) { function getOAuthToken(mode: string, scope_list?: string[] | string) {
if (mode === undefined) { if (mode === undefined) {
mode = 'login'; mode = 'login';
@@ -115,6 +217,9 @@ async function doLoginUsingOAuth() {
} }
if (result.result) { if (result.result) {
if (result.nextToken) {
regNextToken(result.nextToken);
}
window.location.href = "./"; window.location.href = "./";
return; return;
} }
@@ -156,9 +261,16 @@ function postOAuthResult(mode: string) {
window.postOAuthResult = postOAuthResult; window.postOAuthResult = postOAuthResult;
$(function ($) { $(async function ($) {
setAxiosXMLHttpRequest(); setAxiosXMLHttpRequest();
//로그인 먼저 해볼 것
if(getToken()){
void tryAutoLogin();
await delay(100);
}
type LoginFormType = { type LoginFormType = {
username: string, username: string,
password: string, password: string,
@@ -194,13 +306,16 @@ $(function ($) {
try { try {
const response = await axios({ const response = await axios({
url: 'j_login.php', url: 'api.php',
responseType: 'json', responseType: 'json',
method: 'post', method: 'post',
data: convertFormData({ data: {
path: ["Login", "LoginByID"],
args: {
username: values.username, username: values.username,
password: hash_pw, password: hash_pw,
}) }
}
}); });
result = response.data; result = response.data;
} }
@@ -212,6 +327,9 @@ $(function ($) {
if (result.result) { if (result.result) {
if (result.nextToken) {
regNextToken(result.nextToken);
}
window.location.href = "./"; window.location.href = "./";
return; return;
} }
@@ -273,7 +391,6 @@ $(function ($) {
getOAuthToken('login', ['account_email', 'talk_message']); getOAuthToken('login', ['account_email', 'talk_message']);
}) })
//TODO: 모바일에서 크기 비례 지도 다시 띄우기? //TODO: 모바일에서 크기 비례 지도 다시 띄우기?
/* /*
if (document.body.clientWidth < 700) { if (document.body.clientWidth < 700) {
+8 -3
View File
@@ -272,7 +272,8 @@ type InheritanceType =
| "lived_month" | "lived_month"
| "max_belong" | "max_belong"
| "max_domestic_critical" | "max_domestic_critical"
| "snipe_combat" | "active_action"
// | "snipe_combat"
| "combat" | "combat"
| "sabotage" | "sabotage"
| "unifier" | "unifier"
@@ -320,10 +321,14 @@ const inheritanceViewText: Record<
title: "최대 연속 내정 성공", title: "최대 연속 내정 성공",
info: "성공한 내정 중 최대 연속값입니다.", info: "성공한 내정 중 최대 연속값입니다.",
}, },
snipe_combat: { active_action: {
title: "능동 행동 수",
info: "장수 동향에 본인의 이름이 직접 나타난 수입니다.<br>일부 사령턴은 제외됩니다."
},
/* snipe_combat: {
title: "병종 상성 우위 횟수", title: "병종 상성 우위 횟수",
info: "유리한 상성을 가지고 전투했습니다.", info: "유리한 상성을 가지고 전투했습니다.",
}, },*/
combat: { combat: {
title: "전투 횟수", title: "전투 횟수",
info: "전투 횟수입니다.", info: "전투 횟수입니다.",
+18 -7
View File
@@ -13,6 +13,8 @@ import './msg.ts';
import './map.ts'; import './map.ts';
import { exportWindow } from './util/exportWindow'; import { exportWindow } from './util/exportWindow';
import {stringifyUrl} from 'query-string'; import {stringifyUrl} from 'query-string';
import { joinYearMonth } from './util/joinYearMonth';
import { parseYearMonth } from './util/parseYearMonth';
exportWindow($, '$'); exportWindow($, '$');
type TurnArg = { type TurnArg = {
@@ -33,6 +35,7 @@ type ReservedTurnResponse = {
month: number, month: number,
date: string, date: string,
turn: TurnItem[], turn: TurnItem[],
autorun_limit: number|null,
} }
$(function ($) { $(function ($) {
@@ -65,10 +68,12 @@ $(function ($) {
const turnTime = parseTime(data.turnTime); const turnTime = parseTime(data.turnTime);
let nextTurnTime = new Date(turnTime); let nextTurnTime = new Date(turnTime);
let year = data.year; let nowYearMonth = joinYearMonth(data.year, data.month);
let month = data.month; const autorunLimitYearMonth = data.autorun_limit ?? nowYearMonth - 1;
const [autorunLimitYear, autorunLimitMonth] = parseYearMonth(autorunLimitYearMonth);
for (const [turnIdx, turnInfo] of Object.entries(data.turn)) { for (const [turnIdx, turnInfo] of Object.entries(data.turn)) {
const [year, month] = parseYearMonth(nowYearMonth);
const $tr = $(`#command_${turnIdx}`); const $tr = $(`#command_${turnIdx}`);
$tr.find('.time_pad').text(formatTime(nextTurnTime, 'HH:mm')); $tr.find('.time_pad').text(formatTime(nextTurnTime, 'HH:mm'));
@@ -76,6 +81,16 @@ $(function ($) {
const $turn_pad = $tr.find('.turn_pad'); const $turn_pad = $tr.find('.turn_pad');
const $turn_text = $turn_pad.find('.turn_text'); const $turn_text = $turn_pad.find('.turn_text');
$turn_text.text(turnInfo.brief).css('font-size', '13px'); $turn_text.text(turnInfo.brief).css('font-size', '13px');
if(nowYearMonth <= autorunLimitYearMonth){
const brief = turnInfo.brief != '휴식'? turnInfo.brief :'휴식<small>(자율 행동)</small>';
const autorunTooltip = `<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"
><span style='color:#aaffff;'>${brief}</span
><span class="tooltiptext"> 기간: ${autorunLimitYear} ${autorunLimitMonth}</span
></span>`;
$turn_text.html(autorunTooltip);
initTooltip($turn_text);
}
const oWidth = unwrap($turn_pad.innerWidth()); const oWidth = unwrap($turn_pad.innerWidth());
const iWidth = unwrap($turn_text.outerWidth()); const iWidth = unwrap($turn_text.outerWidth());
@@ -85,11 +100,7 @@ $(function ($) {
} }
nextTurnTime = addMinutes(nextTurnTime, data.turnTerm); nextTurnTime = addMinutes(nextTurnTime, data.turnTerm);
month += 1; nowYearMonth += 1;
if (month >= 13) {
year += 1;
month -= 12;
}
} }
console.log(data); console.log(data);
+3
View File
@@ -0,0 +1,3 @@
export function joinYearMonth(year: number, month: number): number {
return year * 12 + month - 1;
}
+3
View File
@@ -0,0 +1,3 @@
export function parseYearMonth(yearMonth: number): [number, number] {
return [(yearMonth / 12) | 0, yearMonth % 12 + 1];
}
+2 -2
View File
@@ -63,8 +63,8 @@ if ($currentNationPolicy['reqHumanWarUrgentRice'] ?? 0) {
if ($currentNationPolicy['reqHumanWarUrgentGold'] ?? 0) { if ($currentNationPolicy['reqHumanWarUrgentGold'] ?? 0) {
$autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold']; $autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold'];
} }
$autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true)); $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options']??[], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true));
$zeroPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], null, null, $nation, $gameStor->getAll(true)); $zeroPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options']??[], null, null, $nation, $gameStor->getAll(true));
$lastSetters = [ $lastSetters = [
'policy' => [ 'policy' => [
-181
View File
@@ -1,181 +0,0 @@
<?php
namespace sammo;
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/oauth_kakao/lib.join.php');
WebUtil::requireAJAX();
use \kakao\Kakao_REST_API_Helper as Kakao_REST_API_Helper;
$RootDB = RootDB::db();
$session = Session::getInstance();
if ($session->isLoggedIn()) {
$session->logout();
}
$username = mb_strtolower(Util::getPost('username'), 'utf-8');
$password = Util::getPost('password');
if (!$username || !$password) {
Json::die([
'result' => false,
'reqOTP' => false,
'reason' => '올바르지 않은 입력입니다.'
]);
}
function kakaoOAuthCheck(array $userInfo): ?array
{
if (!\kakao\KakaoKey::REST_KEY) {
return [false, '카카오 API 앱이 등록되지 않았습니다. 관리자에게 문의해 주세요.'];
}
$oauthID = $userInfo['oauth_id'];
$oauthInfo = Json::decode($userInfo['oauth_info']) ?? [];
if (!$oauthInfo) {
return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessToken = $oauthInfo['accessToken'] ?? null;
$refreshToken = $oauthInfo['refreshToken'] ?? null;
$accessTokenValidUntil = $oauthInfo['accessTokenValidUntil'] ?? null;
$refreshTokenValidUntil = $oauthInfo['refreshTokenValidUntil'] ?? null;
$OTPValue = $oauthInfo['OTPValue'] ?? null;
$OTPTrialUntil = $oauthInfo['OTPTrialUntil'] ?? null;
$tokenValidUntil = $userInfo['token_valid_until'];
if (!$accessToken || !$refreshToken || !$accessTokenValidUntil || !$refreshTokenValidUntil) {
return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.'];
}
$now = TimeUtil::now();
if ($now > $refreshTokenValidUntil) {
return [false, '로그인 토큰이 만료되었습니다. 카카오 로그인을 수행해 주세요.'];
}
if ($now > $accessTokenValidUntil) {
$apiHelper = new Kakao_REST_API_Helper($accessToken);
$refreshResult = $apiHelper->refresh_access_token($refreshToken);
if (!$refreshResult) {
return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessToken = $refreshResult['access_token'] ?? null;
if (!$accessToken) {
trigger_error("refreshToken 에러 " . Json::encode($refreshResult) . "," . $refreshToken . "," . substr(\kakao\KakaoKey::REST_KEY, 0, 6), E_USER_NOTICE);
return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['expires_in']);
$oauthInfo['accessToken'] = $accessToken;
$oauthInfo['accessTokenValidUntil'] = $accessTokenValidUntil;
$refreshToken = $refreshResult['refresh_token'] ?? null;
if ($refreshToken) {
$refreshTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['refresh_token_expires_in']);
$oauthInfo['refreshToken'] = $refreshToken;
$oauthInfo['refresh_token_expires_in'] = $refreshTokenValidUntil;
}
RootDB::db()->update('member', [
'oauth_info' => Json::encode($oauthInfo)
], 'no=%i', $userInfo['no']);
}
if ($tokenValidUntil && $now <= $tokenValidUntil) {
return null;
}
//인증 시스템 가동
$session = Session::getInstance();
$session->access_token = $accessToken;
$session->expires = $accessTokenValidUntil;
$session->refresh_token = $refreshToken;
$session->refresh_token_expires = $refreshTokenValidUntil;
if (!createOTPbyUserNO($userInfo['no'])) {
return [false, '인증 코드를 보내는데 실패했습니다.'];
}
return [true, '인증 코드를 입력해주세요'];
}
$userInfo = $RootDB->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_id, oauth_type, oauth_info, token_valid_until ' .
'from member where id=%s_username AND ' .
'pw=sha2(concat(salt, %s_password, salt), 512)',
[
'username' => $username,
'password' => $password
]
);
if (!$userInfo) {
Json::die([
'result' => false,
'reqOTP' => false,
'reason' => '아이디나 비밀번호가 올바르지 않습니다.'
]);
}
$canLogin = $RootDB->queryFirstField('SELECT `LOGIN` FROM `system` WHERE `NO` = 1');
if ($canLogin != 'Y' && $userInfo['grade'] < 5) {
Json::die([
'result' => false,
'reason' => '현재는 로그인이 금지되어있습니다!'
]);
}
$nowDate = TimeUtil::now();
if ($userInfo['delete_after']) {
if ($userInfo['delete_after'] < $nowDate) {
$RootDB->delete('member', 'no=%i', $userInfo['no']);
Json::die([
'result' => false,
'reqOTP' => false,
'reason' => "기간 만기로 삭제되었습니다. 재 가입을 시도해주세요."
]);
} else {
Json::die([
'result' => false,
'reqOTP' => false,
'reason' => "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]"
]);
}
}
$RootDB->insert('member_log', [
'member_no' => $userInfo['no'],
'action_type' => 'login',
'action' => Json::encode([
'ip' => Util::get_client_ip(true),
'type' => 'plain'
])
]);
if ($userInfo['oauth_type'] == 'KAKAO') {
$oauthFailResult = kakaoOAuthCheck($userInfo);
if ($oauthFailResult !== null) {
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], Json::decode($userInfo['acl'] ?? '{}'));
[$oauthReqOTP, $oauthFailReason] = $oauthFailResult;
Json::die([
'result' => false,
'reqOTP' => $oauthReqOTP,
'reason' => $oauthFailReason
]);
}
}
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], Json::decode($userInfo['acl'] ?? '{}'));
Json::die([
'result' => true,
'reqOTP' => false,
'reason' => '로그인 되었습니다.'
]);
+2 -2
View File
@@ -267,7 +267,7 @@ if ($server == $baseServerName) {
$storage->$server = [$target, $version]; $storage->$server = [$target, $version];
opcache_reset(); //opcache_reset();
Json::die([ Json::die([
'server' => $server, 'server' => $server,
@@ -321,7 +321,7 @@ genJS($server);
$storage->$server = [$target, $version]; $storage->$server = [$target, $version];
//ServConfig::getServerList()[$server]->closeServer(); //ServConfig::getServerList()[$server]->closeServer();
opcache_reset(); //opcache_reset();
Json::die([ Json::die([
'server' => $server, 'server' => $server,
+47 -6
View File
@@ -1,10 +1,15 @@
<?php <?php
namespace sammo; namespace sammo;
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/autoload.php');
require('lib.join.php'); require('lib.join.php');
//TODO: KakaoOauth를 API로 정식으로 이동
WebUtil::requireAJAX(); WebUtil::requireAJAX();
use \kakao\Kakao_REST_API_Helper as Kakao_REST_API_Helper; use \kakao\Kakao_REST_API_Helper as Kakao_REST_API_Helper;
$RootDB = RootDB::db(); $RootDB = RootDB::db();
@@ -119,7 +124,9 @@ if(!$email){
$userInfo = $RootDB->queryFirstRow( $userInfo = $RootDB->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_info, token_valid_until from member where email=%s',$email); 'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_info, token_valid_until from member where email=%s',
$email
);
if (!$userInfo) { if (!$userInfo) {
$restAPI->unlink(); $restAPI->unlink();
@@ -142,8 +149,7 @@ if($userInfo['delete_after']){
'reqOTP' => false, 'reqOTP' => false,
'reason' => "기간 만기로 삭제되었습니다. 재 가입을 시도해주세요.", 'reason' => "기간 만기로 삭제되었습니다. 재 가입을 시도해주세요.",
]); ]);
} } else {
else{
$restAPI->unlink(); $restAPI->unlink();
$session->access_token = null; $session->access_token = null;
Json::die([ Json::die([
@@ -152,7 +158,6 @@ if($userInfo['delete_after']){
'reason' => "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]" 'reason' => "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]"
]); ]);
} }
} }
$oauthInfo = Json::decode($userInfo['oauth_info']) ?? []; $oauthInfo = Json::decode($userInfo['oauth_info']) ?? [];
@@ -178,7 +183,7 @@ if(!$tokenValidUntil || $tokenValidUntil < $now){
'reason' => '인증 코드를 보내는데 실패했습니다.' 'reason' => '인증 코드를 보내는데 실패했습니다.'
]); ]);
} }
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], Json::decode($userInfo['acl']??'{}')); $session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
Json::die([ Json::die([
'result' => false, 'result' => false,
'reqOTP' => true, 'reqOTP' => true,
@@ -196,9 +201,45 @@ $RootDB->insert('member_log',[
]) ])
]); ]);
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], Json::decode($userInfo['acl']??'{}'));
//TODO: 이동하면서 이부분 정리
$nowDate = TimeUtil::now();
$RootDB->delete(
'login_token',
'user_id = %i AND expire_date < %s',
$userID,
$nowDate
);
$RootDB->query(
'DELETE invalid FROM login_token AS invalid
JOIN
( SELECT id
FROM login_token
WHERE user_id = %i
ORDER BY id DESC
LIMIT 8,1
) AS valid
ON invalid.id < valid.id WHERE user_id = %i',
$userID,
$userID
);
$token = Util::randomStr(20);
$RootDB->insert('login_token', [
'user_id' => $userInfo['no'],
'base_token' => $token,
'reg_ip' => Util::get_client_ip(true),
'reg_date' => $nowDate,
'expire_date' => TimeUtil::nowAddDays(7)
]);
$tokenID = $RootDB->insertId();
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
Json::die([ Json::die([
'result' => true, 'result' => true,
'reqOTP' => false, 'reqOTP' => false,
'nextToken' => [$tokenID, $token],
'reason' => '로그인 되었습니다.' 'reason' => '로그인 되었습니다.'
]); ]);
+162
View File
@@ -0,0 +1,162 @@
<?php
namespace sammo\API\Login;
use DateTime;
use sammo\Session;
use DateTimeInterface;
use sammo\BaseAPI;
use sammo\Json;
use sammo\KakaoUtil;
use sammo\RootDB;
use sammo\TimeUtil;
use sammo\Util;
use sammo\Validator;
class LoginByID extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v
->rule('required', [
'username',
'password'
]);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return BaseAPI::NO_SESSION;
}
public function scrubToken(int $userID)
{
$RootDB = RootDB::db();
$nowDate = TimeUtil::now();
$RootDB->delete(
'login_token',
'user_id = %i AND expire_date < %s',
$userID,
$nowDate
);
$RootDB->query(
'DELETE invalid FROM login_token AS invalid
JOIN
( SELECT id
FROM login_token
WHERE user_id = %i
ORDER BY id DESC
LIMIT 8,1
) AS valid
ON invalid.id < valid.id WHERE user_id = %i',
$userID,
$userID
);
}
public function addToken(int $userID)
{
$RootDB = RootDB::db();
$nowDate = TimeUtil::now();
$token = Util::randomStr(20);
$RootDB->insert('login_token', [
'user_id' => $userID,
'base_token' => $token,
'reg_ip' => Util::get_client_ip(true),
'reg_date' => $nowDate,
'expire_date' => TimeUtil::nowAddDays(7)
]);
$tokenID = $RootDB->insertId();
return [$tokenID, $token];
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{
$RootDB = RootDB::db();
if ($session->isLoggedIn()) {
$session->logout();
}
$username = $this->args['username'];
$password = $this->args['password'];
$userInfo = $RootDB->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_id, oauth_type, oauth_info, token_valid_until ' .
'from member where id=%s_username AND ' .
'pw=sha2(concat(salt, %s_password, salt), 512)',
[
'username' => $username,
'password' => $password
]
);
if (!$userInfo) {
return '아이디나 비밀번호가 올바르지 않습니다.';
}
$canLogin = $RootDB->queryFirstField('SELECT `LOGIN` FROM `system` WHERE `NO` = 1');
if ($canLogin != 'Y' && $userInfo['grade'] < 5) {
return '현재는 로그인이 금지되어있습니다!';
}
$nowDate = TimeUtil::now();
if ($userInfo['delete_after']) {
if ($userInfo['delete_after'] < $nowDate) {
$RootDB->delete('member', 'no=%i', $userInfo['no']);
return [
'result' => false,
'reqOTP' => false,
'reason' => "기간 만기로 삭제되었습니다. 재 가입을 시도해주세요."
];
} else {
return [
'result' => false,
'reqOTP' => false,
'reason' => "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]"
];
}
}
$RootDB->insert('member_log', [
'member_no' => $userInfo['no'],
'action_type' => 'login',
'action' => Json::encode([
'ip' => Util::get_client_ip(true),
'type' => 'plain'
])
]);
if ($userInfo['oauth_type'] == 'KAKAO') {
$oauthFailResult = KakaoUtil::kakaoOAuthCheck($userInfo);
if ($oauthFailResult !== null) {
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
[$oauthReqOTP, $oauthFailReason] = $oauthFailResult;
return [
'result' => false,
'reqOTP' => $oauthReqOTP,
'reason' => $oauthFailReason
];
}
}
$this->scrubToken($userInfo['no']);
$nextToken = $this->addToken($userInfo['no']);
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $nextToken[0], Json::decode($userInfo['acl'] ?? '{}'));
return [
'result' => true,
'reqOTP' => false,
'nextToken' => $nextToken,
'reason' => '로그인 되었습니다.'
];
}
}
+150
View File
@@ -0,0 +1,150 @@
<?php
namespace sammo\API\Login;
use sammo\Session;
use DateTimeInterface;
use sammo\BaseAPI;
use sammo\Json;
use sammo\KakaoUtil;
use sammo\RootDB;
use sammo\TimeUtil;
use sammo\Util;
use sammo\Validator;
class LoginByToken extends LoginByID
{
public function getRequiredSessionMode(): int
{
return \sammo\BaseAPI::NO_SESSION; //XXX: Token 때문에 엄밀히는 NO_SESSION이 아님
}
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v
->rule('required', [
'token_id',
'hashedToken'
]);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{
$loginNonce = $session->loginNonce ?? null;
$loginNonceExpired = $session->loginNonceExpired ?? null;
if (!is_string($loginNonce) || !is_string($loginNonceExpired)) {
return '자동 로그인: 절차 오류';
}
$RootDB = RootDB::db();
if ($session->isLoggedIn()) {
$session->logout();
}
$token_id = $this->args['token_id'];
$token_info = $RootDB->queryFirstRow('SELECT * FROM login_token WHERE id = %i', $token_id);
if (!$token_info) {
return [
'result' => false,
'silent' => true,
'reason' => 'failed'
];
}
$hashedToken = $this->args['hashedToken'];
$tokenAnswer = hash('sha512', "{$token_info['base_token']}{$loginNonce}");
if (strtolower($hashedToken) != strtolower($tokenAnswer)) {
return [
'result' => false,
'silent' => true,
'reason' => 'failed'
];
}
$userInfo = $RootDB->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade`, `delete_after`, `acl`, oauth_id, oauth_type, oauth_info, token_valid_until ' .
'from member where NO = %i',
$token_info['user_id']
);
if(!$userInfo){
return '자동 로그인: 올바른 계정이 아닙니다.';
}
$canLogin = $RootDB->queryFirstField('SELECT `LOGIN` FROM `system` WHERE `NO` = 1');
if ($canLogin != 'Y' && $userInfo['grade'] < 5) {
return '자동 로그인: 현재는 로그인이 금지되어있습니다!';
}
$nowDate = TimeUtil::now();
if ($userInfo['delete_after']) {
if ($userInfo['delete_after'] < $nowDate) {
$RootDB->delete('member', 'no=%i', $userInfo['no']);
return [
'result' => false,
'silent' => true,
'reason' => "기간 만기"
];
} else {
return [
'result' => false,
'silent' => true,
'reason' => "삭제 요청된 계정[{$userInfo['delete_after']}]"
];
}
}
$RootDB->insert('member_log', [
'member_no' => $userInfo['no'],
'action_type' => 'login',
'action' => Json::encode([
'ip' => Util::get_client_ip(true),
'type' => 'auto'
])
]);
if ($userInfo['oauth_type'] == 'KAKAO') {
$oauthFailResult = KakaoUtil::kakaoOAuthCheck($userInfo);
if ($oauthFailResult !== null) {
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
[$oauthReqOTP, $oauthFailReason] = $oauthFailResult;
$RootDB->delete(
'login_token',
'id = %i', $token_id
);
return $oauthFailReason;
}
}
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $token_id, Json::decode($userInfo['acl'] ?? '{}'));
$this->scrubToken($userInfo['no']);
$nextDate = TimeUtil::nowAddDays(2);
if($nextDate < $token_info['expire_date']){
return [
'result' => true,
'silent' => true,
'reason' => 'success'
];
}
$RootDB->delete(
'login_token',
'id = %i', $token_id
);
$nextToken = $this->addToken($userInfo['no']);
return [
'result' => true,
'silent' => true,
'nextToken' => $nextToken,
'reason' => 'success'
];
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
namespace sammo\API\Login;
use sammo\Session;
use DateTimeInterface;
use sammo\BaseAPI;
use sammo\Json;
use sammo\KakaoUtil;
use sammo\RootDB;
use sammo\TimeUtil;
use sammo\Util;
use sammo\Validator;
class ReqNonce extends BaseAPI{
public function getRequiredSessionMode(): int {
return \sammo\BaseAPI::NO_SESSION;
}
public function validateArgs(): ?string
{
return null;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) {
$loginNonce = Util::randomStr(16);
$loginNonceExpired = TimeUtil::nowAddSeconds(2);
$session->loginNonce = $loginNonce;
$session->loginNonceExpired = $loginNonceExpired;
return [
'result'=>true,
'loginNonce'=>$loginNonce,
];
}
}
+2 -2
View File
@@ -40,7 +40,7 @@ class APIHelper
$sessionMode = $obj->getRequiredSessionMode(); $sessionMode = $obj->getRequiredSessionMode();
if ($sessionMode === BaseAPI::NO_SESSION) { if ($sessionMode === BaseAPI::NO_SESSION) {
$session = null; $session = Session::getInstance();//XXX: NoSession이면 진짜 NoSession이어야..?
} else { } else {
if ($sessionMode & BaseAPI::REQ_GAME_LOGIN) { if ($sessionMode & BaseAPI::REQ_GAME_LOGIN) {
$session = Session::requireGameLogin(); $session = Session::requireGameLogin();
@@ -94,7 +94,7 @@ class APIHelper
], $cacheResult === null ? Json::NO_CACHE : 0); ], $cacheResult === null ? Json::NO_CACHE : 0);
} }
Json::die($result, $cacheResult === null ? Json::NO_CACHE : 0); Json::die($result, $cacheResult === null ? Json::NO_CACHE : 0);
} catch (\Exception $e) { } catch (\Throwable $e) {
Json::dieWithReason($e->getMessage()); Json::dieWithReason($e->getMessage());
} catch (mixed $e) { } catch (mixed $e) {
Json::dieWithReason(strval($e)); Json::dieWithReason(strval($e));
+3 -1
View File
@@ -82,7 +82,7 @@ class DummySession extends Session
return Util::array_get($_SESSION[$name]); return Util::array_get($_SESSION[$name]);
} }
public function login(int $userID, string $userName, int $grade, bool $reqOTP, ?string $tokenValidUntil, array $acl): Session public function login(int $userID, string $userName, int $grade, bool $reqOTP, ?string $tokenValidUntil, ?int $tokenID, array $acl): Session
{ {
$this->set('userID', $userID); $this->set('userID', $userID);
$this->set('userName', $userName); $this->set('userName', $userName);
@@ -92,6 +92,7 @@ class DummySession extends Session
$this->set('acl', $acl); $this->set('acl', $acl);
$this->set('reqOTP', $reqOTP); $this->set('reqOTP', $reqOTP);
$this->set('tokenValidUntil', $tokenValidUntil); $this->set('tokenValidUntil', $tokenValidUntil);
$this->set('tokenID', $tokenID);
return $this; return $this;
} }
@@ -117,6 +118,7 @@ class DummySession extends Session
$this->set('reqOTP', null); $this->set('reqOTP', null);
$this->set('time', time()); $this->set('time', time());
$this->set('lastMsgGet', null); $this->set('lastMsgGet', null);
$this->set('tokenID', null);
return $this; return $this;
} }
+221
View File
@@ -0,0 +1,221 @@
<?php
namespace sammo;
use kakao\Kakao_REST_API_Helper;
class KakaoUtil
{
private function __construct()
{
}
static function checkUsernameDup($username)
{
if (!$username) {
return '계정명을 입력해주세요';
}
$username = mb_strtolower($username, 'utf-8');
$length = strlen($username);
if ($length < 4 || $length > 64) {
return '적절하지 않은 길이입니다.';
}
$cnt = RootDB::db()->queryFirstField('SELECT count(no) FROM member WHERE `id` = %s LIMIT 1', $username);
if ($cnt != 0) {
return '이미 사용중인 계정명입니다';
}
return true;
}
static function checkNicknameDup($nickname)
{
if (!$nickname) {
return '닉네임을 입력해주세요';
}
$length = mb_strwidth($nickname, 'utf-8');
if ($length < 1 || $length > 18) {
return '적절하지 않은 길이입니다.';
}
$cnt = RootDB::db()->queryFirstField('SELECT count(no) FROM member WHERE `name` = %s LIMIT 1', $nickname);
if ($cnt != 0) {
return '이미 사용중인 닉네임입니다';
}
return true;
}
static function checkEmailDup($email)
{
if (!$email) {
return '이메일을 입력해주세요';
}
$length = strlen($email);
if ($length < 1 || $length > 64) {
return '적절하지 않은 길이입니다.';
}
$userInfo = RootDB::db()->queryFirstField('SELECT `no`, `delete_after` FROM member WHERE `email` = %s LIMIT 1', $email);
if ($userInfo) {
if (!$userInfo['delete_after']) {
return '이미 사용중인 이메일입니다. 관리자에게 문의해주세요.';
}
if ($userInfo['delete_after'] >= $userInfo) {
return "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]";
}
//$userInfo['delete_after'] < $userInfo
RootDB::db()->delete('member', 'no=%i', $userInfo['no']);
}
return true;
}
static function createOTPbyUserNO(int $userNo): bool
{
$userInfo = RootDB::db()->queryFirstRow('SELECT oauth_info FROM member WHERE no=%i', $userNo);
if (!$userInfo) {
return false;
}
$oauthInfo = Json::decode($userInfo['oauth_info']);
if (!$oauthInfo) {
return false;
}
$accessToken = $oauthInfo['accessToken'];
$OTPValue = $oauthInfo['OTPValue'] ?? null;
$OTPTrialUntil = $oauthInfo['OTPTrialUntil'] ?? null;
$now = TimeUtil::now();
if ($OTPTrialUntil && $OTPValue && $OTPTrialUntil > $now) {
return true;
}
[$OTPValue, $OTPTrialUntil] = static::createOTP($accessToken);
if (!$OTPValue) {
return false;
}
$oauthInfo['OTPValue'] = $OTPValue;
$oauthInfo['OTPTrialUntil'] = $OTPTrialUntil;
$oauthInfo['OTPTrialCount'] = 3;
RootDB::db()->update('member', [
'oauth_info' => Json::encode($oauthInfo)
], 'no=%i', $userNo);
return true;
}
static function createOTP(string $accessToken): ?array
{
$restAPI = new Kakao_REST_API_Helper($accessToken);
$OTPValue = Util::randRangeInt(1000, 9999);
$OTPTrialUntil = TimeUtil::nowAddSeconds(180);
$sendResult = $restAPI->talk_to_me_default([
"object_type" => "text",
"text" => "인증 코드는 $OTPValue 입니다. $OTPTrialUntil 이내에 입력해주세요.",
"link" => [
"web_url" => ServConfig::getServerBasepath(),
"mobile_web_url" => ServConfig::getServerBasepath()
],
"button_title" => "로그인 페이지 열기"
]);
$sendResult['code'] = Util::array_get($sendResult['code'], 0);
if ($sendResult['code'] < 0) {
return null;
}
return [$OTPValue, $OTPTrialUntil];
}
static function kakaoOAuthCheck(array $userInfo): ?array
{
if (!\kakao\KakaoKey::REST_KEY) {
return [false, '카카오 API 앱이 등록되지 않았습니다. 관리자에게 문의해 주세요.'];
}
$oauthID = $userInfo['oauth_id'];
$oauthInfo = Json::decode($userInfo['oauth_info']) ?? [];
if (!$oauthInfo) {
return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessToken = $oauthInfo['accessToken'] ?? null;
$refreshToken = $oauthInfo['refreshToken'] ?? null;
$accessTokenValidUntil = $oauthInfo['accessTokenValidUntil'] ?? null;
$refreshTokenValidUntil = $oauthInfo['refreshTokenValidUntil'] ?? null;
$OTPValue = $oauthInfo['OTPValue'] ?? null;
$OTPTrialUntil = $oauthInfo['OTPTrialUntil'] ?? null;
$tokenValidUntil = $userInfo['token_valid_until'];
if (!$accessToken || !$refreshToken || !$accessTokenValidUntil || !$refreshTokenValidUntil) {
return [false, 'OAuth 정보가 보관되어 있지 않습니다. 카카오 로그인을 수행해 주세요.'];
}
$now = TimeUtil::now();
if ($now > $refreshTokenValidUntil) {
return [false, '로그인 토큰이 만료되었습니다. 카카오 로그인을 수행해 주세요.'];
}
if ($now > $accessTokenValidUntil) {
$apiHelper = new Kakao_REST_API_Helper($accessToken);
$refreshResult = $apiHelper->refresh_access_token($refreshToken);
if (!$refreshResult) {
return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessToken = $refreshResult['access_token'] ?? null;
if (!$accessToken) {
trigger_error("refreshToken 에러 " . Json::encode($refreshResult) . "," . $refreshToken . "," . substr(\kakao\KakaoKey::REST_KEY, 0, 6), E_USER_NOTICE);
return [false, '로그인 토큰 자동 갱신을 실패했습니다. 카카오 로그인을 수행해 주세요.'];
}
$accessTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['expires_in']);
$oauthInfo['accessToken'] = $accessToken;
$oauthInfo['accessTokenValidUntil'] = $accessTokenValidUntil;
$refreshToken = $refreshResult['refresh_token'] ?? null;
if ($refreshToken) {
$refreshTokenValidUntil = TimeUtil::nowAddSeconds($refreshResult['refresh_token_expires_in']);
$oauthInfo['refreshToken'] = $refreshToken;
$oauthInfo['refresh_token_expires_in'] = $refreshTokenValidUntil;
}
RootDB::db()->update('member', [
'oauth_info' => Json::encode($oauthInfo)
], 'no=%i', $userInfo['no']);
}
if ($tokenValidUntil && $now <= $tokenValidUntil) {
return null;
}
//인증 시스템 가동
$session = Session::getInstance();
$session->access_token = $accessToken;
$session->expires = $accessTokenValidUntil;
$session->refresh_token = $refreshToken;
$session->refresh_token_expires = $refreshTokenValidUntil;
if (!static::createOTPbyUserNO($userInfo['no'])) {
return [false, '인증 코드를 보내는데 실패했습니다.'];
}
return [true, '인증 코드를 입력해주세요'];
}
}
+7 -1
View File
@@ -10,6 +10,7 @@ namespace sammo;
* @property string $ip IP * @property string $ip IP
* @property bool $reqOTP 인증 코드 필요 * @property bool $reqOTP 인증 코드 필요
* @property array $acl 권한 * @property array $acl 권한
* @property int|null $tokenID 토큰ID
* @property string $tokenValidUntil 로그인 토큰 길이 * @property string $tokenValidUntil 로그인 토큰 길이
* *
* @property int $generalID 장수 번호 (게임 로그인 필요) * @property int $generalID 장수 번호 (게임 로그인 필요)
@@ -170,7 +171,7 @@ class Session
return Util::array_get($_SESSION[$name]); return Util::array_get($_SESSION[$name]);
} }
public function login(int $userID, string $userName, int $grade, bool $reqOTP, ?string $tokenValidUntil, array $acl): Session public function login(int $userID, string $userName, int $grade, bool $reqOTP, ?string $tokenValidUntil, ?int $tokenID, array $acl): Session
{ {
$this->set('userID', $userID); $this->set('userID', $userID);
$this->set('userName', $userName); $this->set('userName', $userName);
@@ -180,6 +181,7 @@ class Session
$this->set('acl', $acl); $this->set('acl', $acl);
$this->set('reqOTP', $reqOTP); $this->set('reqOTP', $reqOTP);
$this->set('tokenValidUntil', $tokenValidUntil); $this->set('tokenValidUntil', $tokenValidUntil);
$this->set('tokenID', $tokenID);
return $this; return $this;
} }
@@ -198,6 +200,10 @@ class Session
$this->logoutGame(); $this->logoutGame();
} }
if($this->tokenID??null){
RootDB::db()->delete('login_token', 'id = %i', $this->tokenID);
}
$this->set('userID', null); $this->set('userID', null);
$this->set('userName', null); $this->set('userName', null);
$this->set('userGrade', null); $this->set('userGrade', null);
-1
View File
@@ -1 +0,0 @@
../scssphp/scssphp/bin/pscss
+72 -81
View File
@@ -29,7 +29,7 @@ private static $installed = array (
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'cf3f40b5787b2a1aed9255775143108ef5b1f278', 'reference' => '872755e57f84720a9c4c63d5455441f83c41f6c6',
'name' => 'sammo-hid/sammo', 'name' => 'sammo-hid/sammo',
), ),
'versions' => 'versions' =>
@@ -54,12 +54,12 @@ private static $installed = array (
), ),
'composer/semver' => 'composer/semver' =>
array ( array (
'pretty_version' => '3.2.5', 'pretty_version' => '3.2.6',
'version' => '3.2.5.0', 'version' => '3.2.6.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '31f3ea725711245195f62e54ffa402d8ef2fdba9', 'reference' => '83e511e247de329283478496f7a1e114c9517506',
), ),
'composer/xdebug-handler' => 'composer/xdebug-handler' =>
array ( array (
@@ -72,12 +72,12 @@ private static $installed = array (
), ),
'doctrine/inflector' => 'doctrine/inflector' =>
array ( array (
'pretty_version' => '2.0.3', 'pretty_version' => '2.0.4',
'version' => '2.0.3.0', 'version' => '2.0.4.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '9cf661f4eb38f7c881cac67c75ea9b00bf97b210', 'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
), ),
'erusev/parsedown' => 'erusev/parsedown' =>
array ( array (
@@ -135,80 +135,80 @@ private static $installed = array (
), ),
'guzzlehttp/promises' => 'guzzlehttp/promises' =>
array ( array (
'pretty_version' => '1.4.1', 'pretty_version' => '1.5.1',
'version' => '1.4.1.0', 'version' => '1.5.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '8e7d04f1f6450fef59366c399cfad4b9383aa30d', 'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
), ),
'guzzlehttp/psr7' => 'guzzlehttp/psr7' =>
array ( array (
'pretty_version' => '1.8.2', 'pretty_version' => '1.8.3',
'version' => '1.8.2.0', 'version' => '1.8.3.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'dc960a912984efb74d0a90222870c72c87f10c91', 'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
), ),
'illuminate/bus' => 'illuminate/bus' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '808097c0dfd893309bd77b00139586c516b965c9', 'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
), ),
'illuminate/collections' => 'illuminate/collections' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '18fa841df912ec56849351dd6ca8928e8a98b69d', 'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
), ),
'illuminate/container' => 'illuminate/container' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '862b64ea4ab56e307a1676104a1b93295d347ad0', 'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
), ),
'illuminate/contracts' => 'illuminate/contracts' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913', 'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
), ),
'illuminate/database' => 'illuminate/database' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'acc11d6839ddb3b694bc6585177fa5141b70c693', 'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
), ),
'illuminate/events' => 'illuminate/events' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '7def78033f29cd0c0383513b27c291d233a7f90e', 'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
), ),
'illuminate/macroable' => 'illuminate/macroable' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
@@ -216,8 +216,8 @@ private static $installed = array (
), ),
'illuminate/pipeline' => 'illuminate/pipeline' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
@@ -225,12 +225,12 @@ private static $installed = array (
), ),
'illuminate/support' => 'illuminate/support' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'b0a21c41163381dd9a5abbd68fe85ed7b4247d30', 'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
), ),
'league/plates' => 'league/plates' =>
array ( array (
@@ -261,12 +261,12 @@ private static $installed = array (
), ),
'nesbot/carbon' => 'nesbot/carbon' =>
array ( array (
'pretty_version' => '2.53.1', 'pretty_version' => '2.54.0',
'version' => '2.53.1.0', 'version' => '2.54.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'f4655858a784988f880c1b8c7feabbf02dfdf045', 'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
), ),
'netresearch/jsonmapper' => 'netresearch/jsonmapper' =>
array ( array (
@@ -297,12 +297,12 @@ private static $installed = array (
), ),
'nette/utils' => 'nette/utils' =>
array ( array (
'pretty_version' => 'v3.2.2', 'pretty_version' => 'v3.2.5',
'version' => '3.2.2.0', 'version' => '3.2.5.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '967cfc4f9a1acd5f1058d76715a424c53343c20c', 'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
), ),
'pguardiario/phpuri' => 'pguardiario/phpuri' =>
array ( array (
@@ -351,30 +351,30 @@ private static $installed = array (
), ),
'phpdocumentor/reflection-docblock' => 'phpdocumentor/reflection-docblock' =>
array ( array (
'pretty_version' => '5.2.2', 'pretty_version' => '5.3.0',
'version' => '5.2.2.0', 'version' => '5.3.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
), ),
'phpdocumentor/type-resolver' => 'phpdocumentor/type-resolver' =>
array ( array (
'pretty_version' => '1.4.0', 'pretty_version' => '1.5.1',
'version' => '1.4.0.0', 'version' => '1.5.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', 'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
), ),
'psr/container' => 'psr/container' =>
array ( array (
'pretty_version' => '1.1.1', 'pretty_version' => '1.1.2',
'version' => '1.1.1.0', 'version' => '1.1.2.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf', 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
), ),
'psr/container-implementation' => 'psr/container-implementation' =>
array ( array (
@@ -436,12 +436,12 @@ private static $installed = array (
), ),
'sabre/event' => 'sabre/event' =>
array ( array (
'pretty_version' => '5.1.2', 'pretty_version' => '5.1.4',
'version' => '5.1.2.0', 'version' => '5.1.4.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'c120bec57c17b6251a496efc82b732418b49d50a', 'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
), ),
'sammo-hid/sammo' => 'sammo-hid/sammo' =>
array ( array (
@@ -450,16 +450,7 @@ private static $installed = array (
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'cf3f40b5787b2a1aed9255775143108ef5b1f278', 'reference' => '872755e57f84720a9c4c63d5455441f83c41f6c6',
),
'scssphp/scssphp' =>
array (
'pretty_version' => 'v1.6.0',
'version' => '1.6.0.0',
'aliases' =>
array (
),
'reference' => 'b83594e2323c5d6e80785df3f91b9d1d32aad530',
), ),
'sergeytsalkov/meekrodb' => 'sergeytsalkov/meekrodb' =>
array ( array (
@@ -472,12 +463,12 @@ private static $installed = array (
), ),
'symfony/console' => 'symfony/console' =>
array ( array (
'pretty_version' => 'v5.3.6', 'pretty_version' => 'v5.3.10',
'version' => '5.3.6.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '51b71afd6d2dc8f5063199357b9880cea8d8bfe2', 'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
), ),
'symfony/deprecation-contracts' => 'symfony/deprecation-contracts' =>
array ( array (
@@ -490,12 +481,12 @@ private static $installed = array (
), ),
'symfony/lock' => 'symfony/lock' =>
array ( array (
'pretty_version' => 'v4.4.27', 'pretty_version' => 'v4.4.33',
'version' => '4.4.27.0', 'version' => '4.4.33.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '6ca476d4ac992802f2a4043929f68f1818449486', 'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
), ),
'symfony/polyfill-ctype' => 'symfony/polyfill-ctype' =>
array ( array (
@@ -580,21 +571,21 @@ private static $installed = array (
), ),
'symfony/string' => 'symfony/string' =>
array ( array (
'pretty_version' => 'v5.3.3', 'pretty_version' => 'v5.3.10',
'version' => '5.3.3.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1', 'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
), ),
'symfony/translation' => 'symfony/translation' =>
array ( array (
'pretty_version' => 'v5.3.7', 'pretty_version' => 'v5.3.10',
'version' => '5.3.7.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6', 'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
), ),
'symfony/translation-contracts' => 'symfony/translation-contracts' =>
array ( array (
@@ -614,12 +605,12 @@ private static $installed = array (
), ),
'tysonandre/var_representation_polyfill' => 'tysonandre/var_representation_polyfill' =>
array ( array (
'pretty_version' => '0.0.2', 'pretty_version' => '0.1.1',
'version' => '0.0.2.0', 'version' => '0.1.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '3f17999ee1f257319ddc6721dd26ebbc5d175f33', 'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
), ),
'vlucas/valitron' => 'vlucas/valitron' =>
array ( array (
+1
View File
@@ -108,6 +108,7 @@ return array(
'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', 'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php',
'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', 'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php',
'Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php',
'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', 'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php',
'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
-1
View File
@@ -27,7 +27,6 @@ return array(
'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
'Symfony\\Component\\Lock\\' => array($vendorDir . '/symfony/lock'), 'Symfony\\Component\\Lock\\' => array($vendorDir . '/symfony/lock'),
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
'Sabre\\Event\\' => array($vendorDir . '/sabre/event/lib'), 'Sabre\\Event\\' => array($vendorDir . '/sabre/event/lib'),
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+1 -5
View File
@@ -76,7 +76,6 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
'Symfony\\Component\\String\\' => 25, 'Symfony\\Component\\String\\' => 25,
'Symfony\\Component\\Lock\\' => 23, 'Symfony\\Component\\Lock\\' => 23,
'Symfony\\Component\\Console\\' => 26, 'Symfony\\Component\\Console\\' => 26,
'ScssPhp\\ScssPhp\\' => 16,
'Sabre\\Event\\' => 12, 'Sabre\\Event\\' => 12,
), ),
'P' => 'P' =>
@@ -218,10 +217,6 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
array ( array (
0 => __DIR__ . '/..' . '/symfony/console', 0 => __DIR__ . '/..' . '/symfony/console',
), ),
'ScssPhp\\ScssPhp\\' =>
array (
0 => __DIR__ . '/..' . '/scssphp/scssphp/src',
),
'Sabre\\Event\\' => 'Sabre\\Event\\' =>
array ( array (
0 => __DIR__ . '/..' . '/sabre/event/lib', 0 => __DIR__ . '/..' . '/sabre/event/lib',
@@ -472,6 +467,7 @@ class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', 'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php',
'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', 'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php',
'Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php',
'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', 'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', 'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php',
'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
+236 -246
View File
@@ -118,17 +118,17 @@
}, },
{ {
"name": "composer/semver", "name": "composer/semver",
"version": "3.2.5", "version": "3.2.6",
"version_normalized": "3.2.5.0", "version_normalized": "3.2.6.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/semver.git", "url": "https://github.com/composer/semver.git",
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9" "reference": "83e511e247de329283478496f7a1e114c9517506"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/31f3ea725711245195f62e54ffa402d8ef2fdba9", "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506",
"reference": "31f3ea725711245195f62e54ffa402d8ef2fdba9", "reference": "83e511e247de329283478496f7a1e114c9517506",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -138,7 +138,7 @@
"phpstan/phpstan": "^0.12.54", "phpstan/phpstan": "^0.12.54",
"symfony/phpunit-bridge": "^4.2 || ^5" "symfony/phpunit-bridge": "^4.2 || ^5"
}, },
"time": "2021-05-24T12:41:47+00:00", "time": "2021-10-25T11:34:17+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -182,7 +182,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/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.2.5" "source": "https://github.com/composer/semver/tree/3.2.6"
}, },
"funding": [ "funding": [
{ {
@@ -269,36 +269,32 @@
}, },
{ {
"name": "doctrine/inflector", "name": "doctrine/inflector",
"version": "2.0.3", "version": "2.0.4",
"version_normalized": "2.0.3.0", "version_normalized": "2.0.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/inflector.git", "url": "https://github.com/doctrine/inflector.git",
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
"reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^7.0", "doctrine/coding-standard": "^8.2",
"phpstan/phpstan": "^0.11", "phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.11", "phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.11", "phpstan/phpstan-strict-rules": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"vimeo/psalm": "^4.10"
}, },
"time": "2020-05-29T15:13:26+00:00", "time": "2021-10-22T20:16:43+00:00",
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@@ -347,7 +343,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.x" "source": "https://github.com/doctrine/inflector/tree/2.0.4"
}, },
"funding": [ "funding": [
{ {
@@ -684,17 +680,17 @@
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "1.4.1", "version": "1.5.1",
"version_normalized": "1.4.1.0", "version_normalized": "1.5.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -703,11 +699,11 @@
"require-dev": { "require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1" "symfony/phpunit-bridge": "^4.4 || ^5.1"
}, },
"time": "2021-03-07T09:25:29+00:00", "time": "2021-10-22T20:56:57+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.4-dev" "dev-master": "1.5-dev"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@@ -724,10 +720,25 @@
"MIT" "MIT"
], ],
"authors": [ "authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{ {
"name": "Michael Dowling", "name": "Michael Dowling",
"email": "mtdowling@gmail.com", "email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling" "homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
} }
], ],
"description": "Guzzle promises library", "description": "Guzzle promises library",
@@ -736,23 +747,37 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.4.1" "source": "https://github.com/guzzle/promises/tree/1.5.1"
}, },
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
"type": "tidelift"
}
],
"install-path": "../guzzlehttp/promises" "install-path": "../guzzlehttp/promises"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "1.8.2", "version": "1.8.3",
"version_normalized": "1.8.2.0", "version_normalized": "1.8.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "dc960a912984efb74d0a90222870c72c87f10c91" "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", "url": "https://api.github.com/repos/guzzle/psr7/zipball/1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
"reference": "dc960a912984efb74d0a90222870c72c87f10c91", "reference": "1afdd860a2566ed3c2b0b4a3de6e23434a79ec85",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -770,7 +795,7 @@
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
}, },
"time": "2021-04-26T09:17:50+00:00", "time": "2021-10-05T13:56:00+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -791,13 +816,34 @@
"MIT" "MIT"
], ],
"authors": [ "authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{ {
"name": "Michael Dowling", "name": "Michael Dowling",
"email": "mtdowling@gmail.com", "email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling" "homepage": "https://github.com/mtdowling"
}, },
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{ {
"name": "Tobias Schultze", "name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion" "homepage": "https://github.com/Tobion"
} }
], ],
@@ -814,23 +860,37 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.8.2" "source": "https://github.com/guzzle/psr7/tree/1.8.3"
}, },
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"install-path": "../guzzlehttp/psr7" "install-path": "../guzzlehttp/psr7"
}, },
{ {
"name": "illuminate/bus", "name": "illuminate/bus",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/bus.git", "url": "https://github.com/illuminate/bus.git",
"reference": "808097c0dfd893309bd77b00139586c516b965c9" "reference": "be400399687b97d5558a224e970060fd5d5f2735"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/bus/zipball/808097c0dfd893309bd77b00139586c516b965c9", "url": "https://api.github.com/repos/illuminate/bus/zipball/be400399687b97d5558a224e970060fd5d5f2735",
"reference": "808097c0dfd893309bd77b00139586c516b965c9", "reference": "be400399687b97d5558a224e970060fd5d5f2735",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -843,7 +903,7 @@
"suggest": { "suggest": {
"illuminate/queue": "Required to use closures when chaining jobs (^7.0)." "illuminate/queue": "Required to use closures when chaining jobs (^7.0)."
}, },
"time": "2021-08-10T16:49:48+00:00", "time": "2021-10-21T19:19:36+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -876,17 +936,17 @@
}, },
{ {
"name": "illuminate/collections", "name": "illuminate/collections",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/collections.git", "url": "https://github.com/illuminate/collections.git",
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d" "reference": "05f286ec5fd2dd286e8384577047efc375c8954c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/18fa841df912ec56849351dd6ca8928e8a98b69d", "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c",
"reference": "18fa841df912ec56849351dd6ca8928e8a98b69d", "reference": "05f286ec5fd2dd286e8384577047efc375c8954c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -897,7 +957,7 @@
"suggest": { "suggest": {
"symfony/var-dumper": "Required to use the dump method (^5.1.4)." "symfony/var-dumper": "Required to use the dump method (^5.1.4)."
}, },
"time": "2021-09-08T12:48:16+00:00", "time": "2021-10-22T18:01:46+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -933,17 +993,17 @@
}, },
{ {
"name": "illuminate/container", "name": "illuminate/container",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/container.git", "url": "https://github.com/illuminate/container.git",
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0" "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/container/zipball/862b64ea4ab56e307a1676104a1b93295d347ad0", "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d",
"reference": "862b64ea4ab56e307a1676104a1b93295d347ad0", "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -954,7 +1014,7 @@
"provide": { "provide": {
"psr/container-implementation": "1.0" "psr/container-implementation": "1.0"
}, },
"time": "2021-09-09T13:55:23+00:00", "time": "2021-09-15T14:32:50+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -987,17 +1047,17 @@
}, },
{ {
"name": "illuminate/contracts", "name": "illuminate/contracts",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/contracts.git", "url": "https://github.com/illuminate/contracts.git",
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913" "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
"reference": "ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913", "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1005,7 +1065,7 @@
"psr/container": "^1.0", "psr/container": "^1.0",
"psr/simple-cache": "^1.0" "psr/simple-cache": "^1.0"
}, },
"time": "2021-09-08T12:09:40+00:00", "time": "2021-10-22T18:01:46+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1038,17 +1098,17 @@
}, },
{ {
"name": "illuminate/database", "name": "illuminate/database",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/database.git", "url": "https://github.com/illuminate/database.git",
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693" "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/acc11d6839ddb3b694bc6585177fa5141b70c693", "url": "https://api.github.com/repos/illuminate/database/zipball/43c7ffb6299ae55b000b286cf1278afd268ef29f",
"reference": "acc11d6839ddb3b694bc6585177fa5141b70c693", "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1062,7 +1122,7 @@
"symfony/console": "^5.1.4" "symfony/console": "^5.1.4"
}, },
"suggest": { "suggest": {
"doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).",
"fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
"illuminate/console": "Required to use the database commands (^8.0).", "illuminate/console": "Required to use the database commands (^8.0).",
"illuminate/events": "Required to use the observers with Eloquent (^8.0).", "illuminate/events": "Required to use the observers with Eloquent (^8.0).",
@@ -1070,7 +1130,7 @@
"illuminate/pagination": "Required to paginate the result set (^8.0).", "illuminate/pagination": "Required to paginate the result set (^8.0).",
"symfony/finder": "Required to use Eloquent model factories (^5.1.4)." "symfony/finder": "Required to use Eloquent model factories (^5.1.4)."
}, },
"time": "2021-09-13T18:43:43+00:00", "time": "2021-10-29T19:46:53+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1109,17 +1169,17 @@
}, },
{ {
"name": "illuminate/events", "name": "illuminate/events",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/events.git", "url": "https://github.com/illuminate/events.git",
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e" "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/events/zipball/7def78033f29cd0c0383513b27c291d233a7f90e", "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d",
"reference": "7def78033f29cd0c0383513b27c291d233a7f90e", "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1131,7 +1191,7 @@
"illuminate/support": "^8.0", "illuminate/support": "^8.0",
"php": "^7.3|^8.0" "php": "^7.3|^8.0"
}, },
"time": "2021-08-16T21:45:47+00:00", "time": "2021-09-15T14:32:50+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1167,8 +1227,8 @@
}, },
{ {
"name": "illuminate/macroable", "name": "illuminate/macroable",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/macroable.git", "url": "https://github.com/illuminate/macroable.git",
@@ -1216,8 +1276,8 @@
}, },
{ {
"name": "illuminate/pipeline", "name": "illuminate/pipeline",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/pipeline.git", "url": "https://github.com/illuminate/pipeline.git",
@@ -1267,17 +1327,17 @@
}, },
{ {
"name": "illuminate/support", "name": "illuminate/support",
"version": "v8.61.0", "version": "v8.69.0",
"version_normalized": "8.61.0.0", "version_normalized": "8.69.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/illuminate/support.git", "url": "https://github.com/illuminate/support.git",
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30" "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/b0a21c41163381dd9a5abbd68fe85ed7b4247d30", "url": "https://api.github.com/repos/illuminate/support/zipball/a8851b7001530d3c11626a81449ed9b63dd10db7",
"reference": "b0a21c41163381dd9a5abbd68fe85ed7b4247d30", "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1287,7 +1347,7 @@
"illuminate/collections": "^8.0", "illuminate/collections": "^8.0",
"illuminate/contracts": "^8.0", "illuminate/contracts": "^8.0",
"illuminate/macroable": "^8.0", "illuminate/macroable": "^8.0",
"nesbot/carbon": "^2.31", "nesbot/carbon": "^2.53.1",
"php": "^7.3|^8.0", "php": "^7.3|^8.0",
"voku/portable-ascii": "^1.4.8" "voku/portable-ascii": "^1.4.8"
}, },
@@ -1296,13 +1356,13 @@
}, },
"suggest": { "suggest": {
"illuminate/filesystem": "Required to use the composer class (^8.0).", "illuminate/filesystem": "Required to use the composer class (^8.0).",
"league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0).", "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).",
"ramsey/uuid": "Required to use Str::uuid() (^4.0).", "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).",
"symfony/process": "Required to use the composer class (^5.1.4).", "symfony/process": "Required to use the composer class (^5.1.4).",
"symfony/var-dumper": "Required to use the dd function (^5.1.4).", "symfony/var-dumper": "Required to use the dd function (^5.1.4).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
}, },
"time": "2021-09-13T18:43:43+00:00", "time": "2021-10-29T13:34:03+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1542,17 +1602,17 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "2.53.1", "version": "2.54.0",
"version_normalized": "2.53.1.0", "version_normalized": "2.54.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045" "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5",
"reference": "f4655858a784988f880c1b8c7feabbf02dfdf045", "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1563,6 +1623,7 @@
"symfony/translation": "^3.4 || ^4.0 || ^5.0" "symfony/translation": "^3.4 || ^4.0 || ^5.0"
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.0 || ^3.0",
"doctrine/orm": "^2.7", "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",
@@ -1572,7 +1633,7 @@
"phpunit/phpunit": "^7.5.20 || ^8.5.14", "phpunit/phpunit": "^7.5.20 || ^8.5.14",
"squizlabs/php_codesniffer": "^3.4" "squizlabs/php_codesniffer": "^3.4"
}, },
"time": "2021-09-06T09:29:23+00:00", "time": "2021-11-01T21:22:20+00:00",
"bin": [ "bin": [
"bin/carbon" "bin/carbon"
], ],
@@ -1833,21 +1894,21 @@
}, },
{ {
"name": "nette/utils", "name": "nette/utils",
"version": "v3.2.2", "version": "v3.2.5",
"version_normalized": "3.2.2.0", "version_normalized": "3.2.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/utils.git", "url": "https://github.com/nette/utils.git",
"reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c" "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/967cfc4f9a1acd5f1058d76715a424c53343c20c", "url": "https://api.github.com/repos/nette/utils/zipball/9cd80396ca58d7969ab44fc7afcf03624dfa526e",
"reference": "967cfc4f9a1acd5f1058d76715a424c53343c20c", "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2 <8.1" "php": ">=7.2 <8.2"
}, },
"conflict": { "conflict": {
"nette/di": "<3.0.6" "nette/di": "<3.0.6"
@@ -1866,7 +1927,7 @@
"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" "ext-xml": "to use Strings::length() etc. when mbstring is not available"
}, },
"time": "2021-03-03T22:53:25+00:00", "time": "2021-09-20T10:50:11+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1915,7 +1976,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/utils/issues", "issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v3.2.2" "source": "https://github.com/nette/utils/tree/v3.2.5"
}, },
"install-path": "../nette/utils" "install-path": "../nette/utils"
}, },
@@ -2176,17 +2237,17 @@
}, },
{ {
"name": "phpdocumentor/reflection-docblock", "name": "phpdocumentor/reflection-docblock",
"version": "5.2.2", "version": "5.3.0",
"version_normalized": "5.2.2.0", "version_normalized": "5.3.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2197,9 +2258,10 @@
"webmozart/assert": "^1.9.1" "webmozart/assert": "^1.9.1"
}, },
"require-dev": { "require-dev": {
"mockery/mockery": "~1.3.2" "mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
}, },
"time": "2020-09-03T19:13:55+00:00", "time": "2021-10-19T17:43:47+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -2229,23 +2291,23 @@
"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/master" "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
}, },
"install-path": "../phpdocumentor/reflection-docblock" "install-path": "../phpdocumentor/reflection-docblock"
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
"version": "1.4.0", "version": "1.5.1",
"version_normalized": "1.4.0.0", "version_normalized": "1.5.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git", "url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2253,9 +2315,10 @@
"phpdocumentor/reflection-common": "^2.0" "phpdocumentor/reflection-common": "^2.0"
}, },
"require-dev": { "require-dev": {
"ext-tokenizer": "*" "ext-tokenizer": "*",
"psalm/phar": "^4.8"
}, },
"time": "2020-09-17T18:55:26+00:00", "time": "2021-10-02T14:08:47+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -2281,29 +2344,29 @@
"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.4.0" "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1"
}, },
"install-path": "../phpdocumentor/type-resolver" "install-path": "../phpdocumentor/type-resolver"
}, },
{ {
"name": "psr/container", "name": "psr/container",
"version": "1.1.1", "version": "1.1.2",
"version_normalized": "1.1.1.0", "version_normalized": "1.1.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/container.git", "url": "https://github.com/php-fig/container.git",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.0" "php": ">=7.4.0"
}, },
"time": "2021-03-05T17:36:06+00:00", "time": "2021-11-05T16:50:12+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -2332,7 +2395,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-fig/container/issues", "issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.1" "source": "https://github.com/php-fig/container/tree/1.1.2"
}, },
"install-path": "../psr/container" "install-path": "../psr/container"
}, },
@@ -2541,28 +2604,28 @@
}, },
{ {
"name": "sabre/event", "name": "sabre/event",
"version": "5.1.2", "version": "5.1.4",
"version_normalized": "5.1.2.0", "version_normalized": "5.1.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sabre-io/event.git", "url": "https://github.com/sabre-io/event.git",
"reference": "c120bec57c17b6251a496efc82b732418b49d50a" "reference": "d7da22897125d34d7eddf7977758191c06a74497"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sabre-io/event/zipball/c120bec57c17b6251a496efc82b732418b49d50a", "url": "https://api.github.com/repos/sabre-io/event/zipball/d7da22897125d34d7eddf7977758191c06a74497",
"reference": "c120bec57c17b6251a496efc82b732418b49d50a", "reference": "d7da22897125d34d7eddf7977758191c06a74497",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "~2.16.1", "friendsofphp/php-cs-fixer": "~2.17.1",
"phpstan/phpstan": "^0.12", "phpstan/phpstan": "^0.12",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.0" "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0"
}, },
"time": "2020-10-03T11:02:22+00:00", "time": "2021-11-04T06:51:17+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -2608,82 +2671,6 @@
}, },
"install-path": "../sabre/event" "install-path": "../sabre/event"
}, },
{
"name": "scssphp/scssphp",
"version": "v1.6.0",
"version_normalized": "1.6.0.0",
"source": {
"type": "git",
"url": "https://github.com/scssphp/scssphp.git",
"reference": "b83594e2323c5d6e80785df3f91b9d1d32aad530"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/b83594e2323c5d6e80785df3f91b9d1d32aad530",
"reference": "b83594e2323c5d6e80785df3f91b9d1d32aad530",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-json": "*",
"php": ">=5.6.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4",
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
"sass/sass-spec": "*",
"squizlabs/php_codesniffer": "~3.5",
"symfony/phpunit-bridge": "^5.1",
"twbs/bootstrap": "~5.0",
"twbs/bootstrap4": "4.6.0",
"zurb/foundation": "~6.5"
},
"suggest": {
"ext-iconv": "Can be used as fallback when ext-mbstring is not available",
"ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
},
"time": "2021-07-02T16:28:10+00:00",
"bin": [
"bin/pscss"
],
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"ScssPhp\\ScssPhp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anthon Pang",
"email": "apang@softwaredevelopment.ca",
"homepage": "https://github.com/robocoder"
},
{
"name": "Cédric Morin",
"email": "cedric@yterium.com",
"homepage": "https://github.com/Cerdic"
}
],
"description": "scssphp is a compiler for SCSS written in PHP.",
"homepage": "http://scssphp.github.io/scssphp/",
"keywords": [
"css",
"less",
"sass",
"scss",
"stylesheet"
],
"support": {
"issues": "https://github.com/scssphp/scssphp/issues",
"source": "https://github.com/scssphp/scssphp/tree/v1.6.0"
},
"install-path": "../scssphp/scssphp"
},
{ {
"name": "sergeytsalkov/meekrodb", "name": "sergeytsalkov/meekrodb",
"version": "v2.4", "version": "v2.4",
@@ -2737,17 +2724,17 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v5.3.6", "version": "v5.3.10",
"version_normalized": "5.3.6.0", "version_normalized": "5.3.10.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
"reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2785,7 +2772,7 @@
"symfony/lock": "", "symfony/lock": "",
"symfony/process": "" "symfony/process": ""
}, },
"time": "2021-07-27T19:10:22+00:00", "time": "2021-10-26T09:30:15+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -2819,7 +2806,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v5.3.6" "source": "https://github.com/symfony/console/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -2909,17 +2896,17 @@
}, },
{ {
"name": "symfony/lock", "name": "symfony/lock",
"version": "v4.4.27", "version": "v4.4.33",
"version_normalized": "4.4.27.0", "version_normalized": "4.4.33.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/lock.git", "url": "https://github.com/symfony/lock.git",
"reference": "6ca476d4ac992802f2a4043929f68f1818449486" "reference": "567d29b1bc6e3937652054dafc069151d17824a9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/6ca476d4ac992802f2a4043929f68f1818449486", "url": "https://api.github.com/repos/symfony/lock/zipball/567d29b1bc6e3937652054dafc069151d17824a9",
"reference": "6ca476d4ac992802f2a4043929f68f1818449486", "reference": "567d29b1bc6e3937652054dafc069151d17824a9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -2934,7 +2921,7 @@
"doctrine/dbal": "^2.6|^3.0", "doctrine/dbal": "^2.6|^3.0",
"predis/predis": "~1.0" "predis/predis": "~1.0"
}, },
"time": "2021-07-23T15:41:52+00:00", "time": "2021-10-05T20:27:01+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -2970,7 +2957,7 @@
"semaphore" "semaphore"
], ],
"support": { "support": {
"source": "https://github.com/symfony/lock/tree/v4.4.27" "source": "https://github.com/symfony/lock/tree/v4.4.33"
}, },
"funding": [ "funding": [
{ {
@@ -3745,17 +3732,17 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v5.3.3", "version": "v5.3.10",
"version_normalized": "5.3.3.0", "version_normalized": "5.3.10.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3772,7 +3759,7 @@
"symfony/translation-contracts": "^1.1|^2", "symfony/translation-contracts": "^1.1|^2",
"symfony/var-exporter": "^4.4|^5.0" "symfony/var-exporter": "^4.4|^5.0"
}, },
"time": "2021-06-27T11:44:38+00:00", "time": "2021-10-27T18:21:46+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -3811,7 +3798,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v5.3.3" "source": "https://github.com/symfony/string/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -3831,17 +3818,17 @@
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v5.3.7", "version": "v5.3.10",
"version_normalized": "5.3.7.0", "version_normalized": "5.3.10.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6" "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6", "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa",
"reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6", "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3878,7 +3865,7 @@
"symfony/config": "", "symfony/config": "",
"symfony/yaml": "" "symfony/yaml": ""
}, },
"time": "2021-08-26T08:22:53+00:00", "time": "2021-10-10T06:43:24+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -3909,7 +3896,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/v5.3.7" "source": "https://github.com/symfony/translation/tree/v5.3.10"
}, },
"funding": [ "funding": [
{ {
@@ -4010,17 +3997,17 @@
}, },
{ {
"name": "tysonandre/var_representation_polyfill", "name": "tysonandre/var_representation_polyfill",
"version": "0.0.2", "version": "0.1.1",
"version_normalized": "0.0.2.0", "version_normalized": "0.1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/TysonAndre/var_representation_polyfill.git", "url": "https://github.com/TysonAndre/var_representation_polyfill.git",
"reference": "3f17999ee1f257319ddc6721dd26ebbc5d175f33" "reference": "0a942e74e18af5514749895507bc6ca7ab96399a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/3f17999ee1f257319ddc6721dd26ebbc5d175f33", "url": "https://api.github.com/repos/TysonAndre/var_representation_polyfill/zipball/0a942e74e18af5514749895507bc6ca7ab96399a",
"reference": "3f17999ee1f257319ddc6721dd26ebbc5d175f33", "reference": "0a942e74e18af5514749895507bc6ca7ab96399a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -4031,7 +4018,10 @@
"phan/phan": "^4.0", "phan/phan": "^4.0",
"phpunit/phpunit": "^8.5.0" "phpunit/phpunit": "^8.5.0"
}, },
"time": "2021-06-26T18:55:02+00:00", "suggest": {
"ext-var_representation": "*"
},
"time": "2021-08-16T00:12:50+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@@ -4051,14 +4041,14 @@
"name": "Tyson Andre" "name": "Tyson Andre"
} }
], ],
"description": "Polyfill for var_representation", "description": "Polyfill for var_representation: convert a variable to a string in a way that fixes the shortcomings of var_export",
"keywords": [ "keywords": [
"var_export", "var_export",
"var_representation" "var_representation"
], ],
"support": { "support": {
"issues": "https://github.com/TysonAndre/var_representation_polyfill/issues", "issues": "https://github.com/TysonAndre/var_representation_polyfill/issues",
"source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.0.2" "source": "https://github.com/TysonAndre/var_representation_polyfill/tree/0.1.1"
}, },
"install-path": "../tysonandre/var_representation_polyfill" "install-path": "../tysonandre/var_representation_polyfill"
}, },
+72 -81
View File
@@ -6,7 +6,7 @@
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'cf3f40b5787b2a1aed9255775143108ef5b1f278', 'reference' => '872755e57f84720a9c4c63d5455441f83c41f6c6',
'name' => 'sammo-hid/sammo', 'name' => 'sammo-hid/sammo',
), ),
'versions' => 'versions' =>
@@ -31,12 +31,12 @@
), ),
'composer/semver' => 'composer/semver' =>
array ( array (
'pretty_version' => '3.2.5', 'pretty_version' => '3.2.6',
'version' => '3.2.5.0', 'version' => '3.2.6.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '31f3ea725711245195f62e54ffa402d8ef2fdba9', 'reference' => '83e511e247de329283478496f7a1e114c9517506',
), ),
'composer/xdebug-handler' => 'composer/xdebug-handler' =>
array ( array (
@@ -49,12 +49,12 @@
), ),
'doctrine/inflector' => 'doctrine/inflector' =>
array ( array (
'pretty_version' => '2.0.3', 'pretty_version' => '2.0.4',
'version' => '2.0.3.0', 'version' => '2.0.4.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '9cf661f4eb38f7c881cac67c75ea9b00bf97b210', 'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
), ),
'erusev/parsedown' => 'erusev/parsedown' =>
array ( array (
@@ -112,80 +112,80 @@
), ),
'guzzlehttp/promises' => 'guzzlehttp/promises' =>
array ( array (
'pretty_version' => '1.4.1', 'pretty_version' => '1.5.1',
'version' => '1.4.1.0', 'version' => '1.5.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '8e7d04f1f6450fef59366c399cfad4b9383aa30d', 'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
), ),
'guzzlehttp/psr7' => 'guzzlehttp/psr7' =>
array ( array (
'pretty_version' => '1.8.2', 'pretty_version' => '1.8.3',
'version' => '1.8.2.0', 'version' => '1.8.3.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'dc960a912984efb74d0a90222870c72c87f10c91', 'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
), ),
'illuminate/bus' => 'illuminate/bus' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '808097c0dfd893309bd77b00139586c516b965c9', 'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
), ),
'illuminate/collections' => 'illuminate/collections' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '18fa841df912ec56849351dd6ca8928e8a98b69d', 'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
), ),
'illuminate/container' => 'illuminate/container' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '862b64ea4ab56e307a1676104a1b93295d347ad0', 'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
), ),
'illuminate/contracts' => 'illuminate/contracts' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'ab4bb4ec3b36905ccf972c84f9aaa2bdd1153913', 'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
), ),
'illuminate/database' => 'illuminate/database' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'acc11d6839ddb3b694bc6585177fa5141b70c693', 'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
), ),
'illuminate/events' => 'illuminate/events' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '7def78033f29cd0c0383513b27c291d233a7f90e', 'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
), ),
'illuminate/macroable' => 'illuminate/macroable' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
@@ -193,8 +193,8 @@
), ),
'illuminate/pipeline' => 'illuminate/pipeline' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
@@ -202,12 +202,12 @@
), ),
'illuminate/support' => 'illuminate/support' =>
array ( array (
'pretty_version' => 'v8.61.0', 'pretty_version' => 'v8.69.0',
'version' => '8.61.0.0', 'version' => '8.69.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'b0a21c41163381dd9a5abbd68fe85ed7b4247d30', 'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
), ),
'league/plates' => 'league/plates' =>
array ( array (
@@ -238,12 +238,12 @@
), ),
'nesbot/carbon' => 'nesbot/carbon' =>
array ( array (
'pretty_version' => '2.53.1', 'pretty_version' => '2.54.0',
'version' => '2.53.1.0', 'version' => '2.54.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'f4655858a784988f880c1b8c7feabbf02dfdf045', 'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
), ),
'netresearch/jsonmapper' => 'netresearch/jsonmapper' =>
array ( array (
@@ -274,12 +274,12 @@
), ),
'nette/utils' => 'nette/utils' =>
array ( array (
'pretty_version' => 'v3.2.2', 'pretty_version' => 'v3.2.5',
'version' => '3.2.2.0', 'version' => '3.2.5.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '967cfc4f9a1acd5f1058d76715a424c53343c20c', 'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
), ),
'pguardiario/phpuri' => 'pguardiario/phpuri' =>
array ( array (
@@ -328,30 +328,30 @@
), ),
'phpdocumentor/reflection-docblock' => 'phpdocumentor/reflection-docblock' =>
array ( array (
'pretty_version' => '5.2.2', 'pretty_version' => '5.3.0',
'version' => '5.2.2.0', 'version' => '5.3.0.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', 'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
), ),
'phpdocumentor/type-resolver' => 'phpdocumentor/type-resolver' =>
array ( array (
'pretty_version' => '1.4.0', 'pretty_version' => '1.5.1',
'version' => '1.4.0.0', 'version' => '1.5.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', 'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
), ),
'psr/container' => 'psr/container' =>
array ( array (
'pretty_version' => '1.1.1', 'pretty_version' => '1.1.2',
'version' => '1.1.1.0', 'version' => '1.1.2.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf', 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
), ),
'psr/container-implementation' => 'psr/container-implementation' =>
array ( array (
@@ -413,12 +413,12 @@
), ),
'sabre/event' => 'sabre/event' =>
array ( array (
'pretty_version' => '5.1.2', 'pretty_version' => '5.1.4',
'version' => '5.1.2.0', 'version' => '5.1.4.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'c120bec57c17b6251a496efc82b732418b49d50a', 'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
), ),
'sammo-hid/sammo' => 'sammo-hid/sammo' =>
array ( array (
@@ -427,16 +427,7 @@
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'cf3f40b5787b2a1aed9255775143108ef5b1f278', 'reference' => '872755e57f84720a9c4c63d5455441f83c41f6c6',
),
'scssphp/scssphp' =>
array (
'pretty_version' => 'v1.6.0',
'version' => '1.6.0.0',
'aliases' =>
array (
),
'reference' => 'b83594e2323c5d6e80785df3f91b9d1d32aad530',
), ),
'sergeytsalkov/meekrodb' => 'sergeytsalkov/meekrodb' =>
array ( array (
@@ -449,12 +440,12 @@
), ),
'symfony/console' => 'symfony/console' =>
array ( array (
'pretty_version' => 'v5.3.6', 'pretty_version' => 'v5.3.10',
'version' => '5.3.6.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '51b71afd6d2dc8f5063199357b9880cea8d8bfe2', 'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
), ),
'symfony/deprecation-contracts' => 'symfony/deprecation-contracts' =>
array ( array (
@@ -467,12 +458,12 @@
), ),
'symfony/lock' => 'symfony/lock' =>
array ( array (
'pretty_version' => 'v4.4.27', 'pretty_version' => 'v4.4.33',
'version' => '4.4.27.0', 'version' => '4.4.33.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '6ca476d4ac992802f2a4043929f68f1818449486', 'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
), ),
'symfony/polyfill-ctype' => 'symfony/polyfill-ctype' =>
array ( array (
@@ -557,21 +548,21 @@
), ),
'symfony/string' => 'symfony/string' =>
array ( array (
'pretty_version' => 'v5.3.3', 'pretty_version' => 'v5.3.10',
'version' => '5.3.3.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => 'bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1', 'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
), ),
'symfony/translation' => 'symfony/translation' =>
array ( array (
'pretty_version' => 'v5.3.7', 'pretty_version' => 'v5.3.10',
'version' => '5.3.7.0', 'version' => '5.3.10.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6', 'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
), ),
'symfony/translation-contracts' => 'symfony/translation-contracts' =>
array ( array (
@@ -591,12 +582,12 @@
), ),
'tysonandre/var_representation_polyfill' => 'tysonandre/var_representation_polyfill' =>
array ( array (
'pretty_version' => '0.0.2', 'pretty_version' => '0.1.1',
'version' => '0.0.2.0', 'version' => '0.1.1.0',
'aliases' => 'aliases' =>
array ( array (
), ),
'reference' => '3f17999ee1f257319ddc6721dd26ebbc5d175f33', 'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
), ),
'vlucas/valitron' => 'vlucas/valitron' =>
array ( array (
+2 -2
View File
@@ -4,8 +4,8 @@
$issues = array(); $issues = array();
if (!(PHP_VERSION_ID >= 70300)) { if (!(PHP_VERSION_ID >= 70400)) {
$issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.'; $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
} }
if ($issues) { if ($issues) {
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/). This project adheres to [Semantic Versioning](http://semver.org/).
### [3.2.6] 2021-10-25
* Fixed: type improvements to parseStability
### [3.2.5] 2021-05-24 ### [3.2.5] 2021-05-24
* Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127) * Fixed: issue comparing disjunctive MultiConstraints to conjunctive ones (#127)
+1
View File
@@ -47,6 +47,7 @@ class VersionParser
* @param string $version * @param string $version
* *
* @return string * @return string
* @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev'
*/ */
public static function parseStability($version) public static function parseStability($version)
{ {
+2 -3
View File
@@ -3,6 +3,5 @@
Doctrine Inflector is a small library that can perform string manipulations Doctrine Inflector is a small library that can perform string manipulations
with regard to uppercase/lowercase and singular/plural forms of words. with regard to uppercase/lowercase and singular/plural forms of words.
[![Build Status](https://travis-ci.org/doctrine/inflector.svg)](https://travis-ci.org/doctrine/inflector) [![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/inflector/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/inflector/?branch=master) [![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x)
[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/inflector/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/inflector/?branch=master)
+6 -10
View File
@@ -16,11 +16,12 @@
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^7.0", "doctrine/coding-standard": "^8.2",
"phpstan/phpstan": "^0.11", "phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.11", "phpstan/phpstan-phpunit": "^0.12",
"phpstan/phpstan-strict-rules": "^0.11", "phpstan/phpstan-strict-rules": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
"vimeo/psalm": "^4.10"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@@ -31,10 +32,5 @@
"psr-4": { "psr-4": {
"Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector" "Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector"
} }
},
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
} }
} }
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Inflector; namespace Doctrine\Inflector;
use Doctrine\Inflector\Rules\Ruleset; use Doctrine\Inflector\Rules\Ruleset;
use function array_unshift; use function array_unshift;
abstract class GenericLanguageInflectorFactory implements LanguageInflectorFactory abstract class GenericLanguageInflectorFactory implements LanguageInflectorFactory
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Inflector; namespace Doctrine\Inflector;
use RuntimeException; use RuntimeException;
use function chr; use function chr;
use function function_exists; use function function_exists;
use function lcfirst; use function lcfirst;
@@ -11,6 +11,7 @@ use Doctrine\Inflector\Rules\Portuguese;
use Doctrine\Inflector\Rules\Spanish; use Doctrine\Inflector\Rules\Spanish;
use Doctrine\Inflector\Rules\Turkish; use Doctrine\Inflector\Rules\Turkish;
use InvalidArgumentException; use InvalidArgumentException;
use function sprintf; use function sprintf;
final class InflectorFactory final class InflectorFactory
@@ -25,16 +26,22 @@ final class InflectorFactory
switch ($language) { switch ($language) {
case Language::ENGLISH: case Language::ENGLISH:
return new English\InflectorFactory(); return new English\InflectorFactory();
case Language::FRENCH: case Language::FRENCH:
return new French\InflectorFactory(); return new French\InflectorFactory();
case Language::NORWEGIAN_BOKMAL: case Language::NORWEGIAN_BOKMAL:
return new NorwegianBokmal\InflectorFactory(); return new NorwegianBokmal\InflectorFactory();
case Language::PORTUGUESE: case Language::PORTUGUESE:
return new Portuguese\InflectorFactory(); return new Portuguese\InflectorFactory();
case Language::SPANISH: case Language::SPANISH:
return new Spanish\InflectorFactory(); return new Spanish\InflectorFactory();
case Language::TURKISH: case Language::TURKISH:
return new Turkish\InflectorFactory(); return new Turkish\InflectorFactory();
default: default:
throw new InvalidArgumentException(sprintf( throw new InvalidArgumentException(sprintf(
'Language "%s" is not supported.', 'Language "%s" is not supported.',
@@ -31,9 +31,10 @@ class Inflectible
yield new Transformation(new Pattern('/(s|x|z)$/'), '\1'); yield new Transformation(new Pattern('/(s|x|z)$/'), '\1');
yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)ail$/'), '\1aux'); yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)ail$/'), '\1aux');
yield new Transformation(new Pattern('/ail$/'), 'ails'); yield new Transformation(new Pattern('/ail$/'), 'ails');
yield new Transformation(new Pattern('/(chacal|carnaval|festival|récital)$/'), '\1s');
yield new Transformation(new Pattern('/al$/'), 'aux'); yield new Transformation(new Pattern('/al$/'), 'aux');
yield new Transformation(new Pattern('/(bleu|émeu|landau|lieu|pneu|sarrau)$/'), '\1s'); yield new Transformation(new Pattern('/(bleu|émeu|landau|pneu|sarrau)$/'), '\1s');
yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|pou|au|eu|eau)$/'), '\1x'); yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|lieu|pou|au|eu|eau)$/'), '\1x');
yield new Transformation(new Pattern('/$/'), 's'); yield new Transformation(new Pattern('/$/'), 's');
} }
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Inflector\Rules; namespace Doctrine\Inflector\Rules;
use Doctrine\Inflector\WordInflector; use Doctrine\Inflector\WordInflector;
use function strtolower; use function strtolower;
use function strtoupper; use function strtoupper;
use function substr; use function substr;
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Inflector\Rules; namespace Doctrine\Inflector\Rules;
use Doctrine\Inflector\WordInflector; use Doctrine\Inflector\WordInflector;
use function preg_replace; use function preg_replace;
final class Transformation implements WordInflector final class Transformation implements WordInflector
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Inflector; namespace Doctrine\Inflector;
use Doctrine\Inflector\Rules\Ruleset; use Doctrine\Inflector\Rules\Ruleset;
use function array_merge; use function array_merge;
/** /**
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0"?>
<psalm
errorLevel="7"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
>
<projectFiles>
<directory name="lib/Doctrine/Inflector" />
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>
</psalm>
+19
View File
@@ -1,7 +1,26 @@
# CHANGELOG # CHANGELOG
## 1.5.1 - 2021-10-22
### Fixed
- Revert "Call handler when waiting on fulfilled/rejected Promise"
- Fix pool memory leak when empty array of promises provided
## 1.5.0 - 2021-10-07
### Changed
- Call handler when waiting on fulfilled/rejected Promise
### Fixed
- Fix manually settle promises generated with Utils::task
## 1.4.1 - 2021-02-18 ## 1.4.1 - 2021-02-18
### Fixed
- Fixed `each_limit` skipping promises and failing - Fixed `each_limit` skipping promises and failing
## 1.4.0 - 2020-09-30 ## 1.4.0 - 2020-09-30
+6 -1
View File
@@ -1,4 +1,9 @@
Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com> The MIT License (MIT)
Copyright (c) 2015 Michael Dowling <mtdowling@gmail.com>
Copyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk>
Copyright (c) 2017 Tobias Schultze <webmaster@tubo-world.de>
Copyright (c) 2020 Tobias Nyholm <tobias.nyholm@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+15
View File
@@ -530,3 +530,18 @@ A static API was first introduced in 1.4.0, in order to mitigate problems with f
| `is_rejected` | `Is::rejected` | | `is_rejected` | `Is::rejected` |
| `is_settled` | `Is::settled` | | `is_settled` | `Is::settled` |
| `coroutine` | `Coroutine::of` | | `coroutine` | `Coroutine::of` |
## Security
If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information.
## License
Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
## For Enterprise
Available as part of the Tidelift Subscription
The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-promises?utm_source=packagist-guzzlehttp-promises&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
+20 -1
View File
@@ -4,10 +4,25 @@
"keywords": ["promise"], "keywords": ["promise"],
"license": "MIT", "license": "MIT",
"authors": [ "authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{ {
"name": "Michael Dowling", "name": "Michael Dowling",
"email": "mtdowling@gmail.com", "email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling" "homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
} }
], ],
"require": { "require": {
@@ -33,7 +48,11 @@
}, },
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.4-dev" "dev-master": "1.5-dev"
} }
},
"config": {
"preferred-install": "dist",
"sort-packages": true
} }
} }
+3 -2
View File
@@ -79,9 +79,7 @@ class EachPromise implements PromisorInterface
$this->createPromise(); $this->createPromise();
/** @psalm-assert Promise $this->aggregate */ /** @psalm-assert Promise $this->aggregate */
$this->iterable->rewind(); $this->iterable->rewind();
if (!$this->checkIfFinished()) {
$this->refillPending(); $this->refillPending();
}
} catch (\Throwable $e) { } catch (\Throwable $e) {
/** /**
* @psalm-suppress NullReference * @psalm-suppress NullReference
@@ -107,6 +105,9 @@ class EachPromise implements PromisorInterface
{ {
$this->mutex = false; $this->mutex = false;
$this->aggregate = new Promise(function () { $this->aggregate = new Promise(function () {
if ($this->checkIfFinished()) {
return;
}
reset($this->pending); reset($this->pending);
// Consume a potentially fluctuating list of promises while // Consume a potentially fluctuating list of promises while
// ensuring that indexes are maintained (precluding array_shift). // ensuring that indexes are maintained (precluding array_shift).
+2
View File
@@ -48,7 +48,9 @@ final class Utils
$promise = new Promise([$queue, 'run']); $promise = new Promise([$queue, 'run']);
$queue->add(function () use ($task, $promise) { $queue->add(function () use ($task, $promise) {
try { try {
if (Is::pending($promise)) {
$promise->resolve($task()); $promise->resolve($task());
}
} catch (\Throwable $e) { } catch (\Throwable $e) {
$promise->reject($e); $promise->reject($e);
} catch (\Exception $e) { } catch (\Exception $e) {
+2
View File
@@ -0,0 +1,2 @@
github: [Nyholm, GrahamCampbell]
tidelift: "packagist/guzzlehttp/psr7"
+14
View File
@@ -0,0 +1,14 @@
daysUntilStale: 120
daysUntilClose: 14
exemptLabels:
- lifecycle/keep-open
- lifecycle/ready-for-merge
# Label to use when marking an issue as stale
staleLabel: lifecycle/stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed after 2 weeks if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
-16
View File
@@ -1,16 +0,0 @@
name: BC Check
on:
pull_request:
jobs:
roave-bc-check:
name: Roave BC Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Roave BC Check
uses: docker://nyholm/roave-bc-check-ga
+6 -2
View File
@@ -10,7 +10,7 @@ jobs:
strategy: strategy:
max-parallel: 10 max-parallel: 10
matrix: matrix:
php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4'] php: ['5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
steps: steps:
- name: Set up PHP - name: Set up PHP
@@ -23,8 +23,12 @@ jobs:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Mimic PHP 8.0
run: composer config platform.php 8.0.999
if: matrix.php > 8
- name: Install dependencies - name: Install dependencies
run: composer update --no-interaction --no-progress --prefer-dist run: composer update --no-interaction --no-progress
- name: Run tests - name: Run tests
run: make test run: make test
+1 -1
View File
@@ -26,7 +26,7 @@ jobs:
- name: Download dependencies - name: Download dependencies
uses: ramsey/composer-install@v1 uses: ramsey/composer-install@v1
with: with:
composer-options: --no-interaction --prefer-dist --optimize-autoloader composer-options: --no-interaction --optimize-autoloader
- name: Start server - name: Start server
run: php -S 127.0.0.1:10002 tests/Integration/server.php & run: php -S 127.0.0.1:10002 tests/Integration/server.php &
+6
View File
@@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
## Unreleased ## Unreleased
## 1.8.3 - 2021-10-05
### Fixed
- Return `null` in caching stream size if remote size is `null`
## 1.8.2 - 2021-04-26 ## 1.8.2 - 2021-04-26
### Fixed ### Fixed

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