From e55e73ab6f6ac46994d827ae4be1c55350d8da89 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 17 Jul 2022 00:41:22 +0900 Subject: [PATCH 1/8] init --- hwe/ts/PageTroop.vue | 12 ++++++++++++ hwe/ts/build_exports.json | 1 + hwe/ts/v_troop.ts | 15 +++++++++++++++ hwe/v_troop.php | 40 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 hwe/ts/PageTroop.vue create mode 100644 hwe/ts/v_troop.ts create mode 100644 hwe/v_troop.php diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue new file mode 100644 index 00000000..81dd2d50 --- /dev/null +++ b/hwe/ts/PageTroop.vue @@ -0,0 +1,12 @@ + + + diff --git a/hwe/ts/build_exports.json b/hwe/ts/build_exports.json index 51550860..4f253b09 100644 --- a/hwe/ts/build_exports.json +++ b/hwe/ts/build_exports.json @@ -37,6 +37,7 @@ "v_nationBetting": "v_nationBetting.ts", "v_nationGeneral": "v_nationGeneral.ts", "v_globalDiplomacy": "v_globalDiplomacy", + "v_troop": "v_troop.ts", "v_vote": "v_vote.ts" } } \ No newline at end of file diff --git a/hwe/ts/v_troop.ts b/hwe/ts/v_troop.ts new file mode 100644 index 00000000..45e11217 --- /dev/null +++ b/hwe/ts/v_troop.ts @@ -0,0 +1,15 @@ +import "@scss/troop.scss"; + +import { createApp } from 'vue' +import PageTroop from '@/PageTroop.vue'; +import { BootstrapVue3, BToastPlugin } from 'bootstrap-vue-3' +import { auto500px } from "./util/auto500px"; +import { htmlReady } from "./util/htmlReady"; +import { insertCustomCSS } from "./util/customCSS"; + +auto500px(); + +htmlReady(() => { + insertCustomCSS(); +}); +createApp(PageTroop).use(BootstrapVue3).use(BToastPlugin).mount('#app') \ No newline at end of file diff --git a/hwe/v_troop.php b/hwe/v_troop.php new file mode 100644 index 00000000..6923ed9a --- /dev/null +++ b/hwe/v_troop.php @@ -0,0 +1,40 @@ +setReadOnly(); +$userID = Session::getUserID(); + +$db = DB::db(); +$gameStor = KVStorage::getStorage($db, 'game_env'); + +?> + + + + + + + + <?= UniqueConst::$serverName ?>: 부대 편성 + [ + 'serverNick' => DB::prefix(), + 'mapName' => GameConst::$mapName, + 'unitSet' => GameConst::$unitSet, + ] + ], false) ?> + + + + + + + +
+ + + \ No newline at end of file -- 2.54.0 From c962039aaff11a59a7b5df8d23bf1681475dca96 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 17 Jul 2022 01:36:01 +0900 Subject: [PATCH 2/8] =?UTF-8?q?wip:=20=EB=B6=80=EB=8C=80=20=ED=8E=B8?= =?UTF-8?q?=EC=84=B1=20=EB=AA=A9=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/ts/PageTroop.vue | 102 +++++++++++++++++++++++++++- hwe/ts/util/convertIterableToMap.ts | 10 +++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 hwe/ts/util/convertIterableToMap.ts diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue index 81dd2d50..75cd6d6c 100644 --- a/hwe/ts/PageTroop.vue +++ b/hwe/ts/PageTroop.vue @@ -1,6 +1,12 @@ @@ -8,5 +14,99 @@ diff --git a/hwe/ts/util/convertIterableToMap.ts b/hwe/ts/util/convertIterableToMap.ts new file mode 100644 index 00000000..ad98f75c --- /dev/null +++ b/hwe/ts/util/convertIterableToMap.ts @@ -0,0 +1,10 @@ +export function convertIterableToMap( + values: Iterable, + key: K +): Map { + const result = new Map(); + for (const obj of values) { + result.set(obj[key] as V, obj); + } + return result; +} -- 2.54.0 From 6a5cb950da45eee401fde7601e2f14f06abde85c Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 17 Jul 2022 11:04:55 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refac:=20=EC=9E=A5=EC=88=98=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=EC=97=90=EC=84=9C=20=EB=B6=80=EB=8C=80=EC=9E=A5=20?= =?UTF-8?q?=ED=84=B4=20=EA=B0=84=EC=9D=B4=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/API/Nation/GeneralList.php | 98 +++++++++++++++++----------- hwe/ts/defs/API/Nation.ts | 6 +- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/hwe/sammo/API/Nation/GeneralList.php b/hwe/sammo/API/Nation/GeneralList.php index 9568b914..074207ba 100644 --- a/hwe/sammo/API/Nation/GeneralList.php +++ b/hwe/sammo/API/Nation/GeneralList.php @@ -2,6 +2,7 @@ namespace sammo\API\Nation; +use ArrayObject; use sammo\DB; use sammo\General; use sammo\Session; @@ -158,35 +159,59 @@ class GeneralList extends \sammo\BaseAPI $rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i ORDER BY turntime ASC', Util::formatListOfBackticks($queryColumns), $nationID), 'no'); + /** @var ArrayObject[] */ + $troops = []; + foreach ($db->queryAllLists('SELECT troop_leader,name FROM troop WHERE nation = %i', $nationID) as [$troopLeaderID, $troopName]) { + if (!key_exists($troopLeaderID, $rawGeneralList)) { + continue; + } + $troopTurnTime = $rawGeneralList[$troopLeaderID]['turntime']; + $troops[$troopLeaderID] = new ArrayObject([ + 'id' => $troopLeaderID, + 'name' => $troopName, + 'turntime' => $troopTurnTime, + 'reservedCommand' => [], + ]); + } + $reservedCommand = []; - if ($this->permission >= 1) { - $nonNPCGeneralIDList = []; - foreach ($rawGeneralList as $rawGeneral) { - if ($rawGeneral['npc'] < 2) { - $nonNPCGeneralIDList[] = $rawGeneral['no']; + if ($this->permission >= 1 || count($troops)) { + $reservedCommandTargetGeneralIDList = []; + + if($this->permission >= 1){ + foreach ($rawGeneralList as $rawGeneral) { + if ($rawGeneral['npc'] < 2) { + $reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no']; + } } } + foreach($troops as $troop){ + $reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id']; + } + - $rawTurnList = $db->query( - 'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc', - $nonNPCGeneralIDList - ); - - foreach ($rawTurnList as $rawTurn) { - [ - 'general_id' => $generalID, - 'action' => $action, - 'arg' => $arg, - 'brief' => $brief, - ] = $rawTurn; - if (!key_exists($generalID, $reservedCommand)) { - $reservedCommand[$generalID] = []; + if($reservedCommandTargetGeneralIDList){ + $rawTurnList = $db->query( + 'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc', + array_values($reservedCommandTargetGeneralIDList) + ); + + foreach ($rawTurnList as $rawTurn) { + [ + 'general_id' => $generalID, + 'action' => $action, + 'arg' => $arg, + 'brief' => $brief, + ] = $rawTurn; + if (!key_exists($generalID, $reservedCommand)) { + $reservedCommand[$generalID] = []; + } + $reservedCommand[$generalID][] = [ + 'action' => $action, + 'arg' => $arg, + 'brief' => $brief + ]; } - $reservedCommand[$generalID][] = [ - 'action' => $action, - 'arg' => $arg, - 'brief' => $brief - ]; } } @@ -252,6 +277,17 @@ class GeneralList extends \sammo\BaseAPI $resultColumns[$column] = $column; } + foreach ($troops as $troop){ + $troopLeaderID = $troop['id']; + $troop['reservedCommand'] = array_map(function($turnObj){ + $brief = $turnObj['brief']; + if($brief == '집합'){ + return $brief; + } + return '-'; + }, $specialViewFilter['reservedCommand']($rawGeneralList[$troopLeaderID])); + } + $generalList = []; foreach ($rawGeneralList as $rawGeneral) { //General 생성? @@ -272,24 +308,12 @@ class GeneralList extends \sammo\BaseAPI $generalList[] = $item; } - $troops = []; - foreach ($db->queryAllLists('SELECT troop_leader,name FROM troop WHERE nation = %i', $nationID) as [$troopLeaderID, $troopName]) { - if (!key_exists($troopLeaderID, $rawGeneralList)) { - continue; - } - $troopTurnTime = $rawGeneralList[$troopLeaderID]['turntime']; - $troops[] = [ - 'id' => $troopLeaderID, - 'name' => $troopName, - 'turntime' => $troopTurnTime - ]; - } $result = [ 'result' => true, 'permission' => $this->permission, 'column' => array_keys($resultColumns), 'list' => $generalList, - 'troops' => $troops, + 'troops' => array_values($troops), 'env' => $env, ]; diff --git a/hwe/ts/defs/API/Nation.ts b/hwe/ts/defs/API/Nation.ts index 126f2278..6c76abb9 100644 --- a/hwe/ts/defs/API/Nation.ts +++ b/hwe/ts/defs/API/Nation.ts @@ -107,7 +107,7 @@ export type RawGeneralListP0 = ValidResponse & { permission: 0, column: (keyof GeneralListItemP0)[], list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], + troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], env: ResponseEnv, } @@ -115,7 +115,7 @@ export type RawGeneralListP1 = ValidResponse & { permission: 1, column: (keyof GeneralListItemP1)[], list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], + troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], env: ResponseEnv, } @@ -123,7 +123,7 @@ export type RawGeneralListP2 = ValidResponse & { permission: 2 | 3 | 4, column: (keyof GeneralListItemP2)[], list: ValuesOf[][], - troops: {id: number, name: string, turntime: string}[], + troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], env: ResponseEnv, } -- 2.54.0 From 00a440a107534c08729bf765efd3076294995088 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 17 Jul 2022 16:39:30 +0900 Subject: [PATCH 4/8] wip --- hwe/sammo/API/Nation/GeneralList.php | 7 +- hwe/ts/PageTroop.vue | 336 ++++++++++++++++++-- hwe/ts/components/GeneralLiteCard.vue | 180 +++++++++++ hwe/ts/components/GeneralSupplementCard.vue | 24 +- hwe/ts/defs/API/Nation.ts | 219 ++++++------- 5 files changed, 611 insertions(+), 155 deletions(-) create mode 100644 hwe/ts/components/GeneralLiteCard.vue diff --git a/hwe/sammo/API/Nation/GeneralList.php b/hwe/sammo/API/Nation/GeneralList.php index 074207ba..26cf933b 100644 --- a/hwe/sammo/API/Nation/GeneralList.php +++ b/hwe/sammo/API/Nation/GeneralList.php @@ -46,10 +46,11 @@ class GeneralList extends \sammo\BaseAPI 'connect' => 0, 'troop' => 0, + 'city' => 0, 'con' => 1, - 'specage' => 1, - 'specage2' => 1, + 'specage' => 0, + 'specage2' => 0, 'leadership_exp' => 1, 'strength_exp' => 1, 'intel_exp' => 1, @@ -59,7 +60,6 @@ class GeneralList extends \sammo\BaseAPI 'dex4' => 1, 'dex5' => 1, - 'city' => 1, 'experience' => 1, 'dedication' => 1, @@ -315,6 +315,7 @@ class GeneralList extends \sammo\BaseAPI 'list' => $generalList, 'troops' => array_values($troops), 'env' => $env, + 'myGeneralID' => $session->generalID, ]; return $result; diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue index 75cd6d6c..77addbb9 100644 --- a/hwe/ts/PageTroop.vue +++ b/hwe/ts/PageTroop.vue @@ -1,72 +1,213 @@ + + diff --git a/hwe/ts/components/GeneralLiteCard.vue b/hwe/ts/components/GeneralLiteCard.vue new file mode 100644 index 00000000..18364975 --- /dev/null +++ b/hwe/ts/components/GeneralLiteCard.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/hwe/ts/components/GeneralSupplementCard.vue b/hwe/ts/components/GeneralSupplementCard.vue index 10107da0..1b75af9e 100644 --- a/hwe/ts/components/GeneralSupplementCard.vue +++ b/hwe/ts/components/GeneralSupplementCard.vue @@ -38,24 +38,24 @@
피살
{{ general.deathcrew.toLocaleString() }}
-
+
숙련도
-
예약턴
-
- {{ turn.brief }} +
예약턴
+
+ {{ turn.brief }}
@@ -161,12 +161,16 @@ const dexList = computed((): [string, number, DexInfo][] => { } .general-card-turn { - .bg1 { - border-left: solid 1px gray; + > div { + height: calc(64px / 3); + border-bottom: solid 1px gray; + border-right: solid 1px gray; } - > div { - border-bottom: solid 1px gray; + > .command{ + font-size: 90%; + display: grid; + align-content: center; } } diff --git a/hwe/ts/defs/API/Nation.ts b/hwe/ts/defs/API/Nation.ts index 6c76abb9..85b26c67 100644 --- a/hwe/ts/defs/API/Nation.ts +++ b/hwe/ts/defs/API/Nation.ts @@ -7,79 +7,79 @@ export type SetBlockWarResponse = ValidResponse & { }; export type GeneralListItemP0 = { - no: number, - name: string, - nation: number, - npc: number, - injury: number, - leadership: number, - strength: number, - intel: number, - explevel: number, - dedlevel: number, - gold: number, - rice: number, - killturn: number, - picture: string, - imgsvr: 0 | 1, - age: number, - specialDomestic: GameObjClassKey, - specialWar: GameObjClassKey, - personal: GameObjClassKey, - belong: number, - connect: number, + no: number; + name: string; + nation: number; + npc: number; + injury: number; + leadership: number; + strength: number; + intel: number; + explevel: number; + dedlevel: number; + gold: number; + rice: number; + killturn: number; + picture: string; + imgsvr: 0 | 1; + age: number; + specialDomestic: GameObjClassKey; + specialWar: GameObjClassKey; + personal: GameObjClassKey; + belong: number; + connect: number; - officerLevel: number, //권한에따라 태수,군사,시종 노출 여부가 다름 - officerLevelText: string, - lbonus: number, - ownerName: string | null, //NPC 출력용에 따라 결과가 다름 - honorText: string, - dedLevelText: string, - bill: number, - reservedCommand: TurnObj[] | null, + officerLevel: number; //권한에따라 태수,군사,시종 노출 여부가 다름 + officerLevelText: string; + lbonus: number; + ownerName: string | null; //NPC 출력용에 따라 결과가 다름 + honorText: string; + dedLevelText: string; + bill: number; + reservedCommand: TurnObj[] | null; - autorun_limit: number, + autorun_limit: number; - troop: number, -} + city: number; + troop: number; +}; export type GeneralListItemP1 = { - con: number, - specage: number, - specage2: number, - leadership_exp: number, - strength_exp: number, - intel_exp: number, + con: number; + specage: number; + specage2: number; + leadership_exp: number; + strength_exp: number; + intel_exp: number; - dex1: number, - dex2: number, - dex3: number, - dex4: number, - dex5: number, + dex1: number; + dex2: number; + dex3: number; + dex4: number; + dex5: number; - city: number, - experience: number, - dedication: number, - officer_level: number, - officer_city: number, - defence_train: number, - crewtype: GameObjClassKey, - crew: number, - train: number, - atmos: number, - turntime: string, - recent_war: string, - horse: GameObjClassKey, - weapon: GameObjClassKey, - book: GameObjClassKey, - item: GameObjClassKey, + experience: number; + dedication: number; + officer_level: number; + officer_city: number; + defence_train: number; + crewtype: GameObjClassKey; + crew: number; + train: number; + atmos: number; + turntime: string; + recent_war: string; + horse: GameObjClassKey; + weapon: GameObjClassKey; + book: GameObjClassKey; + item: GameObjClassKey; - warnum: number, - killnum: number, - deathnum: number, - killcrew: number, - deathcrew: number, - firenum: number, + warnum: number; + killnum: number; + deathnum: number; + killcrew: number; + deathcrew: number; + firenum: number; } & GeneralListItemP0; export type GeneralListItemP2 = GeneralListItemP1; @@ -87,45 +87,48 @@ export type GeneralListItemP2 = GeneralListItemP1; export type RawGeneralListItem = GeneralListItemP0 | GeneralListItemP1 | GeneralListItemP2; export type GeneralListItem = - (GeneralListItemP0 & { st0: true, st1: false, st2: false, permission: 0 }) | - (GeneralListItemP1 & { st0: true, st1: true, st2: false, permission: 1 }) | - (GeneralListItemP2 & { st0: true, st1: true, st2: true, permission: 2 | 3 | 4 }); + | (GeneralListItemP0 & { st0: true; st1: false; st2: false; permission: 0 }) + | (GeneralListItemP1 & { st0: true; st1: true; st2: false; permission: 1 }) + | (GeneralListItemP2 & { st0: true; st1: true; st2: true; permission: 2 | 3 | 4 }); type ResponseEnv = { - year: number, - month: number, - turntime: string, - turnterm: number, - killturn: number, + year: number; + month: number; + turntime: string; + turnterm: number; + killturn: number; autorun_user?: { - limit_minutes: number, - options: Record, - } -} + limit_minutes: number; + options: Record; + }; +}; -export type RawGeneralListP0 = ValidResponse & { - permission: 0, - column: (keyof GeneralListItemP0)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], - env: ResponseEnv, -} +type RawGeneralCommon = { + troops: { id: number; name: string; turntime: string; reservedCommand: string[] }[]; + env: ResponseEnv; + myGeneralID: number; +}; -export type RawGeneralListP1 = ValidResponse & { - permission: 1, - column: (keyof GeneralListItemP1)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], - env: ResponseEnv, -} +export type RawGeneralListP0 = ValidResponse & + RawGeneralCommon & { + permission: 0; + column: (keyof GeneralListItemP0)[]; + list: ValuesOf[][]; + }; -export type RawGeneralListP2 = ValidResponse & { - permission: 2 | 3 | 4, - column: (keyof GeneralListItemP2)[], - list: ValuesOf[][], - troops: {id: number, name: string, turntime: string, reservedCommand: string[]}[], - env: ResponseEnv, -} +export type RawGeneralListP1 = ValidResponse & + RawGeneralCommon & { + permission: 1; + column: (keyof GeneralListItemP1)[]; + list: ValuesOf[][]; + }; + +export type RawGeneralListP2 = ValidResponse & + RawGeneralCommon & { + permission: 2 | 3 | 4; + column: (keyof GeneralListItemP2)[]; + list: ValuesOf[][]; + }; export type GeneralListResponse = RawGeneralListP0 | RawGeneralListP1 | RawGeneralListP2; @@ -141,16 +144,18 @@ export type NationItem = NationStaticItem & { strategic_cmd_limit: number; surlimit: number; tech: number; -} +}; export type LiteNationInfoResponse = ValidResponse & { nation: NationStaticItem; -} +}; -export type NationInfoResponse = (ValidResponse & { - nation: NationStaticItem; -}) | (ValidResponse &{ - nation: NationItem; - impossibleStrategicCommandLists: [string, number][]; - troops: Record; -}) \ No newline at end of file +export type NationInfoResponse = + | (ValidResponse & { + nation: NationStaticItem; + }) + | (ValidResponse & { + nation: NationItem; + impossibleStrategicCommandLists: [string, number][]; + troops: Record; + }); -- 2.54.0 From 9db1be7b6c54c2c7503433410f7588cf5eb46e30 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Sun, 17 Jul 2022 21:01:28 +0900 Subject: [PATCH 5/8] wip --- hwe/sammo/API/Nation/SetTroopName.php | 1 + hwe/sammo/API/Troop/ExitTroop.php | 0 hwe/sammo/API/Troop/JoinTroop.php | 64 ++++++++++++++++++++++++++ hwe/sammo/API/Troop/NewTroop.php | 64 ++++++++++++++++++++++++++ hwe/sammo/API/Troop/SetTroopName.php | 65 +++++++++++++++++++++++++++ hwe/ts/SammoAPI.ts | 10 +++++ 6 files changed, 204 insertions(+) create mode 100644 hwe/sammo/API/Troop/ExitTroop.php create mode 100644 hwe/sammo/API/Troop/JoinTroop.php create mode 100644 hwe/sammo/API/Troop/NewTroop.php create mode 100644 hwe/sammo/API/Troop/SetTroopName.php diff --git a/hwe/sammo/API/Nation/SetTroopName.php b/hwe/sammo/API/Nation/SetTroopName.php index b8689d6f..0dec998b 100644 --- a/hwe/sammo/API/Nation/SetTroopName.php +++ b/hwe/sammo/API/Nation/SetTroopName.php @@ -10,6 +10,7 @@ use sammo\Validator; use function sammo\checkSecretPermission; +/** @deprecated */ class SetTroopName extends \sammo\BaseAPI { public function validateArgs(): ?string diff --git a/hwe/sammo/API/Troop/ExitTroop.php b/hwe/sammo/API/Troop/ExitTroop.php new file mode 100644 index 00000000..e69de29b diff --git a/hwe/sammo/API/Troop/JoinTroop.php b/hwe/sammo/API/Troop/JoinTroop.php new file mode 100644 index 00000000..37b942c7 --- /dev/null +++ b/hwe/sammo/API/Troop/JoinTroop.php @@ -0,0 +1,64 @@ +args); + $v->rule('required', [ + 'troopID', + ]) + ->rule('integer', 'troopID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $troopName = StringUtil::neutralize($this->args['troopName']); + if (!$troopName) { + return '부대 이름이 없습니다.'; + } + + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + if ($me['troop'] != 0) { + return '이미 부대에 소속되어 있습니다.'; + } + $nationID = $me['nation']; + if ($nationID == 0) { + return '국가에 소속되어 있지 않습니다.'; + } + + $generalID = $me['no']; + + $db->insert('troop', [ + 'name' => $troopName, + 'troop_leader' => $generalID, + 'nation' => $nationID, + ]); + + if ($db->affectedRows() == 0) { + return '부대가 생성되지 않았습니다.'; + } + + return null; + } +} diff --git a/hwe/sammo/API/Troop/NewTroop.php b/hwe/sammo/API/Troop/NewTroop.php new file mode 100644 index 00000000..95723d71 --- /dev/null +++ b/hwe/sammo/API/Troop/NewTroop.php @@ -0,0 +1,64 @@ +args); + $v->rule('required', [ + 'troopName', + ]) + ->rule('stringWidthBetween', 'troopName', 1, 18); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $troopName = StringUtil::neutralize($this->args['troopName']); + if(!$troopName){ + return '부대 이름이 없습니다.'; + } + + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + if($me['troop'] != 0){ + return '이미 부대에 소속되어 있습니다.'; + } + $nationID = $me['nation']; + if($nationID == 0){ + return '국가에 소속되어 있지 않습니다.'; + } + + $generalID = $me['no']; + + $db->insert('troop', [ + 'name'=>$troopName, + 'troop_leader'=>$generalID, + 'nation'=>$nationID, + ]); + + if($db->affectedRows() == 0){ + return '부대가 생성되지 않았습니다.'; + } + + return null; + } +} diff --git a/hwe/sammo/API/Troop/SetTroopName.php b/hwe/sammo/API/Troop/SetTroopName.php new file mode 100644 index 00000000..a59cdfb7 --- /dev/null +++ b/hwe/sammo/API/Troop/SetTroopName.php @@ -0,0 +1,65 @@ +args); + $v->rule('required', [ + 'troopID', + 'troopName', + ]) + ->rule('stringWidthBetween', 'troopName', 1, 18) + ->rule('integer', 'troopID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $userID = $session->userID; + $db = DB::db(); + $me = $db->queryFirstRow('SELECT `no`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); + $permission = checkSecretPermission($me, false); + $troopID = $this->args['troopID']; + + $generalID = $me['no']; + if($generalID != $troopID && $permission < 4){ + return "권한이 부족합니다."; + } + + $troopName = StringUtil::neutralize($this->args['troopName']); + if(!$troopName){ + return '부대 이름이 없습니다.'; + } + + $nationID = $me['nation']; + $db->update('troop', [ + 'name'=>$troopName + ], 'troop_leader=%i AND `nation`=%i',$troopID, $nationID); + + if($db->affectedRows() == 0){ + return '부대가 없습니다.'; + } + + return null; + } +} diff --git a/hwe/ts/SammoAPI.ts b/hwe/ts/SammoAPI.ts index bf926c51..2d8290a0 100644 --- a/hwe/ts/SammoAPI.ts +++ b/hwe/ts/SammoAPI.ts @@ -227,12 +227,22 @@ const apiRealPath = { }, GetGeneralLogResponse >, + /** @deprecated */ SetTroopName: PATCH as APICallT<{ troopID: number; troopName: string; }>, GetNationInfo: GET as APICallT<{full?: boolean}, NationInfoResponse>, }, + Troop: { + NewTroop: POST as APICallT<{ + name: string; + }>, + SetTroopName: PATCH as APICallT<{ + troopID: number; + troopName: string; + }>, + }, Vote: { AddComment: POST as APICallT<{ voteID: number; -- 2.54.0 From 245a8583e285a60340a993d22b52b9af5a7dd63a Mon Sep 17 00:00:00 2001 From: Hide_D Date: Tue, 19 Jul 2022 00:25:22 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=EB=B6=80=EB=8C=80=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/API/Troop/ExitTroop.php | 46 +++++++++++++++++++++ hwe/sammo/API/Troop/JoinTroop.php | 23 +++++------ hwe/sammo/API/Troop/KickFromTroop.php | 57 +++++++++++++++++++++++++++ hwe/sammo/API/Troop/NewTroop.php | 10 +++-- hwe/ts/SammoAPI.ts | 10 ++++- 5 files changed, 128 insertions(+), 18 deletions(-) create mode 100644 hwe/sammo/API/Troop/KickFromTroop.php diff --git a/hwe/sammo/API/Troop/ExitTroop.php b/hwe/sammo/API/Troop/ExitTroop.php index e69de29b..0d71879c 100644 --- a/hwe/sammo/API/Troop/ExitTroop.php +++ b/hwe/sammo/API/Troop/ExitTroop.php @@ -0,0 +1,46 @@ +generalID; + $db = DB::db(); + + $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID); + if($troopID == 0){ + return '부대에 소속되어 있지 않습니다.'; + } + + if($generalID != $troopID){ + $db->update('general', [ + 'troop' => 0, + ], '`no` = %i', $generalID); + return null; + } + + //부대장이다. + $db->update('general', [ + 'troop' => 0, + ], '`troop` = %i', $troopID); + $db->delete('troop', 'troop_leader = %i', $troopID); + + return null; + } +} diff --git a/hwe/sammo/API/Troop/JoinTroop.php b/hwe/sammo/API/Troop/JoinTroop.php index 37b942c7..42477001 100644 --- a/hwe/sammo/API/Troop/JoinTroop.php +++ b/hwe/sammo/API/Troop/JoinTroop.php @@ -8,7 +8,7 @@ use sammo\DB; use sammo\StringUtil; use sammo\Validator; -class SetTroopName extends \sammo\BaseAPI +class JoinTroop extends \sammo\BaseAPI { public function validateArgs(): ?string { @@ -32,10 +32,7 @@ class SetTroopName extends \sammo\BaseAPI public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) { $userID = $session->userID; - $troopName = StringUtil::neutralize($this->args['troopName']); - if (!$troopName) { - return '부대 이름이 없습니다.'; - } + $troopID = $this->args['troopID']; $db = DB::db(); $me = $db->queryFirstRow('SELECT `no`,nation,`troop`,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID); @@ -47,17 +44,15 @@ class SetTroopName extends \sammo\BaseAPI return '국가에 소속되어 있지 않습니다.'; } + $troopExists = $db->queryFirstField('SELECT `troop_leader` FROM `troop` WHERE `troop_leader` = %i AND `nation` = %i', $troopID, $nationID); + if (!$troopExists) { + return '부대가 올바르지 않습니다.'; + } $generalID = $me['no']; - $db->insert('troop', [ - 'name' => $troopName, - 'troop_leader' => $generalID, - 'nation' => $nationID, - ]); - - if ($db->affectedRows() == 0) { - return '부대가 생성되지 않았습니다.'; - } + $db->update('general', [ + 'troop' => $troopID, + ], '`no` = %i AND `troop` = %i', $generalID, 0); return null; } diff --git a/hwe/sammo/API/Troop/KickFromTroop.php b/hwe/sammo/API/Troop/KickFromTroop.php new file mode 100644 index 00000000..619fc753 --- /dev/null +++ b/hwe/sammo/API/Troop/KickFromTroop.php @@ -0,0 +1,57 @@ +args); + $v->rule('required', [ + 'troopID', + 'generalID', + ]) + ->rule('integer', 'troopID') + ->rule('integer', 'generalID'); + + if (!$v->validate()) { + return $v->errorStr(); + } + return null; + } + + + public function getRequiredSessionMode(): int + { + return static::REQ_GAME_LOGIN; + } + + public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag) + { + $generalID = $this->args['generalID']; + $db = DB::db(); + + $troopID = $db->queryFirstField('SELECT troop FROM general WHERE no = %i', $generalID); + if($troopID == 0){ + return '부대에 소속되어 있지 않습니다.'; + } + + if($troopID != $this->args['troopID']){ + return '다른 부대에 소속되어 있습니다.'; + } + + if($troopID == $generalID){ + return '부대장을 추방할 수 없습니다.'; + } + + $db->update('general', [ + 'troop' => 0, + ], '`no` = %i AND `troop` = %i', $generalID, $troopID); + return null; + } +} diff --git a/hwe/sammo/API/Troop/NewTroop.php b/hwe/sammo/API/Troop/NewTroop.php index 95723d71..69e5521f 100644 --- a/hwe/sammo/API/Troop/NewTroop.php +++ b/hwe/sammo/API/Troop/NewTroop.php @@ -8,7 +8,7 @@ use sammo\DB; use sammo\StringUtil; use sammo\Validator; -class SetTroopName extends \sammo\BaseAPI +class NewTroop extends \sammo\BaseAPI { public function validateArgs(): ?string { @@ -48,7 +48,7 @@ class SetTroopName extends \sammo\BaseAPI } $generalID = $me['no']; - + $db->insert('troop', [ 'name'=>$troopName, 'troop_leader'=>$generalID, @@ -56,9 +56,13 @@ class SetTroopName extends \sammo\BaseAPI ]); if($db->affectedRows() == 0){ - return '부대가 생성되지 않았습니다.'; + return '부대가 생성되지 않았습니다. 버그일 수 있습니다.'; } + $db->update('general', [ + 'troop'=>$generalID + ], '`no` = %i', $generalID); + return null; } } diff --git a/hwe/ts/SammoAPI.ts b/hwe/ts/SammoAPI.ts index 2d8290a0..b63d498b 100644 --- a/hwe/ts/SammoAPI.ts +++ b/hwe/ts/SammoAPI.ts @@ -236,12 +236,20 @@ const apiRealPath = { }, Troop: { NewTroop: POST as APICallT<{ - name: string; + troopName: string; }>, + JoinTroop: PATCH as APICallT<{ + troopID: number; + }>, + ExitTroop: PATCH as APICallT, SetTroopName: PATCH as APICallT<{ troopID: number; troopName: string; }>, + KickFromTroop: PATCH as APICallT<{ + troopID: number; + generalID: number; + }> }, Vote: { AddComment: POST as APICallT<{ -- 2.54.0 From c938e28729a55dbbf12f979e42f94556de1de7ff Mon Sep 17 00:00:00 2001 From: Hide_D Date: Tue, 19 Jul 2022 01:26:49 +0900 Subject: [PATCH 7/8] =?UTF-8?q?wip:=20=EB=B6=80=EB=8C=80=ED=8E=B8=EC=84=B1?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=EC=A4=91..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/ts/PageTroop.vue | 187 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 178 insertions(+), 9 deletions(-) diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue index 77addbb9..57b97ff0 100644 --- a/hwe/ts/PageTroop.vue +++ b/hwe/ts/PageTroop.vue @@ -1,5 +1,5 @@