2026-04-22 19:57:28 +08:00

128 lines
2.9 KiB
Go

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, &params); 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
}