refac: sammoAPI 정의 방식 일부 변경

- defs/index.ts로 분리
- API/Nation/GeneralList 호출 재정의
This commit is contained in:
2022-04-07 03:03:38 +09:00
parent 3b4cbf68ca
commit 988ba015b8
3 changed files with 123 additions and 29 deletions
+22 -29
View File
@@ -22,24 +22,10 @@ use function sammo\increaseRefresh;
class GeneralList extends \sammo\BaseAPI
{
private int $reqType;
private bool $reqForce;
private int $permission;
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v
->rule('integer', 'req')
->rule('boolean', 'force');
if (!$v->validate()) {
return $v->errorStr();
}
$this->reqType = $this->args['req'] ?? 1;
$this->reqForce = $this->args['force'] ?? false;
return null;
}
@@ -74,11 +60,6 @@ class GeneralList extends \sammo\BaseAPI
$nationID = $me['nation'];
$this->permission = checkSecretPermission($me, true);
if ($this->reqForce && $this->reqType > $this->permission) {
return '권한이 부족합니다.';
}
$this->permission = min($this->reqType, $this->permission);
$nationArr = getNationStaticInfo($nationID);
@@ -123,12 +104,19 @@ class GeneralList extends \sammo\BaseAPI
'connect' => 0
];
$columnRemap = [
'special' => 'specialDomestic',
'special2' => 'specialWar',
];
$customViewColumns = [
'officerLevel' => 0,
'officerLevelText' => 0,
'specialDomesticTest' => 0,
'specialWarText' => 0,
'lbonus' => 0,
'ownerName' => 0,
'honorText' => 0
'honorText' => 0,
];
@@ -136,10 +124,14 @@ class GeneralList extends \sammo\BaseAPI
'officerLevel' => function ($rawGeneral) {
return $this->getOfficerLevel($rawGeneral);
},
'special' => function ($rawGeneral) {
'officerLevelText' => function ($rawGeneral) use ($nationArr) {
$level = $this->getOfficerLevel($rawGeneral);
return getOfficerLevelText($level, $nationArr['level']);
},
'specialDomesticTest' => function ($rawGeneral) {
return getGeneralSpecialDomesticName($rawGeneral['special']);
},
'special2' => function ($rawGeneral) {
'specialWarText' => function ($rawGeneral) {
return getGeneralSpecialWarName($rawGeneral['special2']);
},
'personal' => function ($rawGeneral) {
@@ -154,10 +146,6 @@ class GeneralList extends \sammo\BaseAPI
}
return $rawGeneral['owner_name'];
},
'officerLevelText' => function ($rawGeneral) use ($nationArr) {
$level = $this->getOfficerLevel($rawGeneral);
return getOfficerLevelText($level, $nationArr['level']);
},
'honorText' => function ($rawGeneral) {
return getHonor($rawGeneral['experience']);
},
@@ -180,7 +168,12 @@ class GeneralList extends \sammo\BaseAPI
if ($reqPermission > $this->permission) {
continue;
}
$resultColumns[] = $column;
if(key_exists($column, $columnRemap)){
$resultColumns[$columnRemap[$column]] = $column;
}
else{
$resultColumns[$column] = $column;
}
}
foreach ($customViewColumns as $column => $reqPermission) {
@@ -209,11 +202,11 @@ class GeneralList extends \sammo\BaseAPI
$result = [
'result' => true,
'column' => $resultColumns,
'permission' => $this->permission,
'column' => array_keys($resultColumns),
'list' => $generalList,
];
return $result;
}
}
+81
View File
@@ -0,0 +1,81 @@
import type { GameObjType, ValuesOf } from "@/defs";
import type { ValidResponse } from "@/SammoAPI";
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,
special: GameObjType,
special2: GameObjType,
personal: GameObjType,
belong: number,
connect: number,
officerLevel: number, //권한에따라 태수,군사,시종 노출 여부가 다름
officerLevelText: string,
lbonus: number,
ownerName: string | null, //NPC 출력용에 따라 결과가 다름
honorText: string,
}
export type GeneralListItemP1 = {
city: number,
experience: number,
dedication: number,
} & GeneralListItemP0;
export type GeneralListItemP2 = GeneralListItemP1 & {
officer_level: number,
officer_city: number,
}
export type GeneralListItemP9 = GeneralListItemP2 & {
owner_name: string,
}
export type GeneralListItem =
({permission : 0} & GeneralListItemP0) |
({permission : 1} & GeneralListItemP1) |
({permission : 2} & GeneralListItemP2) |
({permission : 9} & GeneralListItemP9);
export type RawGeneralListP0 = ValidResponse & {
permission: 0,
column: keyof GeneralListItemP0[],
list: ValuesOf<GeneralListItemP0>[],
}
export type RawGeneralListP1 = ValidResponse & {
permission: 1,
column: keyof GeneralListItemP1[],
list: ValuesOf<GeneralListItemP1>[][],
}
export type RawGeneralListP2 = ValidResponse & {
permission: 2,
column: keyof GeneralListItemP2[],
list: ValuesOf<GeneralListItemP2>[][],
}
export type RawGeneralListP9 = ValidResponse & {
permission: 9,
column: keyof GeneralListItemP9[],
list: ValuesOf<GeneralListItemP9>[][],
}
export type GeneralListResponse = RawGeneralListP0 | RawGeneralListP1 | RawGeneralListP2 | RawGeneralListP9;
+20
View File
@@ -0,0 +1,20 @@
import type { ValuesOf } from "@/defs";
import { zip } from "lodash";
export function merge2DArrToObjectArr<T extends Record<string, unknown>>(column: (keyof T)[], list: ValuesOf<T>[][]): T[]{
const result: T[] = [];
for(const rawItem of list){
const item: Record<string, unknown> = {};
if(column.length != item.length){
throw `column과 item의 길이가 같지 않습니다: ${column.length} != ${list.length}, ${JSON.stringify(item)}`;
}
for(const [key, value] of zip(column, rawItem)){
item[key as string] = value;
}
result.push(item as T);
}
return result;
}