fix: support mixed wall and game clock servers

This commit is contained in:
2026-08-04 20:37:56 +09:00
committed by Hide_D
parent fc6f84ce23
commit 9da44d0001
8 changed files with 153 additions and 25 deletions
+2 -1
View File
@@ -77,7 +77,8 @@ $admin['npcMode'] = $admin['npcmode'];
$admin['turnTerm'] = $admin['turnterm'];
$admin['isUnited'] = $admin['isunited'];
$admin['isOpen'] = $clock->nowTick() >= Util::toInt($admin['opentime']);
$admin['starttime'] = substr($clock->formatTick(Util::toInt($admin['opentime'])), 5, 11);
$admin['opentime'] = $clock->formatTick(Util::toInt($admin['opentime']));
$admin['starttime'] = substr($admin['opentime'], 5, 11);
$admin['turntime'] = substr($clock->formatTick(Util::toInt($admin['turntime'])), 5, 11);
unset($admin['npcmode']);
unset($admin['maxgeneral']);
+14
View File
@@ -0,0 +1,14 @@
import assert from 'assert';
import { resolveGatewayOpenState } from '../ts/gateway/resolveGatewayOpenState';
describe('resolveGatewayOpenState', () => {
it('keeps the logical server decision even when projected dates disagree with wall time', () => {
assert.strictEqual(resolveGatewayOpenState(false, '2000-01-01 00:00:00', '2026-08-04 00:00:00'), false);
assert.strictEqual(resolveGatewayOpenState(true, '2042-01-01 00:00:00', '2026-08-04 00:00:00'), true);
});
it('falls back to legacy wall time only when isOpen is absent', () => {
assert.strictEqual(resolveGatewayOpenState(undefined, '2026-08-03 00:00:00', '2026-08-04 00:00:00'), true);
assert.strictEqual(resolveGatewayOpenState(undefined, '2026-08-05 00:00:00', '2026-08-04 00:00:00'), false);
});
});
+8 -3
View File
@@ -5,8 +5,10 @@ import axios from 'axios';
import { initTooltip } from "@/legacy/initTooltip";
import { TemplateEngine } from '@util/TemplateEngine';
import type { InvalidResponse } from '@/defs';
import { getDateTimeNow } from '@util/getDateTimeNow';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { loadPlugin as loadAdminPlugin } from '@/gateway/admin_server';
import { resolveGatewayOpenState } from '@/gateway/resolveGatewayOpenState';
import '@/gateway/common';
declare const isAdmin: boolean;
@@ -107,7 +109,7 @@ type ReservedGameInfo = {
type GameInfo = {
isUnited: number,
isOpen: boolean,
isOpen?: boolean,
npcMode: '불가' | '가능' | '선택 생성',
year: number,
month: number,
@@ -175,6 +177,7 @@ async function Entrance_UpdateServer() {
async function Entrance_drawServerList(serverInfos: ServerResponseItem[]) {
const $serverList = $('#server_list');
const now = getDateTimeNow();
const serverDetailInfoP: Record<string, Promise<ServerDetailResponse>> = {};
@@ -225,6 +228,8 @@ async function Entrance_drawServerList(serverInfos: ServerResponseItem[]) {
}
const game = response.game;
// 구버전 wall-clock profile은 isOpen을 아직 반환하지 않습니다.
const isOpen = resolveGatewayOpenState(game.isOpen, game.opentime, now);
//TODO: 서버 폐쇄 방식을 새롭게 변경
$serverHtml.find('.server_down').detach();
@@ -238,7 +243,7 @@ async function Entrance_drawServerList(serverInfos: ServerResponseItem[]) {
} else if (game.isUnited == 2) {
$serverHtml.find('.n_country').html('§천하통일§');
$serverHtml.find('.server_date').html(`${game.starttime} <br>~ ${game.turntime}`);
} else if (game.isOpen) {
} else if (isOpen) {
$serverHtml.find('.n_country').html(`<${game.nationCnt}국 경쟁중>`);
$serverHtml.find('.server_date').html(`${game.starttime} ~`);
} else {
@@ -246,7 +251,7 @@ async function Entrance_drawServerList(serverInfos: ServerResponseItem[]) {
$serverHtml.find('.server_date').html(`${game.starttime} ~`);
}
if (game.isOpen) {
if (isOpen) {
$serverHtml.append(
TemplateEngine(serverTextInfo, game)
);
@@ -0,0 +1,7 @@
export function resolveGatewayOpenState(
serverDecision: boolean | undefined,
openTime: string,
wallNow: string,
): boolean {
return serverDecision ?? openTime <= wallNow;
}