Skip to content

Commit 597d831

Browse files
committed
refactor: consolidate game data to AppData directory
1 parent 57c82ce commit 597d831

File tree

8 files changed

+141
-130
lines changed

8 files changed

+141
-130
lines changed

build/windows/nsis/project.nsi

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,8 @@ Var LogFileHandle
8888
Var RoamingPath
8989
Var LocalPath
9090
Var ConfigPath
91-
Var UninstallCleanRoamingCheckbox
92-
Var UninstallCleanLocalCheckbox
9391
Var UninstallCleanBaseRootCheckbox
9492
Var UninstallCleanBackupCheckbox
95-
Var UninstallCleanRoamingFlag
96-
Var UninstallCleanLocalFlag
9793
Var UninstallCleanBaseRootFlag
9894
Var UninstallCleanBackupFlag
9995
Var BaseRootLabel
@@ -104,18 +100,20 @@ LangString LBL_Roaming ${LANG_ENGLISH} "Roaming: $RoamingPath"
104100
LangString LBL_Roaming ${LANG_SIMPCHINESE} "Roaming:$RoamingPath"
105101
LangString CHK_RemoveRoaming ${LANG_ENGLISH} "Remove Roaming data"
106102
LangString CHK_RemoveRoaming ${LANG_SIMPCHINESE} "删除漫游数据"
107-
LangString LBL_Local ${LANG_ENGLISH} "Local: $LocalPath"
108-
LangString LBL_Local ${LANG_SIMPCHINESE} "Local:$LocalPath"
109-
LangString CHK_RemoveLocal ${LANG_ENGLISH} "Remove Local data (config.json + bin)"
110-
LangString CHK_RemoveLocal ${LANG_SIMPCHINESE} "删除Local数据(config.json + bin)"
103+
LangString LBL_Local ${LANG_ENGLISH} "Roaming: $LocalPath"
104+
LangString LBL_Local ${LANG_SIMPCHINESE} "漫游:$LocalPath"
105+
LangString CHK_RemoveLocal ${LANG_ENGLISH} "Remove Roaming data (config.json + bin)"
106+
LangString CHK_RemoveLocal ${LANG_SIMPCHINESE} "删除漫游数据(config.json + bin)"
111107
LangString LBL_BaseRoot ${LANG_ENGLISH} "BaseRoot: $BaseRoot"
112108
LangString LBL_BaseRoot ${LANG_SIMPCHINESE} "BaseRoot:$BaseRoot"
113109
LangString BTN_ResolveBaseRoot ${LANG_ENGLISH} "Resolve BaseRoot"
114110
LangString BTN_ResolveBaseRoot ${LANG_SIMPCHINESE} "解析 BaseRoot"
115-
LangString CHK_RemoveBaseRoot ${LANG_ENGLISH} "Remove BaseRoot"
116-
LangString CHK_RemoveBaseRoot ${LANG_SIMPCHINESE} "删除 BaseRoot"
117-
LangString CHK_RemoveBackup ${LANG_ENGLISH} "Remove Backup"
118-
LangString CHK_RemoveBackup ${LANG_SIMPCHINESE} "删除备份"
111+
LangString TIP_ResolveFirst ${LANG_ENGLISH} "Tip: Click 'Resolve BaseRoot' first if you want to delete data."
112+
LangString TIP_ResolveFirst ${LANG_SIMPCHINESE} "提示:如需删除数据,请先点击上方的“解析 BaseRoot”按钮。"
113+
LangString CHK_RemoveBaseRoot ${LANG_ENGLISH} "Remove installers and versions"
114+
LangString CHK_RemoveBaseRoot ${LANG_SIMPCHINESE} "删除 installers 和 versions"
115+
LangString CHK_RemoveBackup ${LANG_ENGLISH} "Remove backups (save backups)"
116+
LangString CHK_RemoveBackup ${LANG_SIMPCHINESE} "删除备份(存档备份)"
119117
LangString MSG_ConfirmBaseRoot ${LANG_ENGLISH} "Removing installers and versions under BaseRoot will delete downloaded versions and installers. Continue?"
120118
LangString MSG_ConfirmBaseRoot ${LANG_SIMPCHINESE} "删除 BaseRoot 下的 installers 和 versions 将删除已下载的版本与安装包。是否继续?"
121119
LangString MSG_ConfirmBackup ${LANG_ENGLISH} "Removing Backup will delete all backups under BaseRoot. Continue?"
@@ -130,8 +128,8 @@ LangString TXT_UninstallStart ${LANG_ENGLISH} "Uninstall section start"
130128
LangString TXT_UninstallStart ${LANG_SIMPCHINESE} "开始卸载"
131129
LangString TXT_RoamingPath ${LANG_ENGLISH} "Roaming path: $RoamingPath"
132130
LangString TXT_RoamingPath ${LANG_SIMPCHINESE} "漫游路径:$RoamingPath"
133-
LangString TXT_LocalPath ${LANG_ENGLISH} "Local path: $LocalPath"
134-
LangString TXT_LocalPath ${LANG_SIMPCHINESE} "本地路径:$LocalPath"
131+
LangString TXT_LocalPath ${LANG_ENGLISH} "Roaming path: $LocalPath"
132+
LangString TXT_LocalPath ${LANG_SIMPCHINESE} "漫游路径:$LocalPath"
135133
LangString TXT_ConfigPath ${LANG_ENGLISH} "Config path: $ConfigPath"
136134
LangString TXT_ConfigPath ${LANG_SIMPCHINESE} "配置路径:$ConfigPath"
137135
LangString TXT_BaseRoot ${LANG_ENGLISH} "BaseRoot: $BaseRoot"
@@ -150,12 +148,12 @@ LangString TXT_RemoveBackup ${LANG_ENGLISH} "Remove Backup: $BaseRoot\\backups"
150148
LangString TXT_RemoveBackup ${LANG_SIMPCHINESE} "删除备份:$BaseRoot\\backups"
151149
LangString TXT_BackupErr ${LANG_ENGLISH} "Backup removal error"
152150
LangString TXT_BackupErr ${LANG_SIMPCHINESE} "删除备份出错"
153-
LangString TXT_RemoveLocalMatch ${LANG_ENGLISH} "Remove Local directory (matches BaseRoot)"
154-
LangString TXT_RemoveLocalMatch ${LANG_SIMPCHINESE} "删除本地目录(与 BaseRoot 相同)"
155-
LangString TXT_LocalDirErr ${LANG_ENGLISH} "Local directory removal error"
156-
LangString TXT_LocalDirErr ${LANG_SIMPCHINESE} "删除本地目录出错"
157-
LangString TXT_RemoveLocalParts ${LANG_ENGLISH} "Remove Local parts (config.json + bin)"
158-
LangString TXT_RemoveLocalParts ${LANG_SIMPCHINESE} "删除本地部分(config.json + bin)"
151+
LangString TXT_RemoveLocalMatch ${LANG_ENGLISH} "Remove Roaming directory (matches BaseRoot)"
152+
LangString TXT_RemoveLocalMatch ${LANG_SIMPCHINESE} "删除漫游目录(与 BaseRoot 相同)"
153+
LangString TXT_LocalDirErr ${LANG_ENGLISH} "Roaming directory removal error"
154+
LangString TXT_LocalDirErr ${LANG_SIMPCHINESE} "删除漫游目录出错"
155+
LangString TXT_RemoveLocalParts ${LANG_ENGLISH} "Remove Roaming parts (config.json + bin)"
156+
LangString TXT_RemoveLocalParts ${LANG_SIMPCHINESE} "删除漫游部分(config.json + bin)"
159157
LangString TXT_ConfigErr ${LANG_ENGLISH} "Delete config.json error"
160158
LangString TXT_ConfigErr ${LANG_SIMPCHINESE} "删除 config.json 出错"
161159
LangString TXT_BinErr ${LANG_ENGLISH} "Remove bin error"
@@ -177,31 +175,26 @@ FunctionEnd
177175

