Commit 80bdb1bb authored by 张振华's avatar 张振华

guess

parent 9fe46fb1
......@@ -6,62 +6,59 @@ package executor
import (
"github.com/33cn/chain33/types"
pkt "github.com/33cn/plugin/plugin/dapp/pokerbull/types"
pkt "github.com/33cn/plugin/plugin/dapp/guess/types"
)
func (c *PokerBull) updateIndex(log *pkt.ReceiptPBGame) (kvs []*types.KeyValue) {
//先保存本次Action产生的索引
kvs = append(kvs, addPBGameStatusAndPlayer(log.Status, log.PlayerNum, log.Value, log.Index, log.GameId))
kvs = append(kvs, addPBGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, addPBGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
func (c *Guess) updateIndex(log *pkt.ReceiptGuessGame) (kvs []*types.KeyValue) {
//新创建游戏
if log.Status == pkt.GuessGameStatusStart{
//kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
} else if log.Status == pkt.GuessGameStatusBet {
//如果是下注状态,则有用户进行了下注操作
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
/*
//状态更新
if log.Status == pkt.PBGameActionStart {
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex))
}
if log.Status == pkt.PBGameActionContinue {
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionContinue, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionContinue, log.PrevIndex))
}
if log.Status == pkt.PBGameActionQuit {
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionStart, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusAndPlayer(pkt.PBGameActionContinue, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionStart, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(pkt.PBGameActionContinue, log.PrevIndex))
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
//对于老状态进行删除
kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
}else if log.StatusChange {
//其他状态时的状态发生变化,要将老状态对应的记录删除,同时加入新状态记录;对于每个地址的下注记录也需要遍历处理。
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameId, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameId, log.Index))
}*/
kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
//结束一局,更新所有玩家地址状态
if !log.IsWaiting {
for _, v := range log.Players {
if v != log.Addr {
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, v, log.GameId, log.Index))
}
kvs = append(kvs, delPBGameAddrIndexKey(v, log.PrevIndex))
}
kvs = append(kvs, delPBGameStatusAndPlayer(log.PreStatus, log.PlayerNum, log.Value, log.PrevIndex))
kvs = append(kvs, delPBGameStatusIndexKey(log.PreStatus, log.PrevIndex))
//从game中遍历每个地址的记录进行新增和删除
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, delGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.Index))
}
return kvs
}
func (c *PokerBull) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error) {
func (c *Guess) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
if receipt.GetTy() != types.ExecOk {
return dbSet, nil
}
for i := 0; i < len(receipt.Logs); i++ {
item := receipt.Logs[i]
if item.Ty == pkt.TyLogPBGameStart || item.Ty == pkt.TyLogPBGameContinue || item.Ty == pkt.TyLogPBGameQuit {
var Gamelog pkt.ReceiptPBGame
if item.Ty >= pkt.TyLogGuessGameStart && item.Ty <= pkt.TyLogGuessGameTimeout {
var Gamelog pkt.ReceiptGuessGame
err := types.Decode(item.Log, &Gamelog)
if err != nil {
panic(err) //数据错误了,已经被修改了
......@@ -73,14 +70,14 @@ func (c *PokerBull) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, er
return dbSet, nil
}
func (c *PokerBull) ExecLocal_Start(payload *pkt.PBGameStart, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
func (c *Guess) ExecLocal_Start(payload *pkt.PBGameStart, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData)
}
func (c *PokerBull) ExecLocal_Continue(payload *pkt.PBGameContinue, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
func (c *Guess) ExecLocal_Continue(payload *pkt.PBGameContinue, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData)
}
func (c *PokerBull) ExecLocal_Quit(payload *pkt.PBGameQuit, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
func (c *Guess) ExecLocal_Quit(payload *pkt.PBGameQuit, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
return c.execLocal(receiptData)
}
......@@ -45,43 +45,101 @@ func (g *Guess) GetDriverName() string {
return pkt.GuessX
}
//addr prefix
func calcGuessGameAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:", addr)
return []byte(key)
}
//addr index
func calcGuessGameAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:%018d", addr, index)
return []byte(key)
}
//status prefix
func calcGuessGameStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:", status)
return []byte(key)
}
//status index
func calcGuessGameStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:%018d", status, index)
return []byte(key)
}
func calcGuessGameStatusAndPlayerKey(category string, status, index int64) []byte {
key := fmt.Sprintf("LODB-guess-category-status:%s:%d:%018d", category, status, index)
//addr status prefix
func calcGuessGameAddrStatusPrefix(addr string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:", addr, status)
return []byte(key)
}
func calcGuessGameStatusAndPlayerPrefix(category string, status int32) []byte {
var key string
key = fmt.Sprintf("LODB-guess-category-status:%s:%d", category, status)
//addr status index
func calcGuessGameAddrStatusKey(addr string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:%018d", addr, status, index)
return []byte(key)
}
//admin prefix
func calcGuessGameAdminPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:", addr)
return []byte(key)
}
//admin index
func calcGuessGameAdminKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:%018d", addr, index)
return []byte(key)
}
//admin status prefix
func calcGuessGameAdminStatusPrefix(admin string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:", admin, status)
return []byte(key)
}
//admin status index
func calcGuessGameAdminStatusKey(admin string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:%018d", admin, status, index)
return []byte(key)
}
func calcGuessGameCategoryStatusPrefix(category string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:", category, status)
return []byte(key)
}
func calcGuessGameCategoryStatusKey(category string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:%018d", category, status, index)
return []byte(key)
}
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
kv.Value = nil
return kv
}
func addGuessGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusKey(status, index)
record := &pkt.PBGameIndexRecord{
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
......@@ -95,10 +153,10 @@ func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue {
return kv
}
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
func addGuessGameAddrStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
record := &pkt.PBGameRecord{
kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
......@@ -107,27 +165,66 @@ func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *t
return kv
}
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
func delGuessGameAddrStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
kv.Value = nil
return kv
}
func addGuessGameAdminIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAdminIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
kv.Value = nil
return kv
}
func addPBGameStatusAndPlayer(status int32, player int32, value, index int64, gameId string) *types.KeyValue {
func addGuessGameAdminStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
record := &pkt.PBGameIndexRecord{
GameId: gameId,
kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delPBGameStatusAndPlayer(status int32, player int32, value, index int64) *types.KeyValue {
func delGuessGameAdminStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusAndPlayerKey(status, player, value, index)
kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
kv.Value = nil
return kv
}
func addGuessGameCategoryStatusIndexKey(status int32, category, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
record := &pkt.GuessGameRecord{
GameId: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameCategoryStatusIndexKey(status int32, category string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
kv.Value = nil
return kv
}
\ No newline at end of file
This diff is collapsed.
......@@ -21,15 +21,15 @@ message GuessGame {
uint32 oneBet = 13; //一注等于多少bty或者token
uint32 maxBets = 14; //单次可以下多少注,默认100
uint32 maxBetsNumber = 15; //最多可以下多少注
uint32 fee = 16; //收取费用,不带则表示不收费
uint64 fee = 16; //收取费用,不带则表示不收费
string feeAddr = 17; //收费地址
string expire = 18; //游戏过期时间
int64 expireHeight = 19; //游戏过期区块高度
string adminAddr = 20; //游戏创建者地址,只有该地址可以开奖
uint32 betsNumber = 21; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 22; //参与游戏下注的玩家投注信息
string result = 23;
repeated GuessBet bets = 24;
string result = 23; //公布的中奖结果
GuessBetStat betStat = 24;
int64 index = 25;
int64 preIndex = 26;
}
......@@ -48,7 +48,17 @@ message GuessBet {
int64 preIndex = 6;
}
message GuessBetStat {
uint32 totalBetTimes = 1;
uint32 totalBetsNumber = 2;
repeated GuessBetStatItem items = 3;
}
message GuessBetStatItem {
string option = 1;
uint32 betsNumber = 2;
uint32 betsTimes = 3;
}
//斗牛游戏内容
message PokerBull {
......@@ -264,12 +274,16 @@ message ReceiptPBGame {
message ReceiptGuessGame {
string gameId = 1;
uint32 status = 2;
string addr = 3;
int64 index = 4;
uint32 preStatus = 2;
uint32 status = 3;
string addr = 4;
string adminAddr = 5;
int64 preIndex = 6;
int64 index = 7;
string category = 8;
bool statusChange = 9;
}
message GuessStartTxReq {
string topic = 1;
string options = 2;
......
This diff is collapsed.
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