diff --git a/installer/renderer.js b/installer/renderer.js index 72bd6d2..7fa53e7 100644 --- a/installer/renderer.js +++ b/installer/renderer.js @@ -431,32 +431,46 @@ function renderSubStep35(host, back, done) { '

3-5. 포트포워딩 점검

' + '

서버의 외부 접근 가능 여부를 확인합니다. UPnP를 시도해도 안 되면 직접 포트포워딩을 안내합니다.

' + '
' + - '' + + '' + '
' + '
' var resultMsg = host.querySelector('#resultMsg') var nextBtn = host.querySelector('#next') - if (state.serverInstall.portStatus) nextBtn.disabled = false + var runBtn = host.querySelector('#run') host.querySelector('#back').addEventListener('click', back) - host.querySelector('#run').addEventListener('click', async function () { - var port = Number(host.querySelector('#port').value) || 25565 + + async function runCheck() { + runBtn.disabled = true + resultMsg.classList.remove('success', 'warn', 'error') resultMsg.textContent = '확인 중...' - var result = await installerApi.checkPortForward(port) - state.serverInstall.portStatus = result - if (result.status === 'preForwarded') { - resultMsg.innerHTML = '이미 외부 접속 가능: ' + result.externalIp + ':' + result.port - resultMsg.classList.add('success') - } else if (result.status === 'upnpOk') { - resultMsg.innerHTML = 'UPnP로 자동 개방 완료: ' + result.externalIp + ':' + result.port - resultMsg.classList.add('success') - } else { - resultMsg.innerHTML = (result.message || '직접 포트포워딩을 해주세요.') + - '
외부 IP: ' + (result.externalIp || '확인 불가') + ', 포트: ' + result.port + '' - resultMsg.classList.add('warn') + var port = Number(host.querySelector('#port').value) || 25565 + try { + var result = await installerApi.checkPortForward(port) + state.serverInstall.portStatus = result + if (result.status === 'preForwarded') { + resultMsg.innerHTML = '이미 외부 접속 가능: ' + result.externalIp + ':' + result.port + resultMsg.classList.add('success') + } else if (result.status === 'upnpOk') { + resultMsg.innerHTML = 'UPnP로 자동 개방 완료: ' + result.externalIp + ':' + result.port + resultMsg.classList.add('success') + } else { + resultMsg.innerHTML = (result.message || '직접 포트포워딩을 해주세요.') + + '
외부 IP: ' + (result.externalIp || '확인 불가') + ', 포트: ' + result.port + '' + resultMsg.classList.add('warn') + } + nextBtn.disabled = false + } catch (err) { + resultMsg.textContent = '점검 실패: ' + (err && err.message ? err.message : err) + resultMsg.classList.add('error') + } finally { + runBtn.disabled = false } - nextBtn.disabled = false - }) + } + + runBtn.addEventListener('click', runCheck) nextBtn.addEventListener('click', done) + // 페이지 진입 즉시 자동 점검 + runCheck() } function renderStep4() { @@ -537,18 +551,23 @@ function renderSubStep42(host, back, done) { host.innerHTML = '

4-2. 모드/리소스팩 다운로드 및 launcher_profiles 갱신

' + '

%appdata%\\.mc_custom 에 모드와 리소스팩을 설치하고, launcher_profiles.json에 프로필을 등록합니다.

' + - '' + - '
' + + '
설치 중...
' + '
' - var runBtn = host.querySelector('#run') var msg = host.querySelector('#msg') var nextBtn = host.querySelector('#next') - if (state.client.clientInstalled) nextBtn.disabled = false host.querySelector('#back').addEventListener('click', back) - runBtn.addEventListener('click', async function () { - runBtn.disabled = true - msg.textContent = '설치 중...' - msg.classList.remove('error', 'success') + nextBtn.addEventListener('click', done) + + // 이미 설치됐다면 다시 돌리지 않음 + if (state.client.clientInstalled) { + msg.textContent = '클라이언트 설치 완료.' + msg.classList.add('success') + nextBtn.disabled = false + return + } + + // 페이지 진입 즉시 자동 설치 + ;(async function () { try { await installerApi.installClient({ packKey: state.selectedPackKey, @@ -559,12 +578,10 @@ function renderSubStep42(host, back, done) { state.client.clientInstalled = true nextBtn.disabled = false } catch (err) { - msg.textContent = '설치 실패: ' + err.message + msg.textContent = '설치 실패: ' + (err && err.message ? err.message : err) msg.classList.add('error') - runBtn.disabled = false } - }) - nextBtn.addEventListener('click', done) + })() } function renderSubStep43(host, back, done) {