178176
Function un.customPage
179177
SetShellVarContext current
180-
StrCpy $RoamingPath "$APPDATA\${INFO_PRODUCTNAME}"
181-
StrCpy $LocalPath "$LOCALAPPDATA\${INFO_PRODUCTNAME}"
182-
StrCpy $ConfigPath "$LOCALAPPDATA\${INFO_PRODUCTNAME}\config.json"
178+
StrCpy $RoamingPath "$APPDATA\${PRODUCT_EXECUTABLE}"
179+
StrCpy $LocalPath "$APPDATA\${PRODUCT_EXECUTABLE}"
180+
StrCpy $ConfigPath "$APPDATA\${PRODUCT_EXECUTABLE}\config.json"
183181
StrCpy $BaseRoot ""
184182

185183
nsDialogs::Create 1018
186184
Pop $0
187-
${NSD_CreateLabel} 0u 0u 100% 10u "$(LBL_Roaming)"
188-
${NSD_CreateCheckbox} 0u 12u 100% 12u "$(CHK_RemoveRoaming)"
189-
Pop $UninstallCleanRoamingCheckbox
190-
${NSD_SetState} $UninstallCleanRoamingCheckbox 1
191-
${NSD_CreateLabel} 0u 28u 100% 10u "$(LBL_Local)"
192-
${NSD_CreateCheckbox} 0u 40u 100% 12u "$(CHK_RemoveLocal)"
193-
Pop $UninstallCleanLocalCheckbox
185+
194186
${NSD_CreateLabel} 0u 56u 100% 10u "$(LBL_BaseRoot)"
195187
Pop $BaseRootLabel
196188
${NSD_CreateButton} 0u 68u 40% 12u "$(BTN_ResolveBaseRoot)"
197189
Pop $ResolveBaseRootButton
198190
${NSD_OnClick} $ResolveBaseRootButton un.resolveBaseRoot
199-
${NSD_CreateCheckbox} 0u 84u 100% 12u "$(CHK_RemoveBaseRoot)"
191+
${NSD_CreateLabel} 0u 84u 100% 10u "$(TIP_ResolveFirst)"
192+
${NSD_CreateCheckbox} 0u 98u 100% 12u "$(CHK_RemoveBaseRoot)"
200193
Pop $UninstallCleanBaseRootCheckbox
201194
${NSD_OnClick} $UninstallCleanBaseRootCheckbox un.onBaseRootCheckboxClick
202195
StrCmp $BaseRoot "" 0 +2
203196
EnableWindow $UninstallCleanBaseRootCheckbox 0
204-
${NSD_CreateCheckbox} 0u 100u 100% 12u "$(CHK_RemoveBackup)"
197+
${NSD_CreateCheckbox} 0u 114u 100% 12u "$(CHK_RemoveBackup)"
205198
Pop $UninstallCleanBackupCheckbox
206199
${NSD_OnClick} $UninstallCleanBackupCheckbox un.onBackupCheckboxClick
207200
StrCmp $BaseRoot "" 0 +2
@@ -211,12 +204,12 @@ FunctionEnd
211204

