github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/room.go (about) 1 package internal 2 3 import ( 4 "common" 5 "fmt" 6 7 "github.com/name5566/leaf/log" 8 "gopkg.in/mgo.v2/bson" 9 ) 10 11 // 房间状态 12 const ( 13 roomIdle = iota // 0 空闲 14 roomGame // 1 游戏中 15 ) 16 17 // 房间类型 18 const ( 19 roomPractice = iota // 0 练习 20 roomBaseScoreMatching // 1 底分匹配 21 roomBaseScorePrivate // 2 底分私人 22 roomVIPPrivate // 3 VIP私人 23 roomRedPacketMatching // 4 红包匹配 24 roomRedPacketPrivate // 5 红包私人 25 ) 26 27 var ( 28 roomNumbers []int 29 roomCounter = 0 30 ) 31 32 type Room interface { 33 Enter(user *User) bool 34 Exit(user *User) 35 SitDown(user *User, pos int) 36 StandUp(user *User, pos int) 37 GetAllPlayers(user *User) 38 StartGame() 39 EndGame() 40 } 41 42 type room struct { 43 state int 44 loginIPs map[string]bool 45 positionUserIDs map[int]int // key: 座位号, value: userID 46 creatorUserID int // 创建者 userID 47 ownerUserID int // 房主 userID 48 number string 49 desc string 50 startTimestamp int64 // 开始时间 51 eachRoundStartTimestamp int64 // 每一局开始时间 52 endTimestamp int64 // 结束时间 53 } 54 55 func init() { 56 for i := 0; i < 1000000; i++ { 57 roomNumbers = append(roomNumbers, i) 58 } 59 roomNumbers = common.Shuffle(roomNumbers) 60 } 61 62 func getRoomNumber() string { 63 log.Debug("房间计数器: %v", roomCounter) 64 roomNumber := fmt.Sprintf("%06d", roomNumbers[roomCounter]) 65 roomCounter = (roomCounter + 1) % 1000000 66 return roomNumber 67 } 68 69 func broadcast(msg interface{}, positionUserIDs map[int]int, pos int) { 70 for position, userID := range positionUserIDs { 71 if position == pos { 72 continue 73 } 74 if user, ok := userIDUsers[userID]; ok { 75 if user.state != userLogout { 76 user.WriteMsg(msg) 77 } 78 } 79 } 80 } 81 82 func broadcastAll(msg interface{}) { 83 for _, user := range userIDUsers { 84 if user.state != userLogout { 85 user.WriteMsg(msg) 86 } 87 } 88 } 89 90 func toRelativePosition(pos int, zeroPos int, maxPlayers int) int { 91 return (maxPlayers - zeroPos + pos) % maxPlayers 92 } 93 94 func toRealPosition(relativePos int, zeroPos int, maxPlayers int) int { 95 return (maxPlayers + zeroPos + relativePos) % maxPlayers 96 } 97 98 func upsertRobotData(id string, update interface{}) { 99 skeleton.Go(func() { 100 db := mongoDB.Ref() 101 defer mongoDB.UnRef(db) 102 _, err := db.DB(DB).C("robot").UpsertId(id, update) 103 if err != nil { 104 log.Error("upsert %v error: %v", id, err) 105 } 106 }, nil) 107 } 108 109 func upsertTaskTicket(id interface{}, update interface{}) { 110 skeleton.Go(func() { 111 db := mongoDB.Ref() 112 defer mongoDB.UnRef(db) 113 _, err := db.DB(DB).C("taskticket").Upsert(id, update) 114 if err != nil { 115 log.Error("upsert taskticket %v error: %v", id, err) 116 } 117 }, nil) 118 } 119 120 func clearToken() { 121 skeleton.Go(func() { 122 db := mongoDB.Ref() 123 defer mongoDB.UnRef(db) 124 125 userData := new(UserData) 126 iter := db.DB(DB).C("users").Find(bson.M{"role": rolePlayer}).Iter() 127 for iter.Next(&userData) { 128 if user, ok := userIDUsers[userData.UserID]; ok { 129 user.baseData.userData.Token = "" 130 } else { 131 updateUserData(userData.UserID, bson.M{"$set": bson.M{"token": ""}}) 132 } 133 } 134 if err := iter.Close(); err != nil { 135 log.Error("iter close error: %v", err) 136 } 137 138 }, nil) 139 }