128 lines
2.9 KiB
Go
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, ¶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
|
|
}
|