212205
Function un.resolveBaseRoot
213206
SetShellVarContext current
214-
StrCpy $ConfigPath "$LOCALAPPDATA\${INFO_PRODUCTNAME}\config.json"
207+
StrCpy $ConfigPath "$APPDATA\${PRODUCT_EXECUTABLE}\config.json"
215208
StrCpy $BaseRoot ""
216209
IfFileExists "$ConfigPath" 0 endResolve
217210
InitPluginsDir
218211
FileOpen $1 "$pluginsdir\read-base-root.ps1" w
219-
FileWrite $1 "$$path = Join-Path $$env:LOCALAPPDATA '${INFO_PRODUCTNAME}\\config.json'$\r$\n"
212+
FileWrite $1 "$$path = Join-Path $$env:APPDATA '${PRODUCT_EXECUTABLE}\\config.json'$\r$\n"
220213
FileWrite $1 "if (Test-Path -LiteralPath $$path) {$\r$\n"
221214
FileWrite $1 " try { $$cfg = Get-Content -Raw -Encoding UTF8 $$path | ConvertFrom-Json; [Console]::Write(([string]$$cfg.base_root).Trim()) } catch { }$\r$\n"
222215
FileWrite $1 "}$\r$\n"
@@ -299,8 +292,6 @@ Function un.FastRemoveDir
299292
FunctionEnd
300293

301294
Function un.customPageLeave
302-
${NSD_GetState} $UninstallCleanRoamingCheckbox $UninstallCleanRoamingFlag
303-
${NSD_GetState} $UninstallCleanLocalCheckbox $UninstallCleanLocalFlag
304295
${NSD_GetState} $UninstallCleanBaseRootCheckbox $UninstallCleanBaseRootFlag
305296
${NSD_GetState} $UninstallCleanBackupCheckbox $UninstallCleanBackupFlag
306297
FunctionEnd
@@ -359,12 +350,7 @@ Section "uninstall"
359350
FileWrite $LogFileHandle "Config: $ConfigPath\r\n"
360351
FileWrite $LogFileHandle "BaseRoot: $BaseRoot\r\n"
361352

362-
${If} $UninstallCleanRoamingFlag == 1
363-
DetailPrint "$(TXT_RemoveRoaming)"
364-
RMDir /r "$RoamingPath"
365-
IfErrors 0 +2
366-
DetailPrint "$(TXT_RoamingErr)"
367-
${EndIf}
353+
368354

369355
${If} $UninstallCleanBaseRootFlag == 1
370356
DetailPrint "$(TXT_RemoveBaseSubs)"
@@ -386,15 +372,19 @@ Section "uninstall"
386372
DetailPrint "$(TXT_BackupErr)"
387373
${EndIf}
388374

389-
${If} $UninstallCleanLocalFlag == 1
390-
DetailPrint "$(TXT_RemoveLocalParts)"
391-
Delete "$LocalPath\config.json"
392-
IfErrors 0 +2
393-
DetailPrint "$(TXT_ConfigErr)"
394-
RMDir /r "$LocalPath\bin"
395-
IfErrors 0 +2
396-
DetailPrint "$(TXT_BinErr)"
397-
${EndIf}
375+
376+
DetailPrint "$(TXT_RemoveLocalParts)"
377+
Delete "$LocalPath\config.json"
378+
IfErrors 0 +2
379+
DetailPrint "$(TXT_ConfigErr)"
380+
Push "$LocalPath\EBWebView"
381+
Call un.FastRemoveDir
382+
Push "$LocalPath\bin"
383+
Call un.FastRemoveDir
384+
IfFileExists "$LocalPath\bin" 0 +2
385+
DetailPrint "$(TXT_BinErr)"
386+
387+
RMDir "$LocalPath"
398388

399389
SetShellVarContext all
400390

frontend/src/assets/locales/en_US.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
"download_versions": "Install Release/Preview on the Download page; it appears in the dropdown afterward.",
109109
"content_counts_card": "The Content card shows counts of worlds, resource and behavior packs.",
110110
"file_manager_pick": "File Manager supports multi-select and returns paths to Mods import.",
111-
"settings_base_root": "Settings lets you change content base path; default %LOCALAPPDATA%\\LeviLauncher.",
111+
"settings_base_root": "Settings lets you change the content base path; default %APPDATA%\\<current executable name>.",
112112
"directory_write_check": "Save only to writable directories; non-writable directories are disabled.",
113113
"drag_import_unsupported": "Drag-and-drop import is unsupported; use Import .zip/.dll or File Manager."
114114
}

frontend/src/assets/locales/zh_CN.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@
109109
"download_versions": "在“下载”页安装 Release/Preview,安装后出现在下拉列表。",
110110
"content_counts_card": "主页“内容管理”显示世界、资源包、行为包数量。",
111111
"file_manager_pick": "文件管理器支持多选并回传路径到 Mods 导入。",
112-
"settings_base_root": "设置页可修改内容存储路径,默认使用 %LOCALAPPDATA%\\LeviLauncher",
112+
"settings_base_root": "设置页可修改内容存储路径,默认使用 %APPDATA% 下以当前可执行文件名命名的文件夹",
113113
"directory_write_check": "仅可保存到可写目录;不可写目录将被禁用。",
114114
"drag_import_unsupported": "拖拽导入暂不支持,请使用“导入 .zip/.dll”或文件管理器。"
115115
}

frontend/src/pages/LauncherPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export const LauncherPage = (args: any) => {
106106
defaultValue: "主页“内容管理”显示世界、资源包、行为包数量。",
107107
}) as unknown as string,
108108
t("launcherpage.tip.settings_base_root", {
109-
defaultValue: "设置页可修改内容存储路径,默认使用 %LOCALAPPDATA%\\LeviLauncher。",
109+
defaultValue: "设置页可修改内容存储路径,默认使用 %APPDATA% 下以当前可执行文件名命名的文件夹。",
110110
}) as unknown as string,
111111
t("launcherpage.tip.directory_write_check", {
112112
defaultValue: "仅可保存到可写目录;不可写目录将被禁用。",

internal/config/config.go

Lines changed: 65 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,87 @@
11
package config
22

33
import (
4-
"encoding/json"
5-
"os"
6-
"path/filepath"
7-
"strings"
4+
"encoding/json"
5+
"os"
6+
"path/filepath"
7+
"strings"
88
)
99

1010
type AppConfig struct {
11-
BaseRoot string `json:"base_root"`
11+
BaseRoot string `json:"base_root"`
1212
}
1313

1414
func localAppData() string {
15-
if v := os.Getenv("LOCALAPPDATA"); strings.TrimSpace(v) != "" {
16-
return v
17-
}
18-
if v, _ := os.UserCacheDir(); strings.TrimSpace(v) != "" {
19-
return v
20-
}
21-
return "."
15+
if v := os.Getenv("APPDATA"); strings.TrimSpace(v) != "" {
16+
return v
17+
}
18+
if v, _ := os.UserCacheDir(); strings.TrimSpace(v) != "" {
19+
return v
20+
}
21+
return "."
2222
}
2323

2424
func configPath() string {
25-
base := filepath.Join(localAppData(), "LeviLauncher")
26-
_ = os.MkdirAll(base, 0o755)
27-
return filepath.Join(base, "config.json")
25+
exeName := func() string {
26+
if exe, err := os.Executable(); err == nil {
27+
b := strings.TrimSpace(filepath.Base(exe))
28+
if b != "" {
29+
return strings.ToLower(b)
30+
}
31+
}
32+
return "levilauncher.exe"
33+
}()
34+
base := filepath.Join(localAppData(), exeName)
35+
_ = os.MkdirAll(base, 0o755)
36+
return filepath.Join(base, "config.json")
37+
}
38+
39+
func oldConfigPath() string {
40+
la := strings.TrimSpace(os.Getenv("LOCALAPPDATA"))
41+
if la == "" {
42+
return ""
43+
}
44+
p := filepath.Join(la, "levilauncher", "config.json")
45+
if _, err := os.Stat(p); err == nil {
46+
return p
47+
}
48+
p2 := filepath.Join(la, "LeviLauncher", "config.json")
49+
if _, err := os.Stat(p2); err == nil {
50+
return p2
51+
}
52+
return ""
2853
}
2954

3055
func Load() (AppConfig, error) {
31-
var c AppConfig
32-
p := configPath()
33-
b, err := os.ReadFile(p)
34-
if err != nil {
35-
return c, nil
36-
}
37-
_ = json.Unmarshal(b, &c)
38-
return c, nil
56+
var c AppConfig
57+
p := configPath()
58+
if b, err := os.ReadFile(p); err == nil {
59+
_ = json.Unmarshal(b, &c)
60+
return c, nil
61+
}
62+
_ = os.MkdirAll(filepath.Dir(p), 0o755)
63+
if old := oldConfigPath(); old != "" {
64+
if ob, err := os.ReadFile(old); err == nil {
65+
_ = json.Unmarshal(ob, &c)
66+
_ = os.WriteFile(p, ob, 0o644)
67+
return c, nil
68+
}
69+
}
70+
db, _ := json.MarshalIndent(c, "", " ")
71+
_ = os.WriteFile(p, db, 0o644)
72+
return c, nil
3973
}
4074

4175
func Save(c AppConfig) error {
42-
p := configPath()
43-
b, err := json.MarshalIndent(c, "", " ")
44-
if err != nil {
45-
return err
46-
}
47-
return os.WriteFile(p, b, 0o644)
76+
p := configPath()
77+
b, err := json.MarshalIndent(c, "", " ")
78+
if err != nil {
79+
return err
80+
}
81+
return os.WriteFile(p, b, 0o644)
4882
}
4983

5084
func GetBaseRootOverride() string {
51-
c, _ := Load()
52-
return strings.TrimSpace(c.BaseRoot)
85+
c, _ := Load()
86+
return strings.TrimSpace(c.BaseRoot)
5387
}

0 commit comments

Comments
 (0)