From b682e53abe24f23ba18d21feff5455e9d9dc486e Mon Sep 17 00:00:00 2001 From: Hide_D Date: Wed, 27 Apr 2022 01:40:09 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20General|Nation/GetGeneralLog=20?= =?UTF-8?q?=EA=B0=90=EC=B0=B0=EB=B6=80&=EB=82=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/API/General/GetGeneralLog.php | 51 ++++++++ hwe/sammo/API/Nation/GetGeneralLog.php | 166 ++++++++++++++++++++++++ hwe/ts/SammoAPI.ts | 11 +- hwe/ts/defs/API/General.ts | 31 +++-- 4 files changed, 247 insertions(+), 12 deletions(-) create mode 100644 hwe/sammo/API/General/GetGeneralLog.php create mode 100644 hwe/sammo/API/Nation/GetGeneralLog.php diff --git a/hwe/sammo/API/General/GetGeneralLog.php b/hwe/sammo/API/General/GetGeneralLog.php new file mode 100644 index 00000000..ecc8a92a --- /dev/null +++ b/hwe/sammo/API/General/GetGeneralLog.php @@ -0,0 +1,51 @@ +args); + $v + ->rule('required', [ + 'type', + ]) + ->rule('integer', [ + 'reqTo', + ]) + ->rule('in', 'type', [ + self::GENERAL_HISTORY, + self::GENERAL_ACTION, + self::BATTLE_RESULT, + self::BATTLE_DETAIL, + ]); + + if (!$v->validate()) { + return $v->errorStr(); + } + + if (key_exists('reqTo', $this->args)) { + $this->args['reqTo'] = (int)$this->args['reqTo']; + } + return null; + } + + public function checkPermission(array $me): ?string + { + return null; + } + + public function getTargetGeneralID(Session $session): int{ + return $session->generalID; + } +} diff --git a/hwe/sammo/API/Nation/GetGeneralLog.php b/hwe/sammo/API/Nation/GetGeneralLog.php new file mode 100644 index 00000000..857d0b61 --- /dev/null +++ b/hwe/sammo/API/Nation/GetGeneralLog.php @@ -0,0 +1,166 @@ +args); + $v + ->rule('required', [ + 'generalID', + 'type', + ]) + ->rule('integer', [ + 'generalID', + 'reqTo', + ]) + ->rule('in', 'type', [ + self::GENERAL_HISTORY, + self::GENERAL_ACTION, + self::BATTLE_RESULT, + self::BATTLE_DETAIL, + ]); + + if (!$v->validate()) { + return $v->errorStr(); + } + + $this->args['generalID'] = (int)$this->args['generalID']; + if (key_exists('reqTo', $this->args)) { + $this->args['reqTo'] = (int)$this->args['reqTo']; + } + return null; + } + + public function checkPermission(array $me): ?string + { + + $permission = checkSecretPermission($me); + if ($permission < 0) { + return '국가에 소속되어있지 않습니다.'; + } + + $db = DB::db(); + $generalID = $this->args['generalID']; + [$testGeneralNationID, $testGeneralNPCType] = $db->queryFirstList( + 'SELECT nation,npc FROM general WHERE no = %i', + $generalID + ); + + if ($permission < 1) { + return '권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.'; + } + + $nationID = $me['nation']; + if ($testGeneralNationID !== $nationID) { + return '같은 나라의 장수가 아닙니다.'; + } + + $reqType = $this->args['type']; + if ( + $reqType === self::GENERAL_ACTION && + $testGeneralNPCType < 2 && + $generalID !== $me['generalID'] && + $permission < 2 + ) { + return '권한이 부족합니다. 유저 장수의 개인 기록은 수뇌만 열람 가능합니다.'; + } + + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY; + } + + public function getTargetGeneralID(Session $session): int{ + return $this->args['generalID']; + } + + public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + + $targetGeneralID = $this->getTargetGeneralID($session); + $reqType = $this->args['type']; + $reqTo = $this->args['reqTo'] ?? null; + + $db = DB::db(); + $me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID); + + $con = checkLimit($me['con']); + if ($con >= 2) { + return '접속 제한입니다.'; + } + + $permissionResult = $this->checkPermission($me); + if ($permissionResult !== null) { + return $permissionResult; + } + + if ($reqType == static::GENERAL_HISTORY) { + return [ + 'result' => true, + 'reqType' => $reqType, + 'generalID' => $targetGeneralID, + 'log' => getGeneralHistoryLogAll($targetGeneralID) + ]; + } + + if ($reqType == static::GENERAL_ACTION) { + return [ + 'result' => true, + 'reqType' => $reqType, + 'generalID' => $targetGeneralID, + 'log' => $reqTo === null + ? getGeneralActionLogRecent($targetGeneralID, 30) + : getGeneralActionLogMore($targetGeneralID, $reqTo, 30) + ]; + } + + if ($reqType == static::BATTLE_RESULT) { + return [ + 'result' => true, + 'reqType' => $reqType, + 'generalID' => $targetGeneralID, + 'log' => $reqTo === null + ? getBattleResultRecent($targetGeneralID, 30) + : getBattleResultMore($targetGeneralID, $reqTo, 30) + ]; + } + + if ($reqType == static::BATTLE_DETAIL) { + return [ + 'result' => true, + 'reqType' => $reqType, + 'generalID' => $targetGeneralID, + 'log' => $reqTo === null + ? getBattleResultRecent($targetGeneralID, 30) + : getBattleDetailLogMore($targetGeneralID, $reqTo, 30) + ]; + } + + return '잘못된 요청입니다: ' . $reqType; + } +} diff --git a/hwe/ts/SammoAPI.ts b/hwe/ts/SammoAPI.ts index 578d6c31..844cea74 100644 --- a/hwe/ts/SammoAPI.ts +++ b/hwe/ts/SammoAPI.ts @@ -11,7 +11,7 @@ import type { ChiefResponse } from "./defs/API/NationCommand"; import type { inheritBuffType } from "./defs/API/InheritAction"; import type { SetBlockWarResponse, GeneralListResponse as NationGeneralListResponse } from "./defs/API/Nation"; import type { UploadImageResponse } from "./defs/API/Misc"; -import type { JoinArgs } from "./defs/API/General"; +import type { GeneralLogType, GetGeneralLogResponse, JoinArgs } from "./defs/API/General"; import type { GetConstResponse, GetCurrentHistoryResponse, GetDiplomacyResponse, GetHistoryResponse } from "./defs/API/Global"; import type { CachedMapResult, GeneralListResponse, MapResult } from "./defs"; @@ -50,6 +50,10 @@ const apiRealPath = { }, General: { Join: POST as APICallT, + GetGeneralLog: GET as APICallT<{ + reqType: GeneralLogType, + reqTo?: number + }, GetGeneralLogResponse> }, Global: { GeneralList: GET as APICallT, @@ -130,6 +134,11 @@ const apiRealPath = { SetBlockScout: PATCH as APICallT<{ value: boolean, }>, + GetGeneralLog: GET as APICallT<{ + generalID: number, + reqType: GeneralLogType, + reqTo?: number + }, GetGeneralLogResponse> }, } as const; diff --git a/hwe/ts/defs/API/General.ts b/hwe/ts/defs/API/General.ts index fd96ea8b..9441355e 100644 --- a/hwe/ts/defs/API/General.ts +++ b/hwe/ts/defs/API/General.ts @@ -1,12 +1,21 @@ export type JoinArgs = { - name: string; - leadership: number; - strength: number; - intel: number; - pic: boolean; - character: string; - inheritSpecial?: string; - inheritTurntime?: number; - inheritCity?: number; - inheritBonusStat?: [number, number, number]; - }; \ No newline at end of file + name: string; + leadership: number; + strength: number; + intel: number; + pic: boolean; + character: string; + inheritSpecial?: string; + inheritTurntime?: number; + inheritCity?: number; + inheritBonusStat?: [number, number, number]; +}; + +export type GeneralLogType = 'generalHistory'|'generalAction'|'battleResult'|'battleDetail'; + +export type GetGeneralLogResponse = { + result: true, + reqType: GeneralLogType, + generalID: number, + log: Record +} \ No newline at end of file