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  }