import $ from 'jquery'; import axios from 'axios'; import { setAxiosXMLHttpRequest } from '../hwe/ts/util/setAxiosXMLHttpRequest'; import { InvalidResponse } from '../hwe/ts/defs'; import { convertFormData } from '../hwe/ts/util/convertFormData'; import { TemplateEngine } from "../hwe/ts/util/TemplateEngine"; import { unwrap_any } from '../hwe/ts/util/unwrap_any'; import { unwrap } from '../hwe/ts/util/unwrap'; type ServerUpdateResponse = { result: true, version: string, server: string, imgResult: false, } type ServerRootUpdateResponse = { result: true, version: string, server: string, imgResult: true, imgDetail: string, } type ServerStateItem = { name: string, korName: string, color: string, isRoot: boolean, lastGitPath: string, valid: boolean, run: boolean, installed: boolean, version: string, reason: string, status?: string, } type ServerStateResponse = { acl: Record, server: ServerStateItem[], grade: number, } type ServerChangeResponse = { result: true, installURL?: string, } const serverAdminTemplate = '\ \ <%korName%>(<%name%>)\ <%status%>\ <%version%>\ \ \ \ \ \ \ \ \ ';//TODO: npm install 관련 기능 추가, js/css output 경로 변경 declare global { interface Window { modifyServerStatus: (caller: HTMLElement, action: string) => void; Entrance_AdminClosedLogin: (caller: HTMLElement) => void; Entrance_AdminOpen119: (caller: HTMLElement) => void; serverUpdate: (caller: HTMLElement) => void; adminGrade: number; aclList: Record; } } async function serverUpdate(caller: HTMLElement) { const $caller = $(caller); const $tr = $caller.parents('tr'); const server = unwrap_any($tr.data('server_name')); let isRoot: string | boolean = unwrap_any($tr.data('is_root')); let target = $tr.data('gitPath'); if (typeof isRoot !== 'boolean') { isRoot = (isRoot != 'false'); } let allowFullUpdate = (server in window.aclList && window.aclList[server].indexOf('fullUpdate') >= 0); allowFullUpdate = allowFullUpdate || window.adminGrade > 5; let allowUpdate = (server in window.aclList && window.aclList[server].indexOf('update') >= 0); allowUpdate = allowUpdate || window.adminGrade >= 5; allowUpdate = allowUpdate || allowFullUpdate; if (!allowUpdate) { alert('권한이 없습니다!'); return; } if (allowFullUpdate) { target = prompt('가져올 git tree-ish 명을 입력해주세요.', target) if (!target) { return; } } else if (isRoot) { if (!confirm('서버 라이브러리, 루트 서버에 대해 git pull을 실행합니다.')) { return; } } else if (!confirm('다음 git tree-ish 주소로 업데이트를 시도합니다 : ' + target)) { return; } let result: InvalidResponse | ServerUpdateResponse | ServerRootUpdateResponse; try { const response = await axios({ url: '../j_updateServer.php', responseType: 'json', method: 'post', data: convertFormData({ server: server, target: target }) }); result = response.data; } catch (e) { console.error(e); alert(`에러: ${e}`); location.reload(); return; } if (!result.result) { alert(`실패했습니다: ${result.reason}`); return; } let aux = ''; if (result.imgResult) { aux = ` (이미지 서버 갱신:${result.imgResult}, ${result.imgDetail})`; } alert(`${result.server} 서버가 ${result.version} 버전으로 업데이트 되었습니다.${aux}`); } function drawServerAdminList(serverList: ServerStateResponse) { const $table = $('#server_admin_list'); const $showErrorLog = $('#showErrorLog'); if (serverList.grade >= 5) { $showErrorLog.show(); } $.each(serverList.server, function (idx, server) { console.log(server); let status: string; if (!server.valid) { status = `에러, ${server.reason}`; } else if (!server.run) { status = '폐쇄됨'; } else { status = '운영 중'; } server.status = status; const $tr = $(TemplateEngine(serverAdminTemplate, server)); $table.append($tr); if (serverList.grade < 4) { $tr.find('button').prop('disabled', true); } if (!server.valid) { $tr.find('.valid_if_set').prop('disabled', true); } if (!server.installed) { $tr.find('.valid_if_installed').prop('disabled', true); } const aclByServer = serverList.acl[server.name]; $.each(aclByServer, function (idx, action) { console.log(action); if (action == 'update' || action == 'fullUpdate') { if (!server.installed) { return true; } $tr.find('.serv_act_update').prop('disabled', false); $showErrorLog.show(); } else if (action == 'openClose') { if (!server.valid) { return true; } $tr.find('.serv_act_open, .serv_act_close').prop('disabled', false); } else if (action == 'reset') { if (!server.installed) { return true; } $tr.find('.serv_act_reset, .serv_act_close').prop('disabled', false); } }); }); window.adminGrade = serverList.grade; window.aclList = serverList.acl; if (serverList.grade <= 5) { $table.find('.only_admin').prop('disabled', true); } } export async function loadPlugin(): Promise { setAxiosXMLHttpRequest(); Entrance_AdminInit(); window.modifyServerStatus = modifyServerStatus; window.Entrance_AdminClosedLogin = Entrance_AdminClosedLogin; window.Entrance_AdminOpen119 = Entrance_AdminOpen119; window.serverUpdate = serverUpdate; const response = await axios({ url: 'j_server_get_admin_status.php', method: 'post', responseType: 'json' }); drawServerAdminList(response.data); } function Entrance_AdminInit() { console.log('adminInit'); $("#Entrance_000202").on('click', Entrance_Member); $("#notice_change_btn").on('click', Entrance_AdminChangeNotice); } function Entrance_Member(e: JQuery.Event) { e.preventDefault(); $("#Entrance_00").hide(); $("#EntranceMember_00").show(); } async function Entrance_AdminChangeNotice(e: JQuery.Event) { e.preventDefault(); const notice = unwrap_any($("#notice_edit").val()); if (!confirm('정말 실행하시겠습니까?')) { return; } let result: InvalidResponse | ServerChangeResponse; try { const response = await axios({ url: 'j_server_change_status.php', method: 'post', responseType: 'json', data: convertFormData({ action: 'notice', notice: notice }) }); result = response.data; } catch (e) { console.error(e); alert(`실패했습니다: ${e}`); return; } if (!result.result) { alert(`실패했습니다: ${result.reason}`); return; } location.reload(); } async function modifyServerStatus(caller: HTMLElement, action: string) { const $caller = $(caller); const server = unwrap_any($caller.parents('tr').data('server_name')); if (!confirm('정말 실행하시겠습니까?')) { return; } let result: InvalidResponse | ServerChangeResponse; try { const response = await axios({ url: 'j_server_change_status.php', method: 'post', responseType: 'json', data: convertFormData({ server: server, action: action }) }); result = response.data; } catch (e) { console.error(e); alert(`실패했습니다: ${e}`); return; } if (!result.result) { alert(`실패했습니다: ${result.reason}`); return; } if (action == 'reset') { location.href = unwrap(result.installURL); } else { location.reload(); } } function Entrance_AdminClosedLogin(caller: HTMLElement) { const $caller = $(caller); const serverDir = $caller.parents('tr').data('server_name'); location.href = serverDir + "/npc_login.php"; } function Entrance_AdminOpen119(caller: HTMLElement) { const $caller = $(caller); const serverDir = $caller.parents('tr').data('server_name'); location.href = `../${serverDir}/_119.php`; }