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:
19
CLAUDE.md
19
CLAUDE.md
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user