跳至主要内容

推播與解析實例

範例

golang amqp091 套件解析範例

完整範例 Github

  1. 根據 amqp delivery.Type 取得對應的通知類型, 根據類型使用proto 解析 body 格式

  2. 遊戲回合卡牌(結果)的解析方式,另外在各遊戲章節補充解析

  3. 代碼參考:

    Github (GOLANG)

    Github (JAVA)

    func(delivery amqp091.Delivery) {
    notifyType := pbRecorder.GameNotifyType(pbRecorder.GameNotifyType_value[delivery.Type])


    logrus.Infof("receive game notifyType:[%v]", notifyType)
    switch notifyType {
    case pbRecorder.GameNotifyType_NOTIFY_GAME_DEALER_LOGIN,
    pbRecorder.GameNotifyType_NOTIFY_GAME_DEALER_LOGOUT,
    pbRecorder.GameNotifyType_NOTIFY_GAME_CHANGING_SHOE:
    gameProvide := &pbRecorder.GameProvide{}
    err := proto.Unmarshal(delivery.Body, gameProvide)

    case pbRecorder.GameNotifyType_NOTIFY_SHIFT_START,
    pbRecorder.GameNotifyType_NOTIFY_SHIFT_END:
    shift := &pbRecorder.ShiftRecord{}
    err := proto.Unmarshal(delivery.Body, shift)

    case pbRecorder.GameNotifyType_NOTIFY_SHOE_START,
    pbRecorder.GameNotifyType_NOTIFY_SHOE_END:
    shoe := &pbRecorder.ShoeRecord{}
    err := proto.Unmarshal(delivery.Body, shoe)

    case pbRecorder.GameNotifyType_NOTIFY_ROUND_START,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_BET,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_NO_MORE_BET,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_STEP,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_FINISH,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_CANCEL,
    pbRecorder.GameNotifyType_NOTIFY_ROUND_PLAYBACK:
    round := &pbRecorder.RoundRecord{}
    err := proto.Unmarshal(delivery.Body, round)

    ...

遊戲事件通知說明

  1. 該桌事件通知 (provider 解析)

    GameNotifyType說明
    GameNotifyType_NOTIFY_GAME_PROVIDE_STATE_CHANGE桌狀態變更
    GameNotifyType_NOTIFY_GAME_DEALER_LOGIN荷官登入 代碼名字相關
    GameNotifyType_NOTIFY_GAME_DEALER_LOGOUT荷官登出 代碼名字相關
    GameNotifyType_NOTIFY_GAME_CHANGING_SHOE換靴
    GameNotifyType_NOTIFY_GAME_CAPTURE荷官拍照使用的縮圖畫面
  2. 該桌班局事件通知 (ShiftRecord 解析)

    GameNotifyType說明
    GameNotifyType_NOTIFY_SHIFT_START班次開始
    GameNotifyType_NOTIFY_SHIFT_END班次結束
  3. 該桌班局事件通知 (ShoeRecord 解析)

    GameNotifyType說明
    GameNotifyType_NOTIFY_SHOE_START靴號開始
    GameNotifyType_NOTIFY_SHOE_END靴好結束
  4. 該局相關 (RoundRecord解析)

    GameNotifyType說明
    GameNotifyType_NOTIFY_ROUND_START通知遊戲開始(可用開始下注起始 可忽略)
    GameNotifyType_NOTIFY_ROUND_BET通知遊戲開始下注
    GameNotifyType_NOTIFY_ROUND_NO_MORE_BET通知遊戲停止下注
    GameNotifyType_NOTIFY_ROUND_STEP通知遊戲該局歷程
    GameNotifyType_NOTIFY_ROUND_FINISH通知遊戲該局結果
    GameNotifyType_NOTIFY_ROUND_CANCEL通知遊戲該局取消
    GameNotifyType_NOTIFY_ROUND_PLAYBACK通知遊戲該局回放影像網址
    GameNotifyType_NOTIFY_ROUND_CANCEL_AFTER_ROUND事後該局取消結果
    GameNotifyType_NOTIFY_ROUND_MODIFY_AFTER_ROUND事後異動牌面結果
    GameNotifyType_NOTIFY_ROUND_FINISH_AFTER_ROUND透過後台輸入結果

BA 牌面解析(SAMPLE)

  1. 根據 GameNotifyType_NOTIFY_ROUND_STEP 事件解析 roundRecord 來得到目前場上開了哪些牌型 參考使用座位與資源

    import (
    pbBaccarat "github.com/wecasino/wecasino-proto/pbgo/games/baccarat"
    pbRecorder "github.com/wecasino/wecasino-proto/pbgo/recorder"
    )

    func ParseRoundCardsIndex(ctx context.Context, round *pbRecorder.RoundRecord) (b1, b2, b3, p1, p2, p3 string) {
    banker := round.Seats[int32(pbGames.FlowSeat_BANKER)]
    bankerNormal := banker.GetCards()[int32(pbBaccarat.ResourceType_NORMAL)].GetList()
    if len(bankerNormal) > 0 {
    b1 = bankerNormal[0].GetCode()
    }
    if len(bankerNormal) > 1 {
    b2 = bankerNormal[1].GetCode()
    }
    bankerExtra := banker.GetCards()[int32(pbBaccarat.ResourceType_EXTRA)].GetList()
    if len(bankerExtra) > 0 {
    b3 = bankerExtra[0].GetCode()
    }


    player := round.Seats[int32(pbGames.FlowSeat_PLAYER)]
    playerNormal := player.GetCards()[int32(pbBaccarat.ResourceType_NORMAL)].GetList()
    if len(playerNormal) > 0 {
    p1 = playerNormal[0].GetCode()
    }
    if len(playerNormal) > 1 {
    p2 = playerNormal[1].GetCode()
    }
    playerExtra := player.GetCards()[int32(pbBaccarat.ResourceType_EXTRA)].GetList()
    if len(playerExtra) > 0 {
    p3 = playerExtra[0].GetCode()
    }
    return
    }

BA 財神號碼說明

  1. roundRecord 屬性內有 FortuneRate 顯示卡牌對應倍率,於停止下注時公布,若場上有中對應牌神照遊戲規則賠率調整

  2. map[“CLUB_J”:2 “DIAMOND_8”:8 “HEART_3”:3 “HEART_Q”:2]

    func ParseRoundLucky(ctx context.Context, round *pbRecorder.RoundRecord) map[uint8]uint16 {
    roundLuckyMap := map[uint8]uint16{}
    for cardCode, rate := range round.FortuneRates {
    poker, err := cards.ParsePokerCode(cardCode)
    if err == nil {
    roundLuckyMap[poker] = uint16(rate)
    }
    }
    return roundLuckyMap
    }