Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
afbd0de6
Unverified
Commit
afbd0de6
authored
Dec 15, 2018
by
33cn
Committed by
GitHub
Dec 15, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #141 from jpeng-go/pokerbull
Pokerbull问题修复
parents
62cbbdc6
66bcc4fb
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
571 additions
and
514 deletions
+571
-514
game.go
plugin/dapp/pokerbull/commands/game.go
+34
-23
pokerbull.go
plugin/dapp/pokerbull/executor/pokerbull.go
+2
-2
pokerbulldb.go
plugin/dapp/pokerbull/executor/pokerbulldb.go
+86
-56
query.go
plugin/dapp/pokerbull/executor/query.go
+46
-1
plugin.go
plugin/dapp/pokerbull/plugin.go
+0
-2
pokerbull.proto
plugin/dapp/pokerbull/proto/pokerbull.proto
+23
-11
jrpc.go
plugin/dapp/pokerbull/rpc/jrpc.go
+0
-84
jrpc_channel_test.go
plugin/dapp/pokerbull/rpc/jrpc_channel_test.go
+79
-16
rpc.go
plugin/dapp/pokerbull/rpc/rpc.go
+0
-70
types.go
plugin/dapp/pokerbull/rpc/types.go
+0
-30
const.go
plugin/dapp/pokerbull/types/const.go
+33
-0
pokerbull.pb.go
plugin/dapp/pokerbull/types/pokerbull.pb.go
+268
-219
No files found.
plugin/dapp/pokerbull/commands/game.go
View file @
afbd0de6
...
...
@@ -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
...
...
plugin/dapp/pokerbull/executor/pokerbull.go
View file @
afbd0de6
...
...
@@ -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:%
015
d:%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:%
015
d"
,
status
,
player
,
value
)
}
return
[]
byte
(
key
)
...
...
plugin/dapp/pokerbull/executor/pokerbulldb.go
View file @
afbd0de6
...
...
@@ -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
.
PBGame
Index
Record
for
_
,
value
:=
range
values
{
var
record
pkt
.
PBGameRecord
var
record
pkt
.
PBGame
Index
Record
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
.
PBGame
Index
Records
{
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
())
...
...
plugin/dapp/pokerbull/executor/query.go
View file @
afbd0de6
...
...
@@ -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
}
plugin/dapp/pokerbull/plugin.go
View file @
afbd0de6
...
...
@@ -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
,
})
}
plugin/dapp/pokerbull/proto/pokerbull.proto
View file @
afbd0de6
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
)
{}
}
plugin/dapp/pokerbull/rpc/jrpc.go
deleted
100644 → 0
View file @
62cbbdc6
// 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
}
plugin/dapp/pokerbull/rpc/jrpc_channel_test.go
View file @
afbd0de6
...
...
@@ -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
)
...
...
plugin/dapp/pokerbull/rpc/rpc.go
deleted
100644 → 0
View file @
62cbbdc6
// 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
}
plugin/dapp/pokerbull/rpc/types.go
deleted
100644 → 0
View file @
62cbbdc6
// 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
)
}
plugin/dapp/pokerbull/types/const.go
View file @
afbd0de6
...
...
@@ -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
)
plugin/dapp/pokerbull/types/pokerbull.pb.go
View file @
afbd0de6
...
...
@@ -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
{
1
4
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
1
5
}
}
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
{
1
5
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
1
6
}
}
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
{
1
6
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
1
7
}
}
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
{
1
7
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
1
8
}
}
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
{
2
0
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
2
3
}
}
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
{
2
1
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
2
4
}
}
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
{
2
2
}
return
fileDescriptor_8d22e4ee2313e311
,
[]
int
{
2
5
}
}
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
,
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment