refactor: 단일 파일을 main/ui/download/protocol 4개 파일로 분리

- main.go: 진입점(main), handleURI, version
- ui.go: Win32 UI (progress window, DPI, 폰트, 메시지박스)
- download.go: 다운로드/추출 로직 (HTTP client, extractZip, doDownload)
- protocol.go: 레지스트리 등록/해제, ensureGame, ensureLauncher, 서버 API

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-18 17:11:41 +09:00
parent 8759587e25
commit 84dd2373a4
5 changed files with 1059 additions and 1099 deletions

View File

@@ -10,7 +10,7 @@ C:\Users\98kim\sdk\go1.25.1\bin\go.exe build -ldflags="-H windowsgui -s -w" -o l
## Tech Stack
- **Go** 단일 파일 (`main.go`)
- **Go** 4파일 구조 (`main.go`, `ui.go`, `download.go`, `protocol.go`)
- **Win32 API** — `user32.dll`, `gdi32.dll`, `comctl32.dll`, `uxtheme.dll`, `shell32.dll`
- `golang.org/x/sys/windows` + `windows/registry`
@@ -21,13 +21,18 @@ C:\Users\98kim\sdk\go1.25.1\bin\go.exe build -ldflags="-H windowsgui -s -w" -o l
## Architecture
모든 로직이 `main.go` 단일 파일에 있음:
역할별 4파일 구조:
- **`enableDPIAwareness()`** — `SetProcessDpiAwarenessContext(PER_MONITOR_AWARE_V2)` 호출. `main()` 첫 줄에서 실행.
| 파일 | 담당 |
|---|---|
| `main.go` | 진입점(`main`), 단일 인스턴스, `handleURI`, version |
| `ui.go` | Win32 DLL/proc 선언, WndProc, progress window, DPI, font, msgBox |
| `download.go` | HTTP 클라이언트, 다운로드/추출/해시, `ensureGame`, `ensureLauncher` |
| `protocol.go` | 상수, URI 프로토콜 등록/해제, `redeemTicket`, `fetchServerInfo` |
주요 함수:
- **`downloadWithProgress()`** — Win32 메시지 루프 직접 운영. 반드시 메인 고루틴에서 호출 (`runtime.LockOSThread`).
- **`progressWndProc()`** — `WM_CTLCOLORSTATIC`으로 다크 테마 적용. `hBrushBg` 전역 변수 참조.
- **`setProgress(text, pct)`** — 다운로드 고루틴에서 호출해 레이블 텍스트와 진행 막대 동시 업데이트.
- **`fetchServerInfo()`** — `https://a301.api.tolelom.xyz/api/download/info` 조회.
- **`fetchServerInfo()`** — 3회 재시도 (exponential backoff).
- **`ensureGame()`** — `A301.exe` SHA256 해시 비교 후 불일치 시 재다운로드.
## UI Details
@@ -50,7 +55,7 @@ protocolName = "a301" // 기술 식별자
- `install()` 시 런처를 `%LOCALAPPDATA%\A301\launcher.exe`로 복사 후 해당 경로를 레지스트리에 등록.
- 게임 파일(`A301.exe` 등)도 `%LOCALAPPDATA%\A301\`에 설치됨.
- 사용자가 원본 다운로드 파일을 삭제해도 프로토콜 핸들러가 정상 동작.
- 토큰은 명령줄이 아닌 `A301_TOKEN` 환경변수로 게임에 전달.
- 토큰은 커맨드라인(`-token`)과 `A301_TOKEN` 환경변수 양쪽으로 게임에 전달.
## Notes