package baishun import ( "encoding/json" "strings" ) const extExtraLaunchParamsKey = "launchParams" const extLaunchParamGameTypeKey = "gameType" func launchParamsFromExtraJSON(raw string) map[string]any { extra := parseExtExtraJSON(raw) value, ok := extra[extExtraLaunchParamsKey] if !ok || value == nil { return nil } if params, ok := value.(map[string]any); ok { if len(params) == 0 { return nil } return params } bytes, err := json.Marshal(value) if err != nil { return nil } var params map[string]any if err := json.Unmarshal(bytes, ¶ms); err != nil || len(params) == 0 { return nil } return params } func launchParamsWithGameType(raw string, gameType string) map[string]any { params := cloneMapAny(launchParamsFromExtraJSON(raw)) gameType = normalizeGameType(gameType) if gameType == "" { if len(params) == 0 { return nil } return params } if params == nil { params = map[string]any{} } params[extLaunchParamGameTypeKey] = gameType return params } func gameTypeFromExtraJSON(raw string, fallback string) string { params := launchParamsFromExtraJSON(raw) if value, ok := params[extLaunchParamGameTypeKey].(string); ok { if normalized := normalizeGameType(value); normalized != "" { return normalized } } return normalizeGameType(fallback) } func updateExtExtraJSON(existing string, launchParams map[string]any, preserveExisting bool) string { if launchParams == nil { if preserveExisting { return strings.TrimSpace(existing) } return "" } extra := parseExtExtraJSON(existing) if len(launchParams) == 0 { delete(extra, extExtraLaunchParamsKey) } else { extra[extExtraLaunchParamsKey] = launchParams } if len(extra) == 0 { return "" } bytes, err := json.Marshal(extra) if err != nil { return strings.TrimSpace(existing) } return string(bytes) } func updateExtExtraJSONWithGameType(existing string, launchParams map[string]any, gameType string, preserveExisting bool) string { params := cloneMapAny(launchParams) if params == nil && preserveExisting { params = cloneMapAny(launchParamsFromExtraJSON(existing)) } if params == nil { params = map[string]any{} } gameType = normalizeGameType(gameType) if gameType != "" { params[extLaunchParamGameTypeKey] = gameType } return updateExtExtraJSON(existing, params, preserveExisting) } func parseExtExtraJSON(raw string) map[string]any { raw = strings.TrimSpace(raw) if raw == "" { return map[string]any{} } var extra map[string]any if err := json.Unmarshal([]byte(raw), &extra); err != nil || extra == nil { return map[string]any{} } return extra } func cloneMapAny(source map[string]any) map[string]any { if len(source) == 0 { return nil } target := make(map[string]any, len(source)) for key, value := range source { target[key] = value } return target } func normalizeGameType(value string) string { value = strings.ToUpper(strings.TrimSpace(value)) if value == "" { return "" } return value }