游戏修复

This commit is contained in:
zhx 2026-07-01 12:04:58 +08:00
parent 36833deb15
commit bea31229ce
2 changed files with 63 additions and 6 deletions

View File

@ -42,10 +42,10 @@ type baishunAdapterConfig struct {
TokenTTLSeconds int64 `json:"token_ttl_seconds"`
// 以下字段是 NativeBridge.getConfig 需要返回给 H5 的配置,同时也会拼在启动 URL query 中给壳层复用。
GameMode string `json:"game_mode"`
SceneMode int64 `json:"scene_mode"`
CurrencyIcon string `json:"currency_icon"`
GSP int64 `json:"gsp"`
GameMode baishunGameModeValue `json:"game_mode"`
SceneMode int64 `json:"scene_mode"`
CurrencyIcon string `json:"currency_icon"`
GSP int64 `json:"gsp"`
// 可选用户管控字段;配置后会随 get_sstoken/get_user_info 一起返回给百顺。
UserType int `json:"user_type"`
@ -77,7 +77,7 @@ func baishunConfigFromPlatform(value any) baishunAdapterConfig {
config.AppChannel = strings.TrimSpace(config.AppChannel)
config.UIDMode = strings.ToLower(strings.TrimSpace(config.UIDMode))
config.DefaultLang = strings.TrimSpace(config.DefaultLang)
config.GameMode = strings.TrimSpace(config.GameMode)
config.GameMode = baishunGameModeValue(strings.TrimSpace(string(config.GameMode)))
config.CurrencyIcon = strings.TrimSpace(config.CurrencyIcon)
config.Extend = strings.TrimSpace(config.Extend)
config.LaunchURLTemplate = strings.TrimSpace(config.LaunchURLTemplate)
@ -101,11 +101,36 @@ func (c baishunAdapterConfig) LanguageValue() string {
func (c baishunAdapterConfig) GameModeValue() string {
if c.GameMode != "" {
return c.GameMode
return string(c.GameMode)
}
return "3"
}
type baishunGameModeValue string
func (v *baishunGameModeValue) UnmarshalJSON(raw []byte) error {
// 后台适配器配置是自由 JSON历史上既可能保存 "2",也可能保存 2。
// 百顺启动 query 最终只需要文本值;在配置入口归一,避免数字类型被 Go string 字段吞掉后误走默认 gameMode=3。
decoder := json.NewDecoder(strings.NewReader(strings.TrimSpace(string(raw))))
decoder.UseNumber()
var value any
if err := decoder.Decode(&value); err != nil {
return err
}
switch typed := value.(type) {
case nil:
*v = ""
case string:
*v = baishunGameModeValue(strings.TrimSpace(typed))
case json.Number:
*v = baishunGameModeValue(strings.TrimSpace(typed.String()))
default:
// 复杂类型不是百顺协议值;按未配置处理,保留默认值兜底,同时不影响同一 JSON 中其它配置解析。
*v = ""
}
return nil
}
func baishunLaunchBaseURL(game gamedomain.LaunchableGame, config baishunAdapterConfig) string {
for _, key := range []string{game.ProviderGameID, game.GameID, strings.ToLower(game.GameID)} {
if raw := strings.TrimSpace(config.GameURLs[strings.TrimSpace(key)]); raw != "" {

View File

@ -396,6 +396,38 @@ func TestLaunchGameBuildsBaishunURL(t *testing.T) {
}
}
func TestBaishunConfigGameModeAcceptsNumberAndString(t *testing.T) {
cases := []struct {
name string
raw string
want string
}{
{
name: "string_value_from_existing_config",
raw: `{"game_mode":"2"}`,
want: "2",
},
{
name: "numeric_value_from_admin_json_editor",
raw: `{"game_mode":2}`,
want: "2",
},
{
name: "missing_value_keeps_baishun_default",
raw: `{}`,
want: "3",
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
config := baishunConfigFromPlatform(gamedomain.LaunchableGame{AdapterConfigJSON: tc.raw})
if got := config.GameModeValue(); got != tc.want {
t.Fatalf("baishun gameMode mismatch: got %q want %q raw=%s", got, tc.want, tc.raw)
}
})
}
}
func TestLaunchGameBuildsVivaGamesURL(t *testing.T) {
repo := &fakeRepository{
launchable: gamedomain.LaunchableGame{