/
query.go
91 lines (78 loc) · 2.42 KB
/
query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 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 executor
import (
"github.com/33cn/chain33/types"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
)
// Query_QueryGameListByIDs 根据id列表查询游戏
func (g *PokerBull) Query_QueryGameListByIDs(in *pkt.QueryPBGameInfos) (types.Message, error) {
return Infos(g.GetStateDB(), in)
}
// Query_QueryGameByID 根据id查询游戏
func (g *PokerBull) Query_QueryGameByID(in *pkt.QueryPBGameInfo) (types.Message, error) {
game, err := readGame(g.GetStateDB(), in.GetGameId())
if err != nil {
return nil, err
}
return &pkt.ReplyPBGame{Game: game}, nil
}
// Query_QueryGameByAddr 根据地址查询游戏
func (g *PokerBull) Query_QueryGameByAddr(in *pkt.QueryPBGameInfo) (types.Message, error) {
gameIds, err := getGameListByAddr(g.GetLocalDB(), in.Addr, in.Index)
if err != nil {
return nil, err
}
return gameIds, nil
}
// Query_QueryGameByStatus 根据状态查询游戏
func (g *PokerBull) Query_QueryGameByStatus(in *pkt.QueryPBGameInfo) (types.Message, error) {
gameIds, err := getGameListByStatus(g.GetLocalDB(), in.Status, in.Index)
if err != nil {
return nil, err
}
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]
}
cfg := g.GetAPI().GetConfig()
winnerReturn := int64((1 - (pkt.DeveloperFee + pkt.PlatformFee)) * float64(cfg.GetCoinPrecision()))
gameInfo := &pkt.ReplyPBGameByRound{
GameId: game.GameId,
Status: game.Status,
Result: result,
IsWaiting: game.IsWaiting,
Value: game.Value,
Players: roundPlayers,
Return: (game.Value / cfg.GetCoinPrecision()) * winnerReturn,
}
return gameInfo, nil
}