diff --git a/config/config.go b/config/config.go index 4d187ca..0722663 100644 --- a/config/config.go +++ b/config/config.go @@ -23,27 +23,8 @@ type AppConfigs struct { } type Settings struct { - ListenPort string `json:"listen_port"` - CdnServer string `json:"cdn_server"` - BackupCdnServer string `json:"backup_cdn_server"` - OverrideServerConfig OverrideServerConfig `json:"override_server_config"` - OverrideFileSize []OverrideFileSize `json:"override_file_size"` -} - -type OverrideServerConfig struct { - Enable bool `json:"enable"` - Android OverrideFileSource `json:"android"` - IOS OverrideFileSource `json:"ios"` -} - -type OverrideFileSource struct { - URL string `json:"url"` - Size int `json:"size"` -} - -type OverrideFileSize struct { - TargetOs string `json:"target_os"` - FileName string `json:"file_name"` + ListenPort string `json:"listen_port"` + CdnServer string `json:"cdn_server"` } func InitConfig() { @@ -54,21 +35,8 @@ func DefaultConfigs() *AppConfigs { return &AppConfigs{ AppName: "honoka-chan", Settings: Settings{ - ListenPort: "8080", - CdnServer: "http://127.0.0.1:8080/static", - BackupCdnServer: "", - OverrideFileSize: []OverrideFileSize{}, - OverrideServerConfig: OverrideServerConfig{ - Enable: false, - Android: OverrideFileSource{ - URL: "", - Size: 0, - }, - IOS: OverrideFileSource{ - URL: "", - Size: 0, - }, - }, + ListenPort: "8080", + CdnServer: "http://127.0.0.1:8080/static", }, } } diff --git a/doc/4.md b/doc/4.md index 0c433e4..fdd9127 100644 --- a/doc/4.md +++ b/doc/4.md @@ -4,52 +4,7 @@ 启动游戏,查看 `honoka-chan` 窗口输出,第一次运行会生成配置文件 `config.json`。打开该文件,设置好 `sif_cdn_server`,如果你是按前面的操作,数据都放在本程序的 `static` 目录下的话,那就改成你的服务器地址+`static` 就行,类似默认生成的 `http://192.168.1.123/static`。如果你有自己的服务器存放更新数据,设置成相应地址即可。 -`99_0_115.zip` 不是必选包。服务端会先尝试请求该文件,只有确认可访问时才会把它加入下载列表;请求不到就跳过,不影响数据库里的原始下载列表。 - -如果你需要改成其他地址(例如不走 `cdn_server`),可以启用 `settings.override_server_config`。该配置固定用于 `99_0_115.zip`,分别设置 Android 和 iOS 的下载地址与大小: - -```json -{ - "settings": { - "override_server_config": { - "enable": true, - "android": { - "url": "http://your-host.example.com/Android/archives/99_0_115.zip", - "size": 0 - }, - "ios": { - "url": "http://your-host.example.com/iOS/archives/99_0_115.zip", - "size": 0 - } - } - } -} -``` - -`url` 为下载地址,仅支持 HTTP 协议。 - -`size` 可选,填 `0` 会在服务端请求该 URL 自动探测文件大小;如果你已知大小,建议直接填写可减少请求开销。 - -启用覆盖配置后,会优先使用你填写的 `url`。如果该地址请求失败,`99_0_115.zip` 同样不会被下发,也不会再回退到 `cdn_server`。 - -如果第三方 CDN 上某些包实际文件大小与数据库 `pkg_size` 不一致(例如 `99_0_113.zip`),可以使用 `settings.override_file_size` 覆盖返回给客户端的大小(不改数据库): - -```json -{ - "settings": { - "override_file_size": [ - { - "target_os": "Android", - "file_name": "99_0_113.zip" - } - ] - } -} -``` - -`target_os` 可留空,留空表示对所有系统生效。 - -命中后会按该文件最终下发的 `url` 自动探测大小,并覆盖 `size` 返回值。 +如果 `cdn_server/{系统}/archives/99_0_115.zip` 存在,服务端会自动把它追加到更新下载列表中;如果该文件不存在,则会直接跳过。 登录方式为 `手机号密码登录`,都可以随便输。第一次使用的手机号会自动生成账号并记住登录的密码,以及后续的游戏内设置都会保存。 diff --git a/internal/handler/download/geturl.go b/internal/handler/download/geturl.go index bbdf94c..e6fab4c 100644 --- a/internal/handler/download/geturl.go +++ b/internal/handler/download/geturl.go @@ -23,15 +23,10 @@ func getUrl(ctx *gin.Context) { return } - cdnServer := config.Conf.Settings.BackupCdnServer - if cdnServer == "" { - cdnServer = config.Conf.Settings.CdnServer - } - urlList := []string{} for _, v := range downloadReq.PathList { urlList = append(urlList, fmt.Sprintf("%s/%s/extracted/%s", - cdnServer, downloadReq.Os, strings.ReplaceAll(v, "\\", ""))) + config.Conf.Settings.CdnServer, downloadReq.Os, strings.ReplaceAll(v, "\\", ""))) } ss.Respond(downloadschema.UrlResp{ diff --git a/internal/handler/download/update.go b/internal/handler/download/update.go index 9a9f3c9..0e8ecfe 100644 --- a/internal/handler/download/update.go +++ b/internal/handler/download/update.go @@ -10,7 +10,6 @@ import ( honokautils "honoka-chan/internal/utils" "io" "net/http" - "strings" "time" "github.com/gin-gonic/gin" @@ -38,7 +37,6 @@ func update(ctx *gin.Context) { return } - pkgMap := map[string]int{} for _, pkg := range pkgInfo { fileName := fmt.Sprintf("%d_%d_%d.zip", pkg.PkgType, pkg.PkgID, pkg.Order) url := fmt.Sprintf("%s/%s/archives/%s", @@ -49,28 +47,18 @@ func update(ctx *gin.Context) { URL: url, Version: config.PackageVersion, }) - pkgMap[fileName] = len(pkgList) - 1 } - overrideSource := getOverrideSource(downloadReq.TargetOs) serverConfigURL := fmt.Sprintf("%s/%s/archives/%s", config.Conf.Settings.CdnServer, downloadReq.TargetOs, overrideServerConfigFileName) - serverConfigURL, serverConfigSize, serverConfigAvailable := resolveServerConfigFile(serverConfigURL, overrideSource) - - if serverConfigAvailable { - if index, ok := pkgMap[overrideServerConfigFileName]; ok { - pkgList[index].URL = serverConfigURL - pkgList[index].Size = serverConfigSize - } else { - pkgList = append(pkgList, downloadschema.UpdateData{ - Size: serverConfigSize, - URL: serverConfigURL, - Version: config.PackageVersion, - }) - } + serverConfigSize, ok := getRemoteFileSize(serverConfigURL) + if ok { + pkgList = append(pkgList, downloadschema.UpdateData{ + Size: serverConfigSize, + URL: serverConfigURL, + Version: config.PackageVersion, + }) } - - applyOverrideFileSize(downloadReq.TargetOs, pkgList) } ss.Respond(downloadschema.UpdateResp{ @@ -80,32 +68,6 @@ func update(ctx *gin.Context) { }) } -func getOverrideSource(targetOs string) config.OverrideFileSource { - if strings.EqualFold(targetOs, "Android") { - return config.Conf.Settings.OverrideServerConfig.Android - } - if strings.EqualFold(targetOs, "iOS") { - return config.Conf.Settings.OverrideServerConfig.IOS - } - return config.OverrideFileSource{} -} - -func resolveServerConfigFile(defaultURL string, overrideSource config.OverrideFileSource) (string, int, bool) { - if config.Conf.Settings.OverrideServerConfig.Enable && overrideSource.URL != "" { - size, ok := getRemoteFileSize(overrideSource.URL) - if !ok { - return overrideSource.URL, 0, false - } - if overrideSource.Size > 0 { - size = overrideSource.Size - } - return overrideSource.URL, size, true - } - - size, ok := getRemoteFileSize(defaultURL) - return defaultURL, size, ok -} - func getRemoteFileSize(url string) (int, bool) { client := &http.Client{Timeout: 5 * time.Second} @@ -113,10 +75,9 @@ func getRemoteFileSize(url string) (int, bool) { if err == nil { if resp, err := client.Do(headReq); err == nil { _ = resp.Body.Close() - if resp.StatusCode >= http.StatusOK && resp.StatusCode < http.StatusMultipleChoices { - if resp.ContentLength > 0 { - return int(resp.ContentLength), true - } + if resp.StatusCode >= http.StatusOK && + resp.StatusCode < http.StatusMultipleChoices && resp.ContentLength > 0 { + return int(resp.ContentLength), true } } } @@ -138,45 +99,6 @@ func getRemoteFileSize(url string) (int, bool) { return int(dataLen), dataLen > 0 } -func applyOverrideFileSize(targetOs string, pkgList []downloadschema.UpdateData) { - urlSizeCache := map[string]int{} - - for i := range pkgList { - fileName := getFileNameFromURL(pkgList[i].URL) - if fileName == "" { - continue - } - - for _, override := range config.Conf.Settings.OverrideFileSize { - overrideOs := strings.TrimSpace(override.TargetOs) - if overrideOs != "" && !strings.EqualFold(overrideOs, strings.TrimSpace(targetOs)) { - continue - } - if strings.EqualFold(strings.TrimSpace(override.FileName), fileName) { - size, ok := urlSizeCache[pkgList[i].URL] - if !ok { - size, _ = getRemoteFileSize(pkgList[i].URL) - urlSizeCache[pkgList[i].URL] = size - } - - if size > 0 { - pkgList[i].Size = size - } - break - } - } - } -} - -func getFileNameFromURL(rawURL string) string { - urlNoQuery := strings.Split(rawURL, "?")[0] - parts := strings.Split(urlNoQuery, "/") - if len(parts) == 0 { - return "" - } - return strings.TrimSpace(parts[len(parts)-1]) -} - func init() { router.AddHandler("main.php", "POST", "/download/update", middleware.Common, update) }