diff --git a/hwe/ts/common_legacy.ts b/hwe/ts/common_legacy.ts index e8b6dfee..d03ffe21 100644 --- a/hwe/ts/common_legacy.ts +++ b/hwe/ts/common_legacy.ts @@ -206,10 +206,11 @@ export function linkifyStrWithOpt(text: string): string { export function TemplateEngine(html: string, options: Record = {}): string { const re = /<%(.+?)%>/g; const reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g; + const code = ['with(obj) { var r=[];\n']; let cursor = 0; const add = function (line: string, js?: boolean) { - js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : - (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); + js ? code.push(line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : + code.push(line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); return add; } options.e = escapeHtml; @@ -224,10 +225,10 @@ export function TemplateEngine(html: string, options: Record\");background-size: 64px 64px;'>\ +<%name%>\ +\ +\ +\ +"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const serverReservedTemplate = "\ +\ +<%openDatetime==starttime?'':'- 가오픈 일시 : '+openDatetime+ '-
'%>\ +- 오픈 일시 : <%starttime%> -
\ +<%scenarioName%> <%turnterm%>분 턴 서버
\ +(상성 설정:<%fictionMode%>), (빙의 여부:<%npcMode%>), (최대 스탯:<%gameConf.defaultStatTotal%>), (기타 설정:<%otherTextInfo%>)\ +\ +"; + +type ServerResponseItem = { + color: string, + korName: string, + name: string, + exists: boolean, + enable: boolean, +}; + +type ServerResponse = { + result: true; + reason: 'success'; + server: ServerResponseItem[]; +} + +type RawServerResponse = InvalidResponse | ServerResponse; + +type ReservedGameInfo = { + scenarioName: string, + turnterm: number, + fictionMode: '가상' | '사실', + block_general_create: boolean, + npcMode: '불가' | '가능' | '선택 생성', + openDatetime: string, + starttime: string, + gameConf: Record, + otherTextInfo: string, +} + +type GameInfo = { + isUnited: number, + npcMode: '불가' | '가능' | '선택 생성', + year: number, + month: number, + scenario: string, + maxUserCnt: number, + turnTerm: number, + opentime: string, + starttime: string, + turntime: string, + join_mode: string, + fictionMode: '가상' | '사실', + block_general_create: boolean, + autorun_user: string, + userCnt: number, + npcCnt: number, + nationCnt: number, + otherTextInfo: string, + defaultStatTotal: number, +} + +type MyInfo = { + name: string, + picture: string, + serverPath?: string, +} + +type ServerDetailResponse = { + reserved?: ReservedGameInfo; + game: GameInfo; + me: MyInfo | null | undefined; +} + +$(function ($) { + setAxiosXMLHttpRequest(); + $("#btn_logout").on('click', Entrance_Logout); + void Entrance_UpdateServer(); +}); + +async function Entrance_UpdateServer() { + let data: RawServerResponse; + + try { + const response = await axios({ + url: 'j_server_get_status.php', + responseType: 'json', + method: 'post' + }); + data = response.data; + } + catch (e) { + alert(e); + return; + } + + if (!data.result) { + alert(data.reason); + return; + } + + await Entrance_drawServerList(data.server); +} + +async function Entrance_drawServerList(serverInfos: ServerResponseItem[]) { + const $serverList = $('#server_list'); + const now = getDateTimeNow(); + + const serverDetailInfoP: Record> = {}; + + for (const serverInfo of serverInfos) { + if(!serverInfo.exists){ + continue; + } + const responseP = axios({ + url: `../${serverInfo.name}/j_server_basic_info.php`, + method: 'get', + responseType: 'json' + }).then(v=>{ + return v.data as ServerDetailResponse; + }); + serverDetailInfoP[serverInfo.name] = responseP; + } + for (const serverInfo of serverInfos) { + const $serverHtml = $(TemplateEngine(serverListTemplate, serverInfo)); + $serverList.append($serverHtml); + if (!serverInfo.exists) { + continue; + } + + const serverPath = `../${serverInfo.name}`; + + let response: ServerDetailResponse; + try{ + if(!(serverInfo.name in serverDetailInfoP)){ + continue; + } + response = await serverDetailInfoP[serverInfo.name]; + } + catch(e){ + console.error(e); + continue; + } + + if(!response.game){ + continue; + } + + const game = response.game; + + //TODO: 서버 폐쇄 방식을 새롭게 변경 + $serverHtml.find('.server_down').detach(); + + if (game.isUnited == 3) { + $serverHtml.find('.n_country').html('§이벤트 종료§'); + $serverHtml.find('.server_date').html('{0}
~ {1}'.format(game.starttime, game.turntime)); + } else if (game.isUnited == 1) { + $serverHtml.find('.n_country').html('§이벤트 진행중§'); + $serverHtml.find('.server_date').html('{0} ~'.format(game.starttime)); + } else if (game.isUnited == 2) { + $serverHtml.find('.n_country').html('§천하통일§'); + $serverHtml.find('.server_date').html('{0}
~ {1}'.format(game.starttime, game.turntime)); + } else if (game.opentime <= now) { + $serverHtml.find('.n_country').html('<{0}국 경쟁중>'.format(game.nationCnt)); + $serverHtml.find('.server_date').html('{0} ~'.format(game.starttime)); + } else { + $serverHtml.find('.n_country').html('-가오픈 중-'); + $serverHtml.find('.server_date').html('{0} ~'.format(game.starttime)); + } + + if (game.opentime <= now) { + $serverHtml.append( + TemplateEngine(serverTextInfo, game) + ); + } else { + $serverHtml.append( + TemplateEngine(serverProvisionalInfo, game) + ); + } + + if (response.me && response.me.name) { + const me = response.me; + me.serverPath = serverPath; + $serverHtml.append( + TemplateEngine(serverLoginTemplate, me) + ); + } else if (game.userCnt >= game.maxUserCnt) { + $serverHtml.append( + TemplateEngine(serverFullTemplate, {}) + ); + } else { + $serverHtml.append( + TemplateEngine(serverCreateTemplate, { + serverPath: serverPath, + canCreate: !game.block_general_create, + canSelectNPC: game.npcMode == '가능', + canSelectPool: game.npcMode == '선택 생성' + }) + ) + } + initTooltip($serverHtml); + } +} + +async function Entrance_Logout() { + const response = await axios({ + url: 'j_logout.php', + method: 'post', + responseType: 'json' + }); + + const data: InvalidResponse = response.data; + if(!data.result){ + alert(`로그아웃 실패: ${data.reason}`); + return; + } + location.href = "../"; +} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 5c592e54..c300bd31 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -85,7 +85,8 @@ module.exports = [ extensions: [".js", ".ts", ".tsx"] }, entry: { - 'common': './ts/common_deprecated.ts' + 'common': './ts/common_deprecated.ts', + 'entrance': './ts/entrance.ts', //test: './ts/test.ts', }, output: {