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) {