Unverified Commit afbd0de6 authored by 33cn's avatar 33cn Committed by GitHub

Merge pull request #141 from jpeng-go/pokerbull

Pokerbull问题修复
parents 62cbbdc6 66bcc4fb
......@@ -56,19 +56,15 @@ func pokerbullStart(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
value, _ := cmd.Flags().GetUint64("value")
playerCount, _ := cmd.Flags().GetUint32("playerCount")
fee, _ := cmd.Flags().GetFloat64("fee")
feeInt64 := int64(fee * 1e4)
amountInt64 := int64(value)
params := &pkt.PBStartTxReq{
Value: amountInt64 * types.Coin,
PlayerNum: int32(playerCount),
Fee: feeInt64,
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.PokerBullX),
ActionName: pkt.CreateStartTx,
Payload: []byte(fmt.Sprintf("{\"value\":%d,\"playerNum\":%d}", int64(value)*types.Coin, int32(playerCount))),
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "pokerbull.PokerBullStartTx", params, &res)
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, &res)
ctx.RunWithoutMarshal()
}
......@@ -91,17 +87,15 @@ func addPokerbullContinueFlags(cmd *cobra.Command) {
func pokerbullContinue(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
gameID, _ := cmd.Flags().GetString("gameID")
fee, _ := cmd.Flags().GetFloat64("fee")
feeInt64 := int64(fee * 1e4)
params := &pkt.PBContinueTxReq{
GameId: gameID,
Fee: feeInt64,
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.PokerBullX),
ActionName: pkt.CreateContinueTx,
Payload: []byte(fmt.Sprintf("{\"gameId\":\"%s\"}", gameID)),
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "pokerbull.PokerBullContinueTx", params, &res)
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, &res)
ctx.RunWithoutMarshal()
}
......@@ -124,17 +118,15 @@ func addPokerbullQuitFlags(cmd *cobra.Command) {
func pokerbullQuit(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
gameID, _ := cmd.Flags().GetString("gameID")
fee, _ := cmd.Flags().GetFloat64("fee")
feeInt64 := int64(fee * 1e4)
params := &pkt.PBContinueTxReq{
GameId: gameID,
Fee: feeInt64,
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pkt.PokerBullX),
ActionName: pkt.CreatequitTx,
Payload: []byte(fmt.Sprintf("{\"gameId\":\"%s\"}", gameID)),
}
var res string
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "pokerbull.PokerBullQuitTx", params, &res)
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.CreateTransaction", params, &res)
ctx.RunWithoutMarshal()
}
......@@ -155,6 +147,7 @@ func addPokerbullQueryFlags(cmd *cobra.Command) {
cmd.Flags().StringP("index", "i", "", "index")
cmd.Flags().StringP("status", "s", "", "status")
cmd.Flags().StringP("gameIDs", "d", "", "gameIDs")
cmd.Flags().StringP("round", "r", "", "round")
}
func pokerbullQuery(cmd *cobra.Command, args []string) {
......@@ -166,6 +159,7 @@ func pokerbullQuery(cmd *cobra.Command, args []string) {
indexstr, _ := cmd.Flags().GetString("index")
index, _ := strconv.ParseInt(indexstr, 10, 64)
gameIDs, _ := cmd.Flags().GetString("gameIDs")
round, _ := cmd.Flags().GetString("round")
var params rpctypes.Query4Jrpc
params.Execer = pkt.PokerBullX
......@@ -177,10 +171,27 @@ func pokerbullQuery(cmd *cobra.Command, args []string) {
}
params.Payload = types.MustPBToJSON(req)
if gameID != "" {
if round == "" {
params.FuncName = pkt.FuncNameQueryGameByID
var res pkt.ReplyPBGame
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
} else {
params.FuncName = pkt.FuncNameQueryGameByRound
roundInt, err := strconv.ParseInt(round, 10, 32)
if err != nil {
fmt.Println(err)
return
}
req := &pkt.QueryPBGameByRound{
GameId: gameID,
Round: int32(roundInt),
}
params.Payload = types.MustPBToJSON(req)
var res pkt.ReplyPBGameByRound
ctx := jsonrpc.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
} else if address != "" {
params.FuncName = pkt.FuncNameQueryGameByAddr
var res pkt.PBGameRecords
......
......@@ -70,7 +70,7 @@ func calcPBGameStatusKey(status int32, index int64) []byte {
}
func calcPBGameStatusAndPlayerKey(status, player int32, value, index int64) []byte {
key := fmt.Sprintf("LODB-pokerbull-status:%d:%d:%d:%018d", status, player, value, index)
key := fmt.Sprintf("LODB-pokerbull-status:%d:%d:%015d:%018d", status, player, value, index)
return []byte(key)
}
......@@ -79,7 +79,7 @@ func calcPBGameStatusAndPlayerPrefix(status, player int32, value int64) []byte {
if value == 0 {
key = fmt.Sprintf("LODB-pokerbull-status:%d:%d:", status, player)
} else {
key = fmt.Sprintf("LODB-pokerbull-status:%d:%d:%d", status, player, value)
key = fmt.Sprintf("LODB-pokerbull-status:%d:%d:%015d", status, player, value)
}
return []byte(key)
......
......@@ -18,19 +18,6 @@ import (
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
const (
// ListDESC 降序
ListDESC = int32(0)
// DefaultCount 默认一次取多少条记录
DefaultCount = int32(20)
// MaxPlayerNum 最大玩家数
MaxPlayerNum = 5
// MinPlayValue 最小赌注
MinPlayValue = 10 * types.Coin
// DefaultStyle 默认游戏类型
DefaultStyle = pkt.PlayStyleDefault
)
// Action 斗牛action结构
type Action struct {
coinsAccount *account.DB
......@@ -57,7 +44,7 @@ func NewAction(pb *PokerBull, tx *types.Transaction, index int) *Action {
func (action *Action) CheckExecAccountBalance(fromAddr string, ToFrozen, ToActive int64) bool {
// 赌注为零,按照最小赌注冻结
if ToFrozen == 0 {
ToFrozen = MinPlayValue
ToFrozen = pkt.MinPlayValue
}
acc := action.coinsAccount.LoadExecAccount(fromAddr, action.execaddr)
......@@ -69,7 +56,7 @@ func (action *Action) CheckExecAccountBalance(fromAddr string, ToFrozen, ToActiv
// Key 获取key值
func Key(id string) (key []byte) {
key = append(key, []byte("mavl-"+types.ExecName(pkt.PokerBullX)+"-")...)
key = append(key, []byte("mavl-"+pkt.PokerBullX+"-")...)
key = append(key, []byte(id)...)
return key
}
......@@ -77,14 +64,14 @@ func Key(id string) (key []byte) {
func readGame(db dbm.KV, id string) (*pkt.PokerBull, error) {
data, err := db.Get(Key(id))
if err != nil {
logger.Error("query data have err:", err.Error())
logger.Error("query data have err:", "err", err)
return nil, err
}
var game pkt.PokerBull
//decode
err = types.Decode(data, &game)
if err != nil {
logger.Error("decode game have err:", err.Error())
logger.Error("decode game have err:", "err", err)
return nil, err
}
return &game, nil
......@@ -108,14 +95,13 @@ func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message,
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcPBGameAddrPrefix(addr), nil, DefaultCount, ListDESC)
values, err = db.List(calcPBGameAddrPrefix(addr), nil, pkt.DefaultCount, pkt.ListDESC)
} else {
values, err = db.List(calcPBGameAddrPrefix(addr), calcPBGameAddrKey(addr, index), DefaultCount, ListDESC)
values, err = db.List(calcPBGameAddrPrefix(addr), calcPBGameAddrKey(addr, index), pkt.DefaultCount, pkt.ListDESC)
}
if err != nil {
return nil, err
}
var gameIds []*pkt.PBGameRecord
for _, value := range values {
var record pkt.PBGameRecord
......@@ -125,7 +111,9 @@ func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message,
}
gameIds = append(gameIds, &record)
}
if len(gameIds) == 0 {
return nil, types.ErrNotFound
}
return &pkt.PBGameRecords{Records: gameIds}, nil
}
......@@ -133,17 +121,17 @@ func getGameListByStatus(db dbm.Lister, status int32, index int64) (types.Messag
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcPBGameStatusPrefix(status), nil, DefaultCount, ListDESC)
values, err = db.List(calcPBGameStatusPrefix(status), nil, pkt.DefaultCount, pkt.ListDESC)
} else {
values, err = db.List(calcPBGameStatusPrefix(status), calcPBGameStatusKey(status, index), DefaultCount, ListDESC)
values, err = db.List(calcPBGameStatusPrefix(status), calcPBGameStatusKey(status, index), pkt.DefaultCount, pkt.ListDESC)
}
if err != nil {
return nil, err
}
var gameIds []*pkt.PBGameRecord
var gameIds []*pkt.PBGameIndexRecord
for _, value := range values {
var record pkt.PBGameRecord
var record pkt.PBGameIndexRecord
err := types.Decode(value, &record)
if err != nil {
continue
......@@ -151,11 +139,11 @@ func getGameListByStatus(db dbm.Lister, status int32, index int64) (types.Messag
gameIds = append(gameIds, &record)
}
return &pkt.PBGameRecords{Records: gameIds}, nil
return &pkt.PBGameIndexRecords{Records: gameIds}, nil
}
func queryGameListByStatusAndPlayer(db dbm.Lister, stat int32, player int32, value int64) ([]string, error) {
values, err := db.List(calcPBGameStatusAndPlayerPrefix(stat, player, value), nil, DefaultCount, ListDESC)
values, err := db.List(calcPBGameStatusAndPlayerPrefix(stat, player, value), nil, pkt.DefaultCount, pkt.ListDESC)
if err != nil {
return nil, err
}
......@@ -210,6 +198,7 @@ func (action *Action) GetReceiptLog(game *pkt.PokerBull) *types.ReceiptLog {
}
}
r.PreStatus = game.PreStatus
r.Round = game.Round
log.Log = types.Encode(r)
return log
}
......@@ -411,11 +400,38 @@ func (action *Action) settleDefaultAccount(lastAddress string, game *pkt.PokerBu
}
}
// 扣除开发者佣金
receipt := action.defaultFeeTransfer(result.Winner, pkt.DeveloperAddress, pkt.DeveloperFee, game.GetValue())
if receipt != nil {
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
// 扣除平台佣金
receipt = action.defaultFeeTransfer(result.Winner, pkt.PlatformAddress, pkt.PlatformFee, game.GetValue())
if receipt != nil {
logs = append(logs, receipt.Logs...)
kv = append(kv, receipt.KV...)
}
return logs, kv, nil
}
// 佣金扣除
func (action *Action) defaultFeeTransfer(winner string, feeAddr string, fee int64, value int64) *types.Receipt {
receipt, err := action.coinsAccount.ExecTransfer(winner, feeAddr, action.execaddr, (value/types.Coin)*fee /**int64(result.Leverage)*/) //TODO Dealer:暂时不支持倍数
if err != nil {
action.coinsAccount.ExecFrozen(winner, action.execaddr, (value/types.Coin)*fee) // rollback
logger.Error("GameSettleDefault.ExecTransfer", "addr", winner, "execaddr", action.execaddr, "amount",
(value/types.Coin)*fee /**int64(result.Leverage)*/, "err", err) //TODO Dealer:暂时不支持倍数
return nil
}
return receipt
}
func (action *Action) settleAccount(lastAddress string, game *pkt.PokerBull) ([]*types.ReceiptLog, []*types.KeyValue, error) {
if DefaultStyle == pkt.PlayStyleDealer {
if pkt.DefaultStyle == pkt.PlayStyleDealer {
return action.settleDealerAccount(lastAddress, game)
}
return action.settleDefaultAccount(lastAddress, game)
......@@ -453,11 +469,11 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker
// 不指定赌注,默认按照最低赌注
if start.GetValue() == 0 {
start.Value = MinPlayValue
start.Value = pkt.MinPlayValue
}
//TODO 庄家检查闲家数量倍数的资金
if DefaultStyle == pkt.PlayStyleDealer {
if pkt.DefaultStyle == pkt.PlayStyleDealer {
if !action.CheckExecAccountBalance(action.fromaddr, start.GetValue()*PokerbullLeverageMax*int64(start.PlayerNum-1), 0) {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "id",
gameID, "err", types.ErrNoBalance)
......@@ -477,9 +493,11 @@ func (action *Action) newGame(gameID string, start *pkt.PBGameStart) (*pkt.Poker
DealerAddr: action.fromaddr,
IsWaiting: true,
PreStatus: 0,
Round: 1,
}
Shuffle(game.Poker, action.blocktime) //洗牌
logger.Debug(fmt.Sprintf("Start a new game %s for player %s", game.GameId, action.fromaddr))
return game, nil
}
......@@ -500,7 +518,7 @@ func (action *Action) selectGameFromIds(ids []string, value int64) *pkt.PokerBul
}
//选择合适赌注的游戏
if value == 0 && game.GetValue() != MinPlayValue {
if value == 0 && game.GetValue() != pkt.MinPlayValue {
if !action.CheckExecAccountBalance(action.fromaddr, game.GetValue(), 0) {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "id", id, "err", types.ErrNoBalance)
continue
......@@ -513,32 +531,33 @@ func (action *Action) selectGameFromIds(ids []string, value int64) *pkt.PokerBul
return gameRet
}
func (action *Action) checkPlayerExistInGame() bool {
values, err := action.localDB.List(calcPBGameAddrPrefix(action.fromaddr), nil, DefaultCount, ListDESC)
if err == types.ErrNotFound {
return false
}
var value pkt.PBGameRecord
length := len(values)
if length != 0 {
valueBytes := values[length-1]
err := types.Decode(valueBytes, &value)
if err == nil && value.Status == pkt.PBGameActionQuit {
return false
}
}
return true
}
//func (action *Action) checkPlayerExistInGame() bool {
// values, err := action.localDB.List(calcPBGameAddrPrefix(action.fromaddr), nil, pkt.DefaultCount, pkt.ListDESC)
// if err == types.ErrNotFound {
// return false
// }
//
// var value pkt.PBGameRecord
// length := len(values)
// if length != 0 {
// valueBytes := values[length-1]
// err := types.Decode(valueBytes, &value)
// if err == nil && value.Status == pkt.PBGameActionQuit {
// return false
// }
// }
// return true
//}
// GameStart 游戏开始
func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
if start.PlayerNum > MaxPlayerNum {
logger.Debug(fmt.Sprintf("Pokerbull game start for %s", action.fromaddr))
if start.PlayerNum > pkt.MaxPlayerNum {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr,
"err", fmt.Sprintf("The maximum player number is %d", MaxPlayerNum))
"err", fmt.Sprintf("The maximum player number is %d", pkt.MaxPlayerNum))
return nil, types.ErrInvalidParam
}
......@@ -548,10 +567,11 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
return nil, types.ErrNoBalance
}
if action.checkPlayerExistInGame() {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "err", "Address is already in a game")
return nil, fmt.Errorf("Address is already in a game")
}
// 由应用平台限制
//if action.checkPlayerExistInGame() {
// logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr, "err", "Address is already in a game")
// return nil, fmt.Errorf("Address is already in a game")
//}
var game *pkt.PokerBull
ids, err := queryGameListByStatusAndPlayer(action.localDB, pkt.PBGameActionStart, start.PlayerNum, start.Value)
......@@ -573,6 +593,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
return nil, err
}
}
logger.Debug(fmt.Sprintf("Match a new game %s for player %s", game.GameId, game.GameId))
}
//发牌随机数取txhash
......@@ -590,6 +611,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
// 如果人数达标,则发牌计算斗牛结果
if len(game.Players) == int(game.PlayerNum) {
logger.Debug(fmt.Sprintf("Game start: %s", game.GameId))
logsH, kvH, err := action.settleAccount(action.fromaddr, game)
if err != nil {
return nil, err
......@@ -603,6 +625,7 @@ func (action *Action) GameStart(start *pkt.PBGameStart) (*types.Receipt, error)
game.PreStatus = pkt.PBGameActionStart
game.IsWaiting = false
} else {
logger.Debug(fmt.Sprintf("Game waiting: %s", game.GameId))
receipt, err := action.coinsAccount.ExecFrozen(action.fromaddr, action.execaddr, start.GetValue()*PokerbullLeverageMax) //冻结子账户资金, 最后一位玩家不需要冻结
if err != nil {
logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", start.GetValue(), "err", err.Error())
......@@ -644,16 +667,17 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
game, err := action.readGame(pbcontinue.GetGameId())
if err != nil {
logger.Error("GameContinue", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed",
logger.Error("GameContinue", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed, gameID",
pbcontinue.GetGameId(), "err", err)
return nil, err
}
if game.Status != pkt.PBGameActionContinue {
logger.Error("GameContinue", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error",
logger.Error("GameContinue", "addr", action.fromaddr, "execaddr", action.execaddr, "Status error, gameID",
pbcontinue.GetGameId())
return nil, err
}
logger.Debug(fmt.Sprintf("Pokerbull game %s continue for %s", game.GameId, action.fromaddr))
// 检查余额,庄家检查闲家数量倍数的资金
checkValue := game.GetValue() * PokerbullLeverageMax
......@@ -688,6 +712,7 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
pbplayer.Ready = true
if getReadyPlayerNum(game.Players) == int(game.PlayerNum) {
logger.Debug(fmt.Sprintf("Game start: %s", game.GameId))
logsH, kvH, err := action.settleAccount(action.fromaddr, game)
if err != nil {
return nil, err
......@@ -699,6 +724,11 @@ func (action *Action) GameContinue(pbcontinue *pkt.PBGameContinue) (*types.Recei
game.IsWaiting = false
game.PreStatus = pkt.PBGameActionContinue
} else {
logger.Debug(fmt.Sprintf("Game waiting: %s", game.GameId))
// 回合数加一次
if !game.IsWaiting {
game.Round++
}
receipt, err := action.coinsAccount.ExecFrozen(action.fromaddr, action.execaddr, game.GetValue()*PokerbullLeverageMax) //冻结子账户资金,最后一位玩家不需要冻结
if err != nil {
logger.Error("GameCreate.ExecFrozen", "addr", action.fromaddr, "execaddr", action.execaddr, "amount", game.GetValue(), "err", err.Error())
......
......@@ -29,7 +29,6 @@ func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Messag
if err != nil {
return nil, err
}
return gameIds, nil
}
......@@ -42,3 +41,49 @@ func (g *PokerBull) Query_QueryGameByStatus(in *pkt.QueryPBGameInfo) (types.Mess
return gameIds, nil
}
// Query_QueryGameByRound 查询某一回合游戏结果
func (g *PokerBull) Query_QueryGameByRound(in *pkt.QueryPBGameByRound) (types.Message, error) {
game, err := readGame(g.GetStateDB(), in.GetGameId())
if err != nil {
return nil, err
}
if in.Round > game.Round {
return nil, types.ErrInvalidParam
}
var roundPlayers []*pkt.PBPlayer
for _, player := range game.Players {
var isReady bool
if in.Round == game.Round {
isReady = player.Ready
} else {
isReady = false
}
roundPlayer := &pkt.PBPlayer{
Address: player.Address,
Ready: isReady,
}
roundPlayers = append(roundPlayers, roundPlayer)
}
var result *pkt.PBResult
if len(game.Results) < int(in.Round) {
result = nil
} else {
result = game.Results[in.Round-1]
}
gameInfo := &pkt.ReplyPBGameByRound{
GameId: game.GameId,
Status: game.Status,
Result: result,
IsWaiting: game.IsWaiting,
Value: game.Value,
Players: roundPlayers,
Return: (game.Value / types.Coin) * pkt.WinnerReturn,
}
return gameInfo, nil
}
......@@ -8,7 +8,6 @@ import (
"github.com/33cn/chain33/pluginmgr"
"github.com/33cn/plugin/plugin/dapp/pokerbull/commands"
"github.com/33cn/plugin/plugin/dapp/pokerbull/executor"
"github.com/33cn/plugin/plugin/dapp/pokerbull/rpc"
"github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
......@@ -18,6 +17,5 @@ func init() {
ExecName: executor.GetName(),
Exec: executor.Init,
Cmd: commands.PokerBullCmd,
RPC: rpc.Init,
})
}
syntax = "proto3";
import "transaction.proto";
package types;
//斗牛游戏内容
......@@ -22,6 +20,7 @@ message PokerBull {
string dealerAddr = 14; //下局庄家地址
bool isWaiting = 15; //游戏是否处于等待状态
int32 preStatus = 16; //上一index的状态
int32 round = 17; //当前游戏回合数
}
//一把牌
......@@ -111,6 +110,10 @@ message PBGameRecords {
repeated PBGameRecord records = 1;
}
message PBGameIndexRecords {
repeated PBGameIndexRecord records = 1;
}
message QueryPBGameInfo {
string gameId = 1;
string addr = 2;
......@@ -130,6 +133,23 @@ message ReplyPBGameList {
repeated PokerBull games = 1;
}
// QueryPBGameByRound 根据gameId和回合数查询某回合的游戏结果
message QueryPBGameByRound {
string gameId = 1;
int32 round = 2;
}
// ReplyPBGameByRound 某一回合游戏结果
message ReplyPBGameByRound {
string gameId = 1;
int32 status = 2;
PBResult result = 3;
bool isWaiting = 4;
int64 value = 5;
repeated PBPlayer players = 6;
int64 return = 7;
}
message ReceiptPBGame {
string gameId = 1;
int32 status = 2;
......@@ -141,6 +161,7 @@ message ReceiptPBGame {
bool isWaiting = 8;
repeated string players = 9;
int32 preStatus = 10;
int32 round = 11;
}
message PBStartTxReq {
......@@ -164,12 +185,3 @@ message PBQueryReq {
int64 fee = 2;
}
// pokerbull 对外提供服务的接口
service pokerbull {
//游戏开始
rpc Start(PBGameStart) returns (UnsignTx) {}
//游戏继续
rpc Continue(PBGameContinue) returns (UnsignTx) {}
//游戏结束
rpc Quit(PBGameQuit) returns (UnsignTx) {}
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package rpc
import (
"context"
"encoding/hex"
"github.com/33cn/chain33/types"
pb "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
// PokerBullStartTx 创建游戏开始交易
func (c *Jrpc) PokerBullStartTx(parm *pb.PBStartTxReq, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
head := &pb.PBGameStart{
Value: parm.Value,
PlayerNum: parm.PlayerNum,
}
reply, err := c.cli.Start(context.Background(), head)
if err != nil {
return err
}
*result = hex.EncodeToString(reply.Data)
return nil
}
// PokerBullContinueTx 创建游戏继续交易
func (c *Jrpc) PokerBullContinueTx(parm *pb.PBContinueTxReq, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
head := &pb.PBGameContinue{
GameId: parm.GameId,
}
reply, err := c.cli.Continue(context.Background(), head)
if err != nil {
return err
}
*result = hex.EncodeToString(reply.Data)
return nil
}
// PokerBullQuitTx 创建游戏推出交易
func (c *Jrpc) PokerBullQuitTx(parm *pb.PBQuitTxReq, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
head := &pb.PBGameQuit{
GameId: parm.GameId,
}
reply, err := c.cli.Quit(context.Background(), head)
if err != nil {
return err
}
*result = hex.EncodeToString(reply.Data)
return nil
}
// PokerBullQueryTx 创建游戏查询交易
func (c *Jrpc) PokerBullQueryTx(parm *pb.PBQueryReq, result *interface{}) error {
if parm == nil {
return types.ErrInvalidParam
}
head := &pb.PBGameQuery{
GameId: parm.GameId,
}
reply, err := c.cli.Show(context.Background(), head)
if err != nil {
return err
}
*result = hex.EncodeToString(reply.Data)
return nil
}
......@@ -5,7 +5,7 @@
package rpc_test
import (
"strings"
"fmt"
"testing"
commonlog "github.com/33cn/chain33/common/log"
......@@ -41,45 +41,75 @@ func TestJRPCChannel(t *testing.T) {
{fn: testStartRawTxCmd},
{fn: testContinueRawTxCmd},
{fn: testQuitRawTxCmd},
}
for _, testCase := range testCases {
err := testCase.fn(t, jrpcClient)
assert.Nil(t, err)
}
testCases = []struct {
fn func(*testing.T, *jsonclient.JSONClient) error
}{
{fn: testQueryGameByID},
{fn: testQueryGameByAddr},
{fn: testQueryGameByStatus},
{fn: testQueryGameByRound},
}
for index, testCase := range testCases {
err := testCase.fn(t, jrpcClient)
if err == nil {
continue
assert.Equal(t, err, types.ErrNotFound, fmt.Sprint(index))
}
assert.NotEqualf(t, err, types.ErrActionNotSupport, "test index %d", index)
if strings.Contains(err.Error(), "rpc: can't find") {
assert.FailNowf(t, err.Error(), "test index %d", index)
testCases = []struct {
fn func(*testing.T, *jsonclient.JSONClient) error
}{
{fn: testQueryGameByIDs},
}
for index, testCase := range testCases {
err := testCase.fn(t, jrpcClient)
assert.Equal(t, err, nil, fmt.Sprint(index))
}
}
func testStartRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.PBStartTxReq{}
payload := &pty.PBGameStart{Value: 123}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pty.PokerBullX),
ActionName: pty.CreateStartTx,
Payload: types.MustPBToJSON(payload),
}
var res string
return jrpc.Call("pokerbull.PokerBullStartTx", params, &res)
return jrpc.Call("Chain33.CreateTransaction", params, &res)
}
func testContinueRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.PBContinueTxReq{}
payload := &pty.PBGameContinue{GameId: "123"}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pty.PokerBullX),
ActionName: pty.CreateContinueTx,
Payload: types.MustPBToJSON(payload),
}
var res string
return jrpc.Call("pokerbull.PokerBullContinueTx", params, &res)
return jrpc.Call("Chain33.CreateTransaction", params, &res)
}
func testQuitRawTxCmd(t *testing.T, jrpc *jsonclient.JSONClient) error {
params := pty.PBContinueTxReq{}
payload := &pty.PBGameQuit{GameId: "123"}
params := &rpctypes.CreateTxIn{
Execer: types.ExecName(pty.PokerBullX),
ActionName: pty.CreatequitTx,
Payload: types.MustPBToJSON(payload),
}
var res string
return jrpc.Call("pokerbull.PokerBullQuitTx", params, &res)
return jrpc.Call("Chain33.CreateTransaction", params, &res)
}
func testQueryGameByID(t *testing.T, jrpc *jsonclient.JSONClient) error {
var rep interface{}
var params rpctypes.Query4Jrpc
req := &pty.QueryPBGameInfo{}
params.Execer = "pokerbull"
params.FuncName = "QueryGameByID"
params.Execer = pty.PokerBullX
params.FuncName = pty.FuncNameQueryGameByID
params.Payload = types.MustPBToJSON(req)
rep = &pty.ReplyPBGame{}
return jrpc.Call("Chain33.Query", params, rep)
......@@ -89,8 +119,41 @@ func testQueryGameByAddr(t *testing.T, jrpc *jsonclient.JSONClient) error {
var rep interface{}
var params rpctypes.Query4Jrpc
req := &pty.QueryPBGameInfo{}
params.Execer = "pokerbull"
params.FuncName = "QueryGameByAddr"
params.Execer = pty.PokerBullX
params.FuncName = pty.FuncNameQueryGameByAddr
params.Payload = types.MustPBToJSON(req)
rep = &pty.PBGameRecords{}
return jrpc.Call("Chain33.Query", params, rep)
}
func testQueryGameByIDs(t *testing.T, jrpc *jsonclient.JSONClient) error {
var rep interface{}
var params rpctypes.Query4Jrpc
req := &pty.QueryPBGameInfos{}
params.Execer = pty.PokerBullX
params.FuncName = pty.FuncNameQueryGameListByIDs
params.Payload = types.MustPBToJSON(req)
rep = &pty.ReplyPBGameList{}
return jrpc.Call("Chain33.Query", params, rep)
}
func testQueryGameByStatus(t *testing.T, jrpc *jsonclient.JSONClient) error {
var rep interface{}
var params rpctypes.Query4Jrpc
req := &pty.QueryPBGameInfo{}
params.Execer = pty.PokerBullX
params.FuncName = pty.FuncNameQueryGameByStatus
params.Payload = types.MustPBToJSON(req)
rep = &pty.PBGameRecords{}
return jrpc.Call("Chain33.Query", params, rep)
}
func testQueryGameByRound(t *testing.T, jrpc *jsonclient.JSONClient) error {
var rep interface{}
var params rpctypes.Query4Jrpc
req := &pty.QueryPBGameByRound{}
params.Execer = pty.PokerBullX
params.FuncName = pty.FuncNameQueryGameByRound
params.Payload = types.MustPBToJSON(req)
rep = &pty.PBGameRecords{}
return jrpc.Call("Chain33.Query", params, rep)
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package rpc
import (
"context"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/pokerbull/executor"
pb "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
"github.com/pkg/errors"
)
func (c *channelClient) Start(ctx context.Context, head *pb.PBGameStart) (*types.UnsignTx, error) {
if head.PlayerNum > executor.MaxPlayerNum {
return nil, errors.New("Player number should be maximum 5")
}
val := &pb.PBGameAction{
Ty: pb.PBGameActionStart,
Value: &pb.PBGameAction_Start{Start: head},
}
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val))
if err != nil {
return nil, err
}
data := types.Encode(tx)
return &types.UnsignTx{Data: data}, nil
}
func (c *channelClient) Continue(ctx context.Context, head *pb.PBGameContinue) (*types.UnsignTx, error) {
val := &pb.PBGameAction{
Ty: pb.PBGameActionContinue,
Value: &pb.PBGameAction_Continue{Continue: head},
}
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val))
if err != nil {
return nil, err
}
data := types.Encode(tx)
return &types.UnsignTx{Data: data}, nil
}
func (c *channelClient) Quit(ctx context.Context, head *pb.PBGameQuit) (*types.UnsignTx, error) {
val := &pb.PBGameAction{
Ty: pb.PBGameActionQuit,
Value: &pb.PBGameAction_Quit{Quit: head},
}
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val))
if err != nil {
return nil, err
}
data := types.Encode(tx)
return &types.UnsignTx{Data: data}, nil
}
func (c *channelClient) Show(ctx context.Context, head *pb.PBGameQuery) (*types.UnsignTx, error) {
val := &pb.PBGameAction{
Ty: pb.PBGameActionQuery,
Value: &pb.PBGameAction_Query{Query: head},
}
tx, err := types.CreateFormatTx(pb.PokerBullX, types.Encode(val))
if err != nil {
return nil, err
}
data := types.Encode(tx)
return &types.UnsignTx{Data: data}, nil
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package rpc
import (
"github.com/33cn/chain33/rpc/types"
)
// Jrpc jrpc句柄
type Jrpc struct {
cli *channelClient
}
// Grpc grpc句柄
type Grpc struct {
*channelClient
}
type channelClient struct {
types.ChannelClient
}
// Init 初始化rpc
func Init(name string, s types.RPCServer) {
cli := &channelClient{}
grpc := &Grpc{channelClient: cli}
cli.Init(name, s, &Jrpc{cli: cli}, grpc)
}
......@@ -4,6 +4,8 @@
package types
import "github.com/33cn/chain33/types"
//game action ty
const (
PBGameActionStart = iota + 1
......@@ -48,4 +50,35 @@ const (
FuncNameQueryGameByAddr = "QueryGameByAddr"
// FuncNameQueryGameByStatus 根据status查询game
FuncNameQueryGameByStatus = "QueryGameByStatus"
// FuncNameQueryGameByRound 查询某一回合游戏结果
FuncNameQueryGameByRound = "QueryGameByRound"
// CreateStartTx 创建开始交易
CreateStartTx = "Start"
// CreateContinueTx 创建继续交易
CreateContinueTx = "Continue"
// CreatequitTx 创建退出交易
CreatequitTx = "Quit"
)
const (
// ListDESC 降序
ListDESC = int32(0)
// DefaultCount 默认一次取多少条记录
DefaultCount = int32(20)
// MaxPlayerNum 最大玩家数
MaxPlayerNum = 5
// MinPlayValue 最小赌注
MinPlayValue = 10 * types.Coin
// DefaultStyle 默认游戏类型
DefaultStyle = PlayStyleDefault
// PlatformAddress 平台地址
PlatformAddress = "1PHtChNt3UcfssR7v7trKSk3WJtAWjKjjX"
// PlatformFee 平台佣金
PlatformFee = int64(0.005 * float64(types.Coin))
// DeveloperAddress 开发着地址
DeveloperAddress = "1D6RFZNp2rh6QdbcZ1d7RWuBUz61We6SD7"
// DeveloperFee 开发者佣金
DeveloperFee = int64(0.005 * float64(types.Coin))
// WinnerReturn 赢家回报率
WinnerReturn = types.Coin - DeveloperFee
)
......@@ -4,13 +4,10 @@
package types
import (
context "context"
fmt "fmt"
math "math"
types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
)
// Reference imports to suppress errors if they are not otherwise used.
......@@ -42,6 +39,7 @@ type PokerBull struct {
DealerAddr string `protobuf:"bytes,14,opt,name=dealerAddr,proto3" json:"dealerAddr,omitempty"`
IsWaiting bool `protobuf:"varint,15,opt,name=isWaiting,proto3" json:"isWaiting,omitempty"`
PreStatus int32 `protobuf:"varint,16,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Round int32 `protobuf:"varint,17,opt,name=round,proto3" json:"round,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -184,6 +182,13 @@ func (m *PokerBull) GetPreStatus() int32 {
return 0
}
func (m *PokerBull) GetRound() int32 {
if m != nil {
return m.Round
}
return 0
}
//一把牌
type PBHand struct {
Cards []int32 `protobuf:"varint,1,rep,packed,name=cards,proto3" json:"cards,omitempty"`
......@@ -1027,6 +1032,45 @@ func (m *PBGameRecords) GetRecords() []*PBGameRecord {
return nil
}
type PBGameIndexRecords struct {
Records []*PBGameIndexRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PBGameIndexRecords) Reset() { *m = PBGameIndexRecords{} }
func (m *PBGameIndexRecords) String() string { return proto.CompactTextString(m) }
func (*PBGameIndexRecords) ProtoMessage() {}
func (*PBGameIndexRecords) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{14}
}
func (m *PBGameIndexRecords) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PBGameIndexRecords.Unmarshal(m, b)
}
func (m *PBGameIndexRecords) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PBGameIndexRecords.Marshal(b, m, deterministic)
}
func (m *PBGameIndexRecords) XXX_Merge(src proto.Message) {
xxx_messageInfo_PBGameIndexRecords.Merge(m, src)
}
func (m *PBGameIndexRecords) XXX_Size() int {
return xxx_messageInfo_PBGameIndexRecords.Size(m)
}
func (m *PBGameIndexRecords) XXX_DiscardUnknown() {
xxx_messageInfo_PBGameIndexRecords.DiscardUnknown(m)
}
var xxx_messageInfo_PBGameIndexRecords proto.InternalMessageInfo
func (m *PBGameIndexRecords) GetRecords() []*PBGameIndexRecord {
if m != nil {
return m.Records
}
return nil
}
type QueryPBGameInfo struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"`
......@@ -1041,7 +1085,7 @@ func (m *QueryPBGameInfo) Reset() { *m = QueryPBGameInfo{} }
func (m *QueryPBGameInfo) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameInfo) ProtoMessage() {}
func (*QueryPBGameInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{14}
return fileDescriptor_8d22e4ee2313e311, []int{15}
}
func (m *QueryPBGameInfo) XXX_Unmarshal(b []byte) error {
......@@ -1101,7 +1145,7 @@ func (m *ReplyPBGame) Reset() { *m = ReplyPBGame{} }
func (m *ReplyPBGame) String() string { return proto.CompactTextString(m) }
func (*ReplyPBGame) ProtoMessage() {}
func (*ReplyPBGame) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{15}
return fileDescriptor_8d22e4ee2313e311, []int{16}
}
func (m *ReplyPBGame) XXX_Unmarshal(b []byte) error {
......@@ -1140,7 +1184,7 @@ func (m *QueryPBGameInfos) Reset() { *m = QueryPBGameInfos{} }
func (m *QueryPBGameInfos) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameInfos) ProtoMessage() {}
func (*QueryPBGameInfos) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{16}
return fileDescriptor_8d22e4ee2313e311, []int{17}
}
func (m *QueryPBGameInfos) XXX_Unmarshal(b []byte) error {
......@@ -1179,7 +1223,7 @@ func (m *ReplyPBGameList) Reset() { *m = ReplyPBGameList{} }
func (m *ReplyPBGameList) String() string { return proto.CompactTextString(m) }
func (*ReplyPBGameList) ProtoMessage() {}
func (*ReplyPBGameList) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{17}
return fileDescriptor_8d22e4ee2313e311, []int{18}
}
func (m *ReplyPBGameList) XXX_Unmarshal(b []byte) error {
......@@ -1207,6 +1251,142 @@ func (m *ReplyPBGameList) GetGames() []*PokerBull {
return nil
}
// QueryPBGameByRound 根据gameId和回合数查询某回合的游戏结果
type QueryPBGameByRound struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Round int32 `protobuf:"varint,2,opt,name=round,proto3" json:"round,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryPBGameByRound) Reset() { *m = QueryPBGameByRound{} }
func (m *QueryPBGameByRound) String() string { return proto.CompactTextString(m) }
func (*QueryPBGameByRound) ProtoMessage() {}
func (*QueryPBGameByRound) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{19}
}
func (m *QueryPBGameByRound) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryPBGameByRound.Unmarshal(m, b)
}
func (m *QueryPBGameByRound) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_QueryPBGameByRound.Marshal(b, m, deterministic)
}
func (m *QueryPBGameByRound) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryPBGameByRound.Merge(m, src)
}
func (m *QueryPBGameByRound) XXX_Size() int {
return xxx_messageInfo_QueryPBGameByRound.Size(m)
}
func (m *QueryPBGameByRound) XXX_DiscardUnknown() {
xxx_messageInfo_QueryPBGameByRound.DiscardUnknown(m)
}
var xxx_messageInfo_QueryPBGameByRound proto.InternalMessageInfo
func (m *QueryPBGameByRound) GetGameId() string {
if m != nil {
return m.GameId
}
return ""
}
func (m *QueryPBGameByRound) GetRound() int32 {
if m != nil {
return m.Round
}
return 0
}
// ReplyPBGameByRound 某一回合游戏结果
type ReplyPBGameByRound struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
Result *PBResult `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
IsWaiting bool `protobuf:"varint,4,opt,name=isWaiting,proto3" json:"isWaiting,omitempty"`
Value int64 `protobuf:"varint,5,opt,name=value,proto3" json:"value,omitempty"`
Players []*PBPlayer `protobuf:"bytes,6,rep,name=players,proto3" json:"players,omitempty"`
Return int64 `protobuf:"varint,7,opt,name=return,proto3" json:"return,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReplyPBGameByRound) Reset() { *m = ReplyPBGameByRound{} }
func (m *ReplyPBGameByRound) String() string { return proto.CompactTextString(m) }
func (*ReplyPBGameByRound) ProtoMessage() {}
func (*ReplyPBGameByRound) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{20}
}
func (m *ReplyPBGameByRound) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReplyPBGameByRound.Unmarshal(m, b)
}
func (m *ReplyPBGameByRound) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReplyPBGameByRound.Marshal(b, m, deterministic)
}
func (m *ReplyPBGameByRound) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReplyPBGameByRound.Merge(m, src)
}
func (m *ReplyPBGameByRound) XXX_Size() int {
return xxx_messageInfo_ReplyPBGameByRound.Size(m)
}
func (m *ReplyPBGameByRound) XXX_DiscardUnknown() {
xxx_messageInfo_ReplyPBGameByRound.DiscardUnknown(m)
}
var xxx_messageInfo_ReplyPBGameByRound proto.InternalMessageInfo
func (m *ReplyPBGameByRound) GetGameId() string {
if m != nil {
return m.GameId
}
return ""
}
func (m *ReplyPBGameByRound) GetStatus() int32 {
if m != nil {
return m.Status
}
return 0
}
func (m *ReplyPBGameByRound) GetResult() *PBResult {
if m != nil {
return m.Result
}
return nil
}
func (m *ReplyPBGameByRound) GetIsWaiting() bool {
if m != nil {
return m.IsWaiting
}
return false
}
func (m *ReplyPBGameByRound) GetValue() int64 {
if m != nil {
return m.Value
}
return 0
}
func (m *ReplyPBGameByRound) GetPlayers() []*PBPlayer {
if m != nil {
return m.Players
}
return nil
}
func (m *ReplyPBGameByRound) GetReturn() int64 {
if m != nil {
return m.Return
}
return 0
}
type ReceiptPBGame struct {
GameId string `protobuf:"bytes,1,opt,name=gameId,proto3" json:"gameId,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
......@@ -1218,6 +1398,7 @@ type ReceiptPBGame struct {
IsWaiting bool `protobuf:"varint,8,opt,name=isWaiting,proto3" json:"isWaiting,omitempty"`
Players []string `protobuf:"bytes,9,rep,name=players,proto3" json:"players,omitempty"`
PreStatus int32 `protobuf:"varint,10,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Round int32 `protobuf:"varint,11,opt,name=round,proto3" json:"round,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1227,7 +1408,7 @@ func (m *ReceiptPBGame) Reset() { *m = ReceiptPBGame{} }
func (m *ReceiptPBGame) String() string { return proto.CompactTextString(m) }
func (*ReceiptPBGame) ProtoMessage() {}
func (*ReceiptPBGame) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{18}
return fileDescriptor_8d22e4ee2313e311, []int{21}
}
func (m *ReceiptPBGame) XXX_Unmarshal(b []byte) error {
......@@ -1318,6 +1499,13 @@ func (m *ReceiptPBGame) GetPreStatus() int32 {
return 0
}
func (m *ReceiptPBGame) GetRound() int32 {
if m != nil {
return m.Round
}
return 0
}
type PBStartTxReq struct {
Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
PlayerNum int32 `protobuf:"varint,2,opt,name=playerNum,proto3" json:"playerNum,omitempty"`
......@@ -1331,7 +1519,7 @@ func (m *PBStartTxReq) Reset() { *m = PBStartTxReq{} }
func (m *PBStartTxReq) String() string { return proto.CompactTextString(m) }
func (*PBStartTxReq) ProtoMessage() {}
func (*PBStartTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{19}
return fileDescriptor_8d22e4ee2313e311, []int{22}
}
func (m *PBStartTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1385,7 +1573,7 @@ func (m *PBContinueTxReq) Reset() { *m = PBContinueTxReq{} }
func (m *PBContinueTxReq) String() string { return proto.CompactTextString(m) }
func (*PBContinueTxReq) ProtoMessage() {}
func (*PBContinueTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{20}
return fileDescriptor_8d22e4ee2313e311, []int{23}
}
func (m *PBContinueTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1432,7 +1620,7 @@ func (m *PBQuitTxReq) Reset() { *m = PBQuitTxReq{} }
func (m *PBQuitTxReq) String() string { return proto.CompactTextString(m) }
func (*PBQuitTxReq) ProtoMessage() {}
func (*PBQuitTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{21}
return fileDescriptor_8d22e4ee2313e311, []int{24}
}
func (m *PBQuitTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1479,7 +1667,7 @@ func (m *PBQueryReq) Reset() { *m = PBQueryReq{} }
func (m *PBQueryReq) String() string { return proto.CompactTextString(m) }
func (*PBQueryReq) ProtoMessage() {}
func (*PBQueryReq) Descriptor() ([]byte, []int) {
return fileDescriptor_8d22e4ee2313e311, []int{22}
return fileDescriptor_8d22e4ee2313e311, []int{25}
}
func (m *PBQueryReq) XXX_Unmarshal(b []byte) error {
......@@ -1529,10 +1717,13 @@ func init() {
proto.RegisterType((*PBGameRecord)(nil), "types.PBGameRecord")
proto.RegisterType((*PBGameIndexRecord)(nil), "types.PBGameIndexRecord")
proto.RegisterType((*PBGameRecords)(nil), "types.PBGameRecords")
proto.RegisterType((*PBGameIndexRecords)(nil), "types.PBGameIndexRecords")
proto.RegisterType((*QueryPBGameInfo)(nil), "types.QueryPBGameInfo")
proto.RegisterType((*ReplyPBGame)(nil), "types.ReplyPBGame")
proto.RegisterType((*QueryPBGameInfos)(nil), "types.QueryPBGameInfos")
proto.RegisterType((*ReplyPBGameList)(nil), "types.ReplyPBGameList")
proto.RegisterType((*QueryPBGameByRound)(nil), "types.QueryPBGameByRound")
proto.RegisterType((*ReplyPBGameByRound)(nil), "types.ReplyPBGameByRound")
proto.RegisterType((*ReceiptPBGame)(nil), "types.ReceiptPBGame")
proto.RegisterType((*PBStartTxReq)(nil), "types.PBStartTxReq")
proto.RegisterType((*PBContinueTxReq)(nil), "types.PBContinueTxReq")
......@@ -1543,211 +1734,69 @@ func init() {
func init() { proto.RegisterFile("pokerbull.proto", fileDescriptor_8d22e4ee2313e311) }
var fileDescriptor_8d22e4ee2313e311 = []byte{
// 984 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44,
0x14, 0xae, 0xe3, 0x38, 0x3f, 0xc7, 0xdb, 0xa4, 0x1d, 0xa0, 0xb2, 0x2a, 0x84, 0x22, 0x6f, 0x59,
0x02, 0x5a, 0x7a, 0x91, 0x22, 0xd0, 0x0a, 0x09, 0x29, 0xe1, 0x82, 0x56, 0x5a, 0xa1, 0x74, 0x5a,
0xb4, 0xd7, 0xde, 0x78, 0xb6, 0x6b, 0xad, 0xeb, 0xa4, 0xf6, 0xb8, 0xdb, 0xdc, 0xf2, 0x06, 0x3c,
0x01, 0x17, 0x3c, 0x17, 0xcf, 0xc1, 0x2d, 0x9a, 0x73, 0x66, 0xfc, 0xb7, 0x8e, 0xa0, 0x7b, 0x37,
0xe7, 0x67, 0xce, 0x7c, 0xe7, 0x7f, 0x60, 0xbc, 0x59, 0xbf, 0x13, 0xe9, 0xeb, 0x3c, 0x8e, 0x4f,
0x37, 0xe9, 0x5a, 0xae, 0x99, 0x23, 0xb7, 0x1b, 0x91, 0x1d, 0x1f, 0xca, 0x34, 0x48, 0xb2, 0x60,
0x25, 0xa3, 0x75, 0x42, 0x12, 0xff, 0x1f, 0x1b, 0x86, 0x4b, 0xa5, 0xbd, 0xc8, 0xe3, 0x98, 0x1d,
0x41, 0xef, 0x26, 0xb8, 0x15, 0x17, 0xa1, 0x67, 0x4d, 0xac, 0xe9, 0x90, 0x6b, 0x4a, 0xf1, 0x33,
0x19, 0xc8, 0x3c, 0xf3, 0x3a, 0x13, 0x6b, 0xea, 0x70, 0x4d, 0xb1, 0xcf, 0x61, 0x98, 0xc9, 0x20,
0x95, 0xd7, 0xd1, 0xad, 0xf0, 0xec, 0x89, 0x35, 0xb5, 0x79, 0xc9, 0x60, 0x13, 0x70, 0x89, 0x78,
0x38, 0x0f, 0xb2, 0xb7, 0x5e, 0x17, 0x4d, 0x56, 0x59, 0xec, 0x53, 0x70, 0xee, 0x83, 0x38, 0x17,
0x9e, 0x83, 0x77, 0x89, 0x60, 0x27, 0xe0, 0xa0, 0x03, 0x5e, 0x6f, 0x62, 0x4d, 0xdd, 0xd9, 0xe8,
0x14, 0xd1, 0x9f, 0x2e, 0x17, 0x08, 0x94, 0x93, 0x90, 0x7d, 0x0d, 0xfd, 0x4d, 0x1c, 0x6c, 0x45,
0x9a, 0x79, 0xfd, 0x89, 0x3d, 0x75, 0x67, 0xe3, 0x52, 0x0f, 0xf9, 0xdc, 0xc8, 0x15, 0x4c, 0x3a,
0xfe, 0x9a, 0xdf, 0x7a, 0x03, 0xf4, 0xa0, 0x64, 0x28, 0x43, 0xa9, 0xc8, 0xf2, 0x58, 0x66, 0xde,
0xb0, 0x61, 0x88, 0x23, 0x9f, 0x1b, 0xb9, 0xc2, 0x1b, 0x25, 0xa1, 0x78, 0xf0, 0x80, 0xf0, 0x22,
0x81, 0xe6, 0x53, 0x71, 0x7f, 0x81, 0x12, 0x97, 0xa2, 0x50, 0x30, 0xd8, 0x31, 0x0c, 0xee, 0xf2,
0x88, 0x42, 0xf4, 0x04, 0x85, 0x05, 0xcd, 0xbe, 0x00, 0xc0, 0x33, 0x05, 0x68, 0x1f, 0x03, 0x54,
0xe1, 0x28, 0x79, 0x28, 0x82, 0x58, 0xa4, 0xf3, 0x30, 0x4c, 0xbd, 0x11, 0xc9, 0x4b, 0x8e, 0x7a,
0x39, 0xca, 0x5e, 0x05, 0x91, 0x8c, 0x92, 0x1b, 0x6f, 0x3c, 0xb1, 0xa6, 0x03, 0x5e, 0x32, 0x34,
0xae, 0x2b, 0x4a, 0xdc, 0x81, 0x76, 0xdb, 0x30, 0xfc, 0xdf, 0x2d, 0xe8, 0x2d, 0x17, 0xe7, 0x41,
0x12, 0x2a, 0xb7, 0x56, 0x41, 0x1a, 0x66, 0x9e, 0x35, 0xb1, 0xa7, 0x0e, 0x27, 0x42, 0x25, 0x9d,
0xfc, 0x36, 0x49, 0x27, 0x8a, 0x79, 0xd0, 0x0f, 0xc2, 0x30, 0x15, 0x59, 0x86, 0x29, 0x1f, 0x72,
0x43, 0x62, 0x78, 0xb2, 0x57, 0x51, 0x82, 0xa9, 0x1e, 0x70, 0x22, 0x54, 0x00, 0x62, 0x71, 0x2f,
0xd2, 0xe0, 0x86, 0xf2, 0xec, 0xf0, 0x82, 0xf6, 0xdf, 0xc3, 0xc0, 0xa4, 0x8b, 0x3d, 0x05, 0xe7,
0x6d, 0x90, 0x68, 0x14, 0xee, 0x6c, 0xbf, 0xc8, 0x82, 0xc2, 0xc8, 0x49, 0x56, 0x7d, 0xbc, 0x53,
0x7f, 0xfc, 0x08, 0x7a, 0x92, 0xe2, 0x48, 0x85, 0xa8, 0x29, 0x05, 0x2a, 0x15, 0x41, 0xb8, 0x35,
0xa0, 0x90, 0xf0, 0xff, 0xb2, 0xd4, 0xcb, 0x94, 0xdf, 0xff, 0xf7, 0xf2, 0x11, 0xf4, 0xde, 0x47,
0x49, 0x22, 0x52, 0xfd, 0xb0, 0xa6, 0x6a, 0xee, 0xd9, 0x75, 0xf7, 0xd4, 0x1d, 0xca, 0x96, 0x2e,
0x7e, 0x4d, 0xb1, 0x67, 0x30, 0xa2, 0xd3, 0xcb, 0x7a, 0x60, 0x1a, 0x5c, 0xff, 0x05, 0xf4, 0x75,
0xd5, 0xef, 0xc8, 0x91, 0x07, 0xfd, 0xcd, 0x3a, 0x4a, 0xa4, 0x46, 0xe5, 0x70, 0x43, 0xfa, 0x7f,
0x5b, 0xf0, 0x64, 0xb9, 0xf8, 0x25, 0xb8, 0x15, 0x73, 0xec, 0x77, 0xf6, 0x0d, 0x38, 0xd8, 0x7a,
0xd8, 0xda, 0xee, 0x8c, 0x15, 0x4e, 0x2a, 0x9d, 0x2b, 0x25, 0x39, 0xdf, 0xe3, 0xa4, 0xc2, 0xce,
0x60, 0xb0, 0x5a, 0x27, 0x32, 0x4a, 0x72, 0x81, 0x76, 0xdd, 0xd9, 0x67, 0x35, 0xf5, 0x9f, 0xb5,
0xf0, 0x7c, 0x8f, 0x17, 0x8a, 0xec, 0x2b, 0xe8, 0xaa, 0xd2, 0xc5, 0x20, 0xb8, 0xb3, 0xc3, 0xda,
0x85, 0xcb, 0x3c, 0x52, 0xe6, 0x51, 0x41, 0x21, 0xb9, 0xcb, 0x45, 0x4a, 0x19, 0x69, 0x22, 0xb9,
0x54, 0x12, 0x85, 0x04, 0x55, 0xd8, 0x08, 0x3a, 0x72, 0x8b, 0xed, 0xe6, 0xf0, 0x8e, 0xdc, 0x2e,
0xfa, 0x7a, 0x62, 0xf8, 0x73, 0x70, 0x2b, 0xd0, 0xcb, 0x49, 0x62, 0x55, 0x27, 0x49, 0xad, 0xf1,
0x3b, 0x8d, 0xc6, 0xf7, 0xa7, 0x30, 0xaa, 0xbb, 0xb3, 0x6b, 0xfe, 0xf9, 0x27, 0x00, 0xa5, 0x1f,
0x3b, 0xb5, 0xbe, 0x34, 0x90, 0xd0, 0x87, 0x9d, 0x6a, 0x77, 0xf0, 0x14, 0x15, 0x48, 0xf7, 0x65,
0x94, 0xc9, 0xc5, 0x96, 0x7a, 0x72, 0x9e, 0x84, 0xcb, 0x62, 0x2c, 0x95, 0x33, 0xd7, 0x6a, 0xce,
0xdc, 0xdd, 0x3e, 0x95, 0x13, 0xca, 0xae, 0x4c, 0x28, 0xff, 0xda, 0xd4, 0x02, 0x17, 0xab, 0x75,
0x1a, 0x3e, 0x7a, 0xce, 0xb7, 0x5b, 0x9d, 0xc3, 0x21, 0x59, 0xc5, 0x41, 0xf7, 0x1f, 0xa6, 0x0b,
0x13, 0x9d, 0xaa, 0x89, 0x9f, 0x60, 0xbf, 0x0a, 0x2c, 0x63, 0xdf, 0xaa, 0x61, 0x8c, 0x47, 0xdd,
0x8c, 0x9f, 0xd4, 0xaa, 0x83, 0xd4, 0xb8, 0xd1, 0xf1, 0xdf, 0xc1, 0xb8, 0x12, 0xcb, 0x8b, 0xe4,
0xcd, 0x7a, 0x27, 0x00, 0x06, 0x5d, 0x35, 0x2a, 0x74, 0xf7, 0xe2, 0xb9, 0xe2, 0xaf, 0xdd, 0xee,
0x6f, 0xb7, 0x0a, 0xf6, 0x0c, 0x5c, 0x2e, 0x36, 0xb1, 0x7e, 0x8c, 0x9d, 0x40, 0x57, 0x99, 0xd6,
0xfd, 0x74, 0x60, 0x70, 0x9a, 0x65, 0xca, 0x51, 0xea, 0x3f, 0x87, 0x83, 0x06, 0x42, 0xec, 0x5a,
0x02, 0x45, 0x4e, 0x0e, 0xb9, 0x21, 0xfd, 0x17, 0x30, 0xae, 0x3c, 0xa1, 0x6a, 0x83, 0x3d, 0x03,
0x47, 0x49, 0x4d, 0x3c, 0x3e, 0x7c, 0x87, 0xc4, 0xfe, 0x1f, 0x1d, 0xd8, 0xe7, 0x62, 0x25, 0xa2,
0x8d, 0xd4, 0x00, 0x1f, 0x9b, 0x65, 0x13, 0x21, 0xbb, 0x12, 0xa1, 0xd6, 0x48, 0xd4, 0x37, 0x9e,
0xd3, 0xdc, 0x78, 0xb5, 0x0a, 0xed, 0xb5, 0x54, 0x28, 0x75, 0x6a, 0xbf, 0xd1, 0xa9, 0xe5, 0x26,
0x1b, 0x34, 0x37, 0x99, 0x57, 0xee, 0xfa, 0x21, 0x05, 0xac, 0xba, 0xda, 0x8b, 0x1d, 0x07, 0xcd,
0x1d, 0x87, 0x75, 0x7f, 0x45, 0x1f, 0x0e, 0x2e, 0xee, 0x3e, 0x66, 0x4a, 0xb0, 0x03, 0xb0, 0xdf,
0x08, 0xf3, 0xbb, 0x51, 0x47, 0xff, 0x47, 0x18, 0x2f, 0x17, 0x66, 0x66, 0x90, 0xe1, 0x5d, 0xa1,
0xd6, 0x97, 0x3b, 0xe5, 0xe5, 0x1f, 0xd4, 0x90, 0xb8, 0xc4, 0x15, 0xff, 0xb8, 0x8b, 0xdf, 0xab,
0x19, 0x84, 0xa5, 0xf4, 0xa8, 0x7b, 0xb3, 0x3f, 0x2d, 0x18, 0x16, 0xff, 0x41, 0x76, 0x0a, 0x0e,
0x0d, 0xcc, 0x96, 0xf9, 0x7f, 0x6c, 0x3e, 0x3e, 0xbf, 0x25, 0x59, 0x74, 0x93, 0x5c, 0x3f, 0xf8,
0x7b, 0xec, 0x3b, 0x18, 0x14, 0xd3, 0xb1, 0x7d, 0x07, 0xb4, 0xdd, 0x7a, 0x0e, 0x5d, 0x9c, 0x94,
0x1f, 0x2e, 0x81, 0x16, 0xed, 0xd7, 0x3d, 0xfc, 0x8a, 0x9e, 0xfd, 0x1b, 0x00, 0x00, 0xff, 0xff,
0x0c, 0xc9, 0x5f, 0x3c, 0xb7, 0x0a, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4
// PokerbullClient is the client API for Pokerbull service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PokerbullClient interface {
//游戏开始
Start(ctx context.Context, in *PBGameStart, opts ...grpc.CallOption) (*types.UnsignTx, error)
//游戏继续
Continue(ctx context.Context, in *PBGameContinue, opts ...grpc.CallOption) (*types.UnsignTx, error)
//游戏结束
Quit(ctx context.Context, in *PBGameQuit, opts ...grpc.CallOption) (*types.UnsignTx, error)
}
type pokerbullClient struct {
cc *grpc.ClientConn
}
func NewPokerbullClient(cc *grpc.ClientConn) PokerbullClient {
return &pokerbullClient{cc}
}
func (c *pokerbullClient) Start(ctx context.Context, in *PBGameStart, opts ...grpc.CallOption) (*types.UnsignTx, error) {
out := new(types.UnsignTx)
err := c.cc.Invoke(ctx, "/types.pokerbull/Start", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *pokerbullClient) Continue(ctx context.Context, in *PBGameContinue, opts ...grpc.CallOption) (*types.UnsignTx, error) {
out := new(types.UnsignTx)
err := c.cc.Invoke(ctx, "/types.pokerbull/Continue", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *pokerbullClient) Quit(ctx context.Context, in *PBGameQuit, opts ...grpc.CallOption) (*types.UnsignTx, error) {
out := new(types.UnsignTx)
err := c.cc.Invoke(ctx, "/types.pokerbull/Quit", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// PokerbullServer is the server API for Pokerbull service.
type PokerbullServer interface {
//游戏开始
Start(context.Context, *PBGameStart) (*types.UnsignTx, error)
//游戏继续
Continue(context.Context, *PBGameContinue) (*types.UnsignTx, error)
//游戏结束
Quit(context.Context, *PBGameQuit) (*types.UnsignTx, error)
}
func RegisterPokerbullServer(s *grpc.Server, srv PokerbullServer) {
s.RegisterService(&_Pokerbull_serviceDesc, srv)
}
func _Pokerbull_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PBGameStart)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(PokerbullServer).Start(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/types.pokerbull/Start",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PokerbullServer).Start(ctx, req.(*PBGameStart))
}
return interceptor(ctx, in, info, handler)
}
func _Pokerbull_Continue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PBGameContinue)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(PokerbullServer).Continue(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/types.pokerbull/Continue",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PokerbullServer).Continue(ctx, req.(*PBGameContinue))
}
return interceptor(ctx, in, info, handler)
}
func _Pokerbull_Quit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(PBGameQuit)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(PokerbullServer).Quit(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/types.pokerbull/Quit",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(PokerbullServer).Quit(ctx, req.(*PBGameQuit))
}
return interceptor(ctx, in, info, handler)
}
var _Pokerbull_serviceDesc = grpc.ServiceDesc{
ServiceName: "types.pokerbull",
HandlerType: (*PokerbullServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "Start",
Handler: _Pokerbull_Start_Handler,
},
{
MethodName: "Continue",
Handler: _Pokerbull_Continue_Handler,
},
{
MethodName: "Quit",
Handler: _Pokerbull_Quit_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "pokerbull.proto",
// 1021 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4b, 0x6f, 0x23, 0x45,
0x10, 0xde, 0xb1, 0x3d, 0x7e, 0xd4, 0x6c, 0xec, 0xa4, 0x81, 0xa8, 0x85, 0x10, 0xb2, 0x66, 0xc3,
0xae, 0x41, 0x90, 0x83, 0x23, 0x81, 0x56, 0x48, 0x48, 0x36, 0x07, 0x1c, 0x69, 0x85, 0x9c, 0xce,
0x4a, 0x7b, 0x9e, 0xf5, 0xf4, 0x66, 0x47, 0x3b, 0x19, 0x3b, 0xf3, 0xc8, 0xc6, 0x57, 0xee, 0xfc,
0x0a, 0x0e, 0xfc, 0x2a, 0x6e, 0xfc, 0x10, 0xd4, 0x55, 0xdd, 0x33, 0x3d, 0x13, 0x9b, 0x10, 0x6e,
0x5d, 0x8f, 0xae, 0xae, 0x57, 0x7f, 0x55, 0x30, 0xda, 0xac, 0x3f, 0xc8, 0xf4, 0x6d, 0x11, 0xc7,
0xa7, 0x9b, 0x74, 0x9d, 0xaf, 0x99, 0x9b, 0x6f, 0x37, 0x32, 0xf3, 0x7f, 0xef, 0xc0, 0x60, 0xa9,
0x44, 0xf3, 0x22, 0x8e, 0xd9, 0x31, 0x74, 0xaf, 0x82, 0x6b, 0x79, 0x1e, 0x72, 0x67, 0xec, 0x4c,
0x06, 0x42, 0x53, 0x8a, 0x9f, 0xe5, 0x41, 0x5e, 0x64, 0xbc, 0x35, 0x76, 0x26, 0xae, 0xd0, 0x14,
0xfb, 0x02, 0x06, 0x59, 0x1e, 0xa4, 0xf9, 0xeb, 0xe8, 0x5a, 0xf2, 0xf6, 0xd8, 0x99, 0xb4, 0x45,
0xc5, 0x60, 0x63, 0xf0, 0x88, 0xb8, 0x5b, 0x04, 0xd9, 0x7b, 0xde, 0x41, 0x93, 0x36, 0x8b, 0x7d,
0x0a, 0xee, 0x6d, 0x10, 0x17, 0x92, 0xbb, 0x78, 0x97, 0x08, 0x76, 0x02, 0x2e, 0x7a, 0xcb, 0xbb,
0x63, 0x67, 0xe2, 0x4d, 0x87, 0xa7, 0xe8, 0xea, 0xe9, 0x72, 0x8e, 0x8e, 0x0a, 0x12, 0xb2, 0xaf,
0xa1, 0xb7, 0x89, 0x83, 0xad, 0x4c, 0x33, 0xde, 0x1b, 0xb7, 0x27, 0xde, 0x74, 0x54, 0xe9, 0x21,
0x5f, 0x18, 0xb9, 0x72, 0x93, 0x8e, 0xbf, 0x16, 0xd7, 0xbc, 0x8f, 0x11, 0x54, 0x0c, 0x65, 0x28,
0x95, 0x59, 0x11, 0xe7, 0x19, 0x1f, 0x34, 0x0c, 0x09, 0xe4, 0x0b, 0x23, 0x57, 0xfe, 0x46, 0x49,
0x28, 0xef, 0x38, 0x90, 0xbf, 0x48, 0xa0, 0xf9, 0x54, 0xde, 0x9e, 0xa3, 0xc4, 0xa3, 0x2c, 0x94,
0x0c, 0xf6, 0x39, 0xf4, 0x6f, 0x8a, 0x88, 0x52, 0xf4, 0x14, 0x85, 0x25, 0xcd, 0xbe, 0x04, 0xc0,
0x33, 0x25, 0xe8, 0x00, 0x13, 0x64, 0x71, 0x94, 0x3c, 0x94, 0x41, 0x2c, 0xd3, 0x59, 0x18, 0xa6,
0x7c, 0x48, 0xf2, 0x8a, 0xa3, 0x5e, 0x8e, 0xb2, 0x37, 0x41, 0x94, 0x47, 0xc9, 0x15, 0x1f, 0x8d,
0x9d, 0x49, 0x5f, 0x54, 0x0c, 0xed, 0xd7, 0x25, 0x15, 0xee, 0x50, 0x87, 0x6d, 0x18, 0x2a, 0x96,
0x74, 0x5d, 0x24, 0x21, 0x3f, 0x42, 0x09, 0x11, 0xfe, 0x6f, 0x0e, 0x74, 0x97, 0xf3, 0x45, 0x90,
0x84, 0x4a, 0x61, 0x15, 0xa4, 0x61, 0xc6, 0x9d, 0x71, 0x5b, 0x29, 0x20, 0xa1, 0x5a, 0x81, 0xb2,
0x61, 0x5a, 0x81, 0x28, 0xc6, 0xa1, 0x17, 0x84, 0x61, 0x2a, 0xb3, 0x0c, 0x1b, 0x61, 0x20, 0x0c,
0x89, 0x49, 0xcb, 0xde, 0x44, 0x09, 0x36, 0x40, 0x5f, 0x10, 0xa1, 0xd2, 0x12, 0xcb, 0x5b, 0x99,
0x06, 0x57, 0x54, 0x7d, 0x57, 0x94, 0xb4, 0xff, 0x11, 0xfa, 0xa6, 0x88, 0xec, 0x19, 0xb8, 0xef,
0x83, 0x44, 0x7b, 0xe1, 0x4d, 0x0f, 0xca, 0xda, 0x28, 0x1f, 0x05, 0xc9, 0xec, 0xc7, 0x5b, 0xf5,
0xc7, 0x8f, 0xa1, 0x9b, 0x53, 0x76, 0xa9, 0x3d, 0x35, 0x85, 0xd1, 0xcb, 0x20, 0xdc, 0x1a, 0xa7,
0x90, 0xf0, 0xff, 0x70, 0xd4, 0xcb, 0x54, 0xf5, 0xff, 0xf6, 0xf2, 0x31, 0x74, 0x3f, 0x46, 0x49,
0x22, 0x53, 0xfd, 0xb0, 0xa6, 0x6a, 0xe1, 0xb5, 0xeb, 0xe1, 0xa9, 0x3b, 0x54, 0x43, 0xfd, 0x25,
0x34, 0xc5, 0x9e, 0xc3, 0x90, 0x4e, 0xaf, 0xea, 0x89, 0x69, 0x70, 0xfd, 0x97, 0xd0, 0xd3, 0x7f,
0x61, 0x4f, 0x8d, 0x38, 0xf4, 0x36, 0xeb, 0x28, 0xc9, 0xb5, 0x57, 0xae, 0x30, 0xa4, 0xff, 0x97,
0x03, 0x4f, 0x97, 0xf3, 0x5f, 0x82, 0x6b, 0x39, 0x5b, 0xe5, 0xd1, 0x3a, 0x61, 0xdf, 0x80, 0x8b,
0x1f, 0x12, 0x3f, 0xbc, 0x37, 0x65, 0x65, 0x90, 0x4a, 0xe7, 0x52, 0x49, 0x16, 0x4f, 0x04, 0xa9,
0xb0, 0x33, 0xe8, 0xaf, 0xd6, 0x49, 0x1e, 0x25, 0x85, 0x44, 0xbb, 0xde, 0xf4, 0xb3, 0x9a, 0xfa,
0xcf, 0x5a, 0xb8, 0x78, 0x22, 0x4a, 0x45, 0xf6, 0x02, 0x3a, 0xaa, 0xa1, 0x31, 0x09, 0xde, 0xf4,
0xa8, 0x76, 0xe1, 0xa2, 0x88, 0x94, 0x79, 0x54, 0x50, 0x9e, 0xdc, 0x14, 0x32, 0xa5, 0x8a, 0x34,
0x3d, 0xb9, 0x50, 0x12, 0xe5, 0x09, 0xaa, 0xb0, 0x21, 0xb4, 0xf2, 0x2d, 0x7e, 0x42, 0x57, 0xb4,
0xf2, 0xed, 0xbc, 0xa7, 0x71, 0xc4, 0x9f, 0x81, 0x67, 0xb9, 0x5e, 0xe1, 0x8b, 0x63, 0xe3, 0x4b,
0x0d, 0x0e, 0x5a, 0x0d, 0x38, 0xf0, 0x27, 0x30, 0xac, 0x87, 0xb3, 0x0f, 0x15, 0xfd, 0x13, 0x80,
0x2a, 0x8e, 0xbd, 0x5a, 0x5f, 0x19, 0x97, 0x30, 0x86, 0xbd, 0x6a, 0x37, 0xf0, 0x0c, 0x15, 0x48,
0xf7, 0x55, 0x94, 0xe5, 0xf3, 0x2d, 0xfd, 0xd4, 0x59, 0x12, 0x2e, 0x4b, 0xb0, 0xaa, 0x90, 0xd8,
0x69, 0x22, 0xf1, 0xfe, 0x98, 0x2a, 0xdc, 0x6a, 0x5b, 0xb8, 0xe5, 0xbf, 0x36, 0xbd, 0x20, 0xe4,
0x6a, 0x9d, 0x86, 0x8f, 0x46, 0xff, 0xdd, 0x56, 0x67, 0x70, 0x44, 0x56, 0x11, 0xfe, 0x1e, 0x30,
0x5d, 0x9a, 0x68, 0xd9, 0x26, 0x7e, 0x82, 0x03, 0xdb, 0xb1, 0x8c, 0x7d, 0xa7, 0x20, 0x1a, 0x8f,
0xfa, 0x33, 0x7e, 0x52, 0xeb, 0x0e, 0x52, 0x13, 0x46, 0xc7, 0x5f, 0x00, 0xbb, 0xe7, 0x42, 0xc6,
0xa6, 0x4d, 0x23, 0xbc, 0x66, 0xc4, 0xd2, 0xad, 0x2c, 0x7d, 0x80, 0x91, 0x55, 0x95, 0xf3, 0xe4,
0xdd, 0x7a, 0x6f, 0x28, 0x0c, 0x3a, 0x0a, 0x74, 0x34, 0x0e, 0xe0, 0xd9, 0xca, 0x5c, 0x7b, 0x77,
0xe6, 0x3a, 0x76, 0xd8, 0x67, 0xe0, 0x09, 0xb9, 0x89, 0xf5, 0x63, 0xec, 0x04, 0x3a, 0xca, 0xb4,
0xfe, 0x99, 0x87, 0xc6, 0x59, 0x33, 0xac, 0x05, 0x4a, 0xfd, 0x6f, 0xe1, 0xb0, 0xe1, 0x21, 0xfe,
0x7f, 0x72, 0x8a, 0x22, 0x1d, 0x08, 0x43, 0xfa, 0x2f, 0x61, 0x64, 0x3d, 0xa1, 0xba, 0x8c, 0x3d,
0x07, 0x57, 0x49, 0x4d, 0x52, 0xee, 0xbf, 0x43, 0x62, 0x7f, 0x0e, 0xcc, 0x7a, 0x68, 0xbe, 0x15,
0x6a, 0x5e, 0xfc, 0x5b, 0x61, 0x69, 0xba, 0xb4, 0xec, 0xe9, 0xf2, 0xb7, 0x03, 0xcc, 0x7a, 0xff,
0x21, 0x23, 0xfb, 0x1a, 0xef, 0x45, 0x39, 0x83, 0x08, 0x55, 0xee, 0x0d, 0x6c, 0x33, 0x94, 0x6a,
0xf3, 0xb1, 0xd3, 0x9c, 0x8f, 0xbb, 0xb7, 0x0f, 0x6b, 0xaf, 0xe8, 0x3e, 0xb0, 0x57, 0xe0, 0x2c,
0xcc, 0x8b, 0x34, 0xe1, 0x3d, 0x1a, 0x2e, 0x44, 0xf9, 0x7f, 0xb6, 0xe0, 0x40, 0xc8, 0x95, 0x8c,
0x36, 0xb9, 0xae, 0xe5, 0x63, 0x23, 0x34, 0xcd, 0xd4, 0xb6, 0x9a, 0x69, 0x67, 0xd3, 0xd4, 0x97,
0x0f, 0xb7, 0xb9, 0x7c, 0xd4, 0x60, 0xa1, 0xbb, 0x03, 0x16, 0x28, 0x01, 0xbd, 0x06, 0x3c, 0x56,
0x49, 0xeb, 0x37, 0x93, 0xc6, 0xab, 0xf4, 0x0c, 0xa8, 0xb7, 0xec, 0x2d, 0xab, 0x5c, 0x37, 0x60,
0xef, 0xba, 0xe1, 0xd9, 0x0d, 0x81, 0x10, 0x74, 0x49, 0x1b, 0xa1, 0x90, 0x37, 0xff, 0x07, 0xb0,
0xd9, 0x21, 0xb4, 0xdf, 0x49, 0xb3, 0x7e, 0xaa, 0xa3, 0xff, 0x23, 0x8c, 0x96, 0x73, 0x03, 0xdf,
0x64, 0x78, 0x5f, 0x01, 0xf4, 0xe5, 0x56, 0x75, 0xf9, 0x07, 0x85, 0xd7, 0x17, 0xb8, 0x83, 0x3d,
0xee, 0xe2, 0xf7, 0x6a, 0x1c, 0xe0, 0x17, 0x79, 0xd4, 0xbd, 0xb7, 0x5d, 0x5c, 0xc8, 0xcf, 0xfe,
0x09, 0x00, 0x00, 0xff, 0xff, 0xda, 0x14, 0x34, 0x44, 0xa3, 0x0b, 0x00, 0x00,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment