feat: Global/GetMap, Global/GetCachedMap 추가
- 지도를 가져오는 코드 - GetCahcedMap에서는 600초 단위 캐싱 - history 필드에 최근 10건 표시
This commit is contained in:
@@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\Global;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use Nette\Caching\Cache;
|
||||||
|
use sammo\APICacheResult;
|
||||||
|
use sammo\GameConst;
|
||||||
|
use sammo\MapRequest;
|
||||||
|
use sammo\TimeUtil;
|
||||||
|
use sammo\UniqueConst;
|
||||||
|
use sammo\Util;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\getGlobalHistoryLogRecent;
|
||||||
|
use function sammo\getWorldMap;
|
||||||
|
use function sammo\prepareDir;
|
||||||
|
|
||||||
|
class GetCachedMap extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
const CACHE_SECONDS = 600;
|
||||||
|
private ?\DateTimeInterface $cachedTime = null;
|
||||||
|
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tryCache(): ?APICacheResult
|
||||||
|
{
|
||||||
|
if ($this->cachedTime === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$now = TimeUtil::nowDateTimeImmutable();
|
||||||
|
$diff = TimeUtil::DateIntervalToSeconds($this->cachedTime->diff($now));
|
||||||
|
$nextCacheTime = self::CACHE_SECONDS - $diff;
|
||||||
|
return new APICacheResult($this->cachedTime, null, Util::toInt($nextCacheTime), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
return static::NO_SESSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
if (!class_exists('\\sammo\\UniqueConst')) {
|
||||||
|
return '서버 초기화되지 않음';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!prepareDir('data/file_cache')) {
|
||||||
|
return 'cache 불가';
|
||||||
|
}
|
||||||
|
|
||||||
|
$storage = new \Nette\Caching\Storages\FileStorage('data/file_cache');
|
||||||
|
$cache = new Cache($storage);
|
||||||
|
|
||||||
|
$now = TimeUtil::nowDateTimeImmutable();
|
||||||
|
if ($modifiedSince) {
|
||||||
|
$diff = TimeUtil::DateIntervalToSeconds($modifiedSince->diff($now));
|
||||||
|
if (0 <= $diff && $diff < self::CACHE_SECONDS) {
|
||||||
|
$this->cachedTime = $modifiedSince;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$mapInfo = $cache->load("recent_map");
|
||||||
|
if ($mapInfo) {
|
||||||
|
$cachedTime = TimeUtil::secondsToDateTime($mapInfo['timestamp'], true, true);
|
||||||
|
$diff = $cachedTime->diff($now);
|
||||||
|
if (0 <= $diff && $diff < self::CACHE_SECONDS) {
|
||||||
|
$this->cachedTime = $cachedTime;
|
||||||
|
return $mapInfo['data'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$history = getGlobalHistoryLogRecent(10);
|
||||||
|
$cachedMap = getWorldMap([
|
||||||
|
'year' => null,
|
||||||
|
'month' => null,
|
||||||
|
'aux' => null,
|
||||||
|
'neutralView' => true,
|
||||||
|
'showMe' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$cachedMap['history'] = $history;
|
||||||
|
$cachedMap['theme'] = GameConst::$mapName;
|
||||||
|
$timestamp = $now->getTimestamp();
|
||||||
|
$this->cachedTime = $now;
|
||||||
|
|
||||||
|
$map = [
|
||||||
|
'timestamp' => $timestamp,
|
||||||
|
'data' => $cachedMap,
|
||||||
|
];
|
||||||
|
$cache->save("recent_map", $map);
|
||||||
|
|
||||||
|
return $cachedMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\Global;
|
||||||
|
|
||||||
|
use sammo\Session;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use sammo\MapRequest;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\getWorldMap;
|
||||||
|
|
||||||
|
class GetMap extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
$v = new Validator($this->args);
|
||||||
|
$v->rule('boolean', 'neutralView')
|
||||||
|
->rule('boolean', 'showMe');
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
return static::REQ_LOGIN | static::REQ_READ_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
|
||||||
|
{
|
||||||
|
return getWorldMap(new MapRequest([
|
||||||
|
'neutralView' => !!($this->args['neutralView'] ?? false),
|
||||||
|
'showMe' => !!($this->args['showMe'] ?? false),
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
-2
@@ -13,7 +13,7 @@ import type { SetBlockWarResponse, GeneralListResponse as NationGeneralListRespo
|
|||||||
import type { UploadImageResponse } from "./defs/API/Misc";
|
import type { UploadImageResponse } from "./defs/API/Misc";
|
||||||
import type { JoinArgs } from "./defs/API/General";
|
import type { JoinArgs } from "./defs/API/General";
|
||||||
import type { GetConstResponse, GetCurrentHistoryResponse, GetHistoryResponse } from "./defs/API/Global";
|
import type { GetConstResponse, GetCurrentHistoryResponse, GetHistoryResponse } from "./defs/API/Global";
|
||||||
import type { GeneralListResponse } from "./defs";
|
import type { CachedMapResult, GeneralListResponse, MapResult } from "./defs";
|
||||||
|
|
||||||
const apiRealPath = {
|
const apiRealPath = {
|
||||||
Betting: {
|
Betting: {
|
||||||
@@ -57,7 +57,9 @@ const apiRealPath = {
|
|||||||
NumVar('year',
|
NumVar('year',
|
||||||
NumVar('month', GET as APICallT<undefined, GetHistoryResponse>
|
NumVar('month', GET as APICallT<undefined, GetHistoryResponse>
|
||||||
))),
|
))),
|
||||||
GetCurrentHistory: GET as APICallT<undefined, GetCurrentHistoryResponse>
|
GetCurrentHistory: GET as APICallT<undefined, GetCurrentHistoryResponse>,
|
||||||
|
GetMap: GET as APICallT<undefined, MapResult>,
|
||||||
|
GetCachedMap: GET as APICallT<undefined, CachedMapResult>,
|
||||||
},
|
},
|
||||||
InheritAction: {
|
InheritAction: {
|
||||||
BuyHiddenBuff: PUT as APICallT<{
|
BuyHiddenBuff: PUT as APICallT<{
|
||||||
|
|||||||
@@ -244,12 +244,13 @@ export type MapResult = {
|
|||||||
shownByGeneralList: number[],
|
shownByGeneralList: number[],
|
||||||
myCity?: number,
|
myCity?: number,
|
||||||
myNation?: number,
|
myNation?: number,
|
||||||
|
}
|
||||||
|
|
||||||
|
export type CachedMapResult = MapResult & {
|
||||||
theme?: string,
|
theme?: string,
|
||||||
history?: string[],
|
history?: string[],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export type SimpleNationObj = {
|
export type SimpleNationObj = {
|
||||||
capital: number,
|
capital: number,
|
||||||
cities: string[],
|
cities: string[],
|
||||||
|
|||||||
Reference in New Issue
Block a user