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

guess

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