github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/user.go (about) 1 package internal 2 3 import ( 4 "common" 5 "conf" 6 "msg" 7 "time" 8 9 "github.com/name5566/leaf/gate" 10 "github.com/name5566/leaf/log" 11 "github.com/name5566/leaf/timer" 12 "gopkg.in/mgo.v2/bson" 13 ) 14 15 // 用户状态 16 const ( 17 userLogin = iota 18 userLogout // 1 19 ) 20 21 const ( 22 roleRobot = -2 // 机器人 23 roleBlack = -1 // 黑名单 24 rolePlayer = 1 // 玩家 25 roleAgent = 2 // 代理 26 roleAdmin = 3 // 管理员 27 roleRoot = 4 // 最高管理员 28 ) 29 30 var ( 31 userIDUsers = make(map[int]*User) 32 33 userIDRooms = make(map[int]interface{}) 34 roomNumberRooms = make(map[string]interface{}) 35 36 systemOn = true // 系统开关 37 38 accountIDs []int 39 accountIDCounter = 0 40 reservedAccountIDs = []int{6666666, 8888888, 9999999} 41 42 // 红包类型分别是1、10、100、999 43 redPacketMatchOnlineNumber = []int{0, 0, 0, 0} // 红包比赛在线人数 44 45 redPacketCounter = 1 46 ) 47 48 type User struct { 49 gate.Agent 50 state int 51 baseData *BaseData 52 heartbeatTimer *timer.Timer 53 heartbeatStop bool 54 LastTaskId int //该任务在上一任务完成后重新生成(所以对该任务不需要加一处理) 55 } 56 57 type BaseData struct { 58 userData *UserData 59 ownerUserID int // 所在房间的房主 60 taskIDTaskDatas map[int]*TaskData // 任务列表(包含金币、红包任务) 61 togetherUserIDs map[int]bool // 记录对局过的玩家 62 TaskId int 63 redPacketTaskList []msg.RedPacketTask 64 redPacketTaskRecord []msg.RedPacketTask 65 NoReceiveRedpacketTask []msg.RedPacketTask 66 TaskCount int //领取的红包任务数量 67 } 68 69 func init() { 70 result := new(UserData) 71 72 m := make(map[int]bool) 73 for _, v := range reservedAccountIDs { 74 m[v] = true 75 } 76 77 skeleton.Go(func() { 78 db := mongoDB.Ref() 79 defer mongoDB.UnRef(db) 80 81 iter := db.DB(DB).C("users").Find(nil).Iter() 82 for iter.Next(&result) { 83 m[result.AccountID] = true 84 } 85 if err := iter.Close(); err != nil { 86 log.Error("iter close error: %v", err) 87 } 88 }, func() { 89 for i := 1000000; i < 10000000; i++ { 90 if !m[i] { 91 accountIDs = append(accountIDs, i) 92 } 93 } 94 accountIDs = common.Shuffle(accountIDs) 95 // log.Debug("%v %v", len(m), len(accountIDs)) 96 }) 97 } 98 99 // 生成7位数的账号ID 100 func getAccountID() int { 101 log.Debug("账号ID计数器: %v", accountIDCounter) 102 accountID := accountIDs[accountIDCounter] 103 accountIDCounter++ 104 return accountID 105 } 106 107 func newUser(a gate.Agent) *User { 108 user := new(User) 109 user.Agent = a 110 user.state = userLogin 111 user.baseData = new(BaseData) 112 user.baseData.userData = new(UserData) 113 user.baseData.taskIDTaskDatas = make(map[int]*TaskData) 114 user.baseData.togetherUserIDs = make(map[int]bool) 115 return user 116 } 117 118 func (user *User) autoHeartbeat() { 119 if user.heartbeatStop { 120 log.Debug("userID: %v 心跳停止", user.baseData.userData.UserID) 121 user.Close() 122 return 123 } 124 user.heartbeatStop = true 125 user.WriteMsg(&msg.S2C_Heartbeat{}) 126 // 服务端发送心跳包间隔120秒 127 user.heartbeatTimer = skeleton.AfterFunc(time.Duration(conf.GetCfgTimeout().HeartTimeout)*time.Second, func() { 128 user.autoHeartbeat() 129 }) 130 } 131 132 func (user *User) transferChips(accountID int, chips int64) { 133 otherUserData := new(UserData) 134 skeleton.Go(func() { 135 db := mongoDB.Ref() 136 defer mongoDB.UnRef(db) 137 // load 138 db.DB(DB).C("users"). 139 Find(bson.M{"accountid": accountID}).One(otherUserData) 140 }, func() { 141 if user.state == userLogout { 142 return 143 } 144 if otherUserData.UserID < 1 { 145 user.WriteMsg(&msg.S2C_TransferChips{Error: msg.S2C_TransferChips_AccountIDInvalid}) 146 return 147 } 148 if otherUser, ok := userIDUsers[otherUserData.UserID]; ok { 149 otherUser.baseData.userData.Chips += chips 150 //updateUserData(otherUserData.UserID, bson.M{"$set": bson.M{"chips": otherUser.baseData.Chips}}) 151 otherUser.WriteMsg(&msg.S2C_UpdateUserChips{ 152 Chips: otherUser.baseData.userData.Chips, 153 }) 154 } else { 155 otherUserData.Chips += chips 156 updateUserData(otherUserData.UserID, bson.M{"$set": bson.M{"chips": otherUserData.Chips}}) 157 } 158 user.baseData.userData.Chips -= chips 159 updateUserData(user.baseData.userData.UserID, bson.M{"$set": bson.M{"chips": user.baseData.userData.Chips}}) 160 user.WriteMsg(&msg.S2C_UpdateUserChips{ 161 Chips: user.baseData.userData.Chips, 162 }) 163 user.WriteMsg(&msg.S2C_TransferChips{ 164 Error: msg.S2C_TransferChips_OK, 165 Chips: chips, 166 }) 167 log.Debug("userID %v 给账号ID: %v 转了 %v筹码", user.baseData.userData.UserID, accountID, chips) 168 }) 169 } 170 171 func (user *User) getAllPlayers(r interface{}) { 172 landlordRoom := r.(*LandlordRoom) 173 landlordRoom.GetAllPlayers(user) 174 } 175 176 func (user *User) FakeWXPay(totalFee int) { 177 if common.InArray([]int{100, 600, 1200, 5000, 10000}, totalFee) || user.isRobot() { 178 outTradeNo := common.GetOutTradeNo() 179 startWXPayOrder(outTradeNo, user.baseData.userData.AccountID, totalFee, func() { 180 finishWXPayOrder(outTradeNo, totalFee, false) 181 }) 182 } 183 } 184 185 func (user *User) FakeAliPay(totalAmount float64) { 186 if common.InArray([]int{1, 6, 12, 50, 100}, int(totalAmount)) || user.isRobot() { 187 outTradeNo := common.GetOutTradeNo() 188 startAliPayOrder(outTradeNo, user.baseData.userData.AccountID, totalAmount, func() { 189 finishAliPayOrder(outTradeNo, totalAmount, false) 190 }) 191 } 192 } 193 194 func (user *User) isRobot() bool { 195 return user.baseData.userData.Role == roleRobot 196 } 197 198 func (user *User) setRobotChips(chips int64) { 199 robotData := new(UserData) 200 skeleton.Go(func() { 201 db := mongoDB.Ref() 202 defer mongoDB.UnRef(db) 203 204 iter := db.DB(DB).C("users").Find(bson.M{"role": roleRobot}).Iter() 205 if err := iter.Close(); err != nil { 206 log.Error("iter close error: %v", err) 207 } 208 for iter.Next(&robotData) { 209 if robot, ok := userIDUsers[robotData.UserID]; ok { 210 robot.baseData.userData.Chips += chips 211 } else { 212 updateUserData(robotData.UserID, bson.M{"$inc": bson.M{"chips": chips}}) 213 } 214 } 215 }, nil) 216 }