fix: support mixed wall and game clock servers
This commit is contained in:
@@ -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']);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user