Skip to content

生命週期上報

遊戲在運營商 iframe 裡跑起來之後,用 @moose/game-client-sdkGameBridge 把它的生命週期上報給運營商的 shell。這和取得 session token是兩回事——GameBridge 完全不需要 session token,它只負責把遊戲的生命週期上報給 shell:

ts
import { GameBridge } from '@moose/game-client-sdk'

const bridge = new GameBridge()

bridge.notifyGameLoaded(currentBalanceMinor)

// BET_START/BET_END 是兩階段的結果揭曉,而不是兩個獨立的網路時刻——伺服端的下注/結算呼叫
// 通常會在一次回應裡結算整局(包含任何派彩),所以只在結果已經確定、你即將開始揭曉它的時候
// 才呼叫 BET_START:
const result = await submitBet(betAmountMinor) // 你自己的伺服端接入(見 ./server-integration)
if (result.declined) {
  bridge.notifyBetEnd('declined', betAmountMinor, result.balanceMinor)
  bridge.notifyBalanceExhausted()
} else {
  bridge.notifyBetStart(betAmountMinor, result.balanceMinor - betAmountMinor) // 這筆下注扣款後、派彩套用前
  await playReveal(result) // 你自己的揭曉動畫(如果有的話)——純粹是表現層
  bridge.notifyBetEnd(result.outcome, betAmountMinor, result.balanceMinor, result.winAmountMinor)
}

// 玩家點選了遊戲內的"返回大廳"控制元件:
bridge.notifyExitGame()

GameBridge 的建構函式還接受 target(預設為 window.parent),可以用來覆寫訊息的傳送目標——主要用於測試;正常執行在運營商 iframe 裡的遊戲應該直接用預設值即可。

機器人偵測訊號

@moose/game-client-sdk/behavior-reporterBehaviorReporter 在瀏覽器裡收集原始的互動時間數據(透過內部的 BehaviorCollector),並把產生的摘要直接送給平台——這條路徑完全不經過你的後端。機器人的操作節奏通常比真人玩家更快、也更規律,這正是這份摘要要回報的訊號。

ts
import { BehaviorReporter } from '@moose/game-client-sdk/behavior-reporter'

// ingestUrl 是平台專用的行為採集端點——和你傳給 ProviderClient
// 的基礎網址是不同的一組網址,由你的對接窗口提供。見「環境與基礎網址」。
const behavior = new BehaviorReporter({ ingestUrl: behaviorIngestUrl, sessionToken })

// 委託到 document 層級,只認你標記了 data-bet-trigger 的元素——不要
// 逐個在每個下注控制元件上手動掛 recordInteraction,但也不要放寬成
// 監聽整個頁面的任意點擊:把賠付表、日誌、「退出」之類無關點擊也算
// 進去,會稀釋這份摘要要量測的互動時間間隔訊號。傳入觸發用的
// Event,才能標記出一個非真人觸發的程式化點擊。
document.addEventListener('click', (event) => {
  if ((event.target as HTMLElement).closest('[data-bet-trigger]')) {
    behavior.recordInteraction(event)
  }
})

spinButton.addEventListener('click', () => placeBet())

把每個真正會觸發下注的控制元件都在 HTML 上標記 data-bet-trigger(例如 <button id="spin-button" data-bet-trigger>)——上面這個委託監聽會自動涵蓋所有這樣的元件,包括之後才加上去的,不需要每加一個就記得手動掛一次。

整個接入就這樣結束了——BehaviorReporter 會依照自己的計時器、以及分頁隱藏/頁面卸載事件自動送出摘要,直接 POST 到 ingestUrl,並用 X-Session-Token 標頭帶上 session token(這不是一個簽名呼叫:瀏覽器沒辦法保存你的 HMAC 金鑰,所以這個端點改用 session token 作為鑑權方式)。遊戲結束時呼叫 behavior.stop(),取消它的計時器並移除監聽器。

這是一個盡力而為的遙測訊號,不屬於遊戲流程的一部分——回報失敗會在內部被吞掉,絕不會上報給玩家,也不會阻擋下注。確切型別見 SDK 參考文件的 BehaviorReporter

完整參考

每個匯出型別和方法簽名(包含 shell 端實現監聽器所依據的 protocol 模組)詳見 @moose/game-client-sdk 參考文件