github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/user_redpacketmatch.go (about)

     1  package internal
     2  
     3  import (
     4  	"common"
     5  	"conf"
     6  	"msg"
     7  	"time"
     8  
     9  	"github.com/name5566/leaf/log"
    10  	"gopkg.in/mgo.v2/bson"
    11  )
    12  
    13  // 计算红包比赛在线人数
    14  func calculateRedPacketMatchOnlineNumber(redPacketType int) {
    15  	switch redPacketType {
    16  	case 1: // 红包匹配场
    17  		redPacketMatchOnlineNumber[0]++
    18  	case 10: // 红包匹配场
    19  		redPacketMatchOnlineNumber[1]++
    20  	case 100: // 红包私人房
    21  		redPacketMatchOnlineNumber[2]++
    22  	case 999: // 红包私人房
    23  		redPacketMatchOnlineNumber[3]++
    24  	}
    25  }
    26  
    27  // 发送红包比赛在线人数
    28  func (user *User) sendRedPacketMatchOnlineNumber() {
    29  	//一元红包场
    30  	if time.Now().Hour() < conf.GetOneRedpacketInfo().Start || time.Now().Hour() > conf.GetOneRedpacketInfo().End {
    31  		redPacketMatchOnlineNumber[0] = 0
    32  	}
    33  	//十元红包场
    34  	if time.Now().Hour() < conf.GetTenRedpacketInfo().Start || time.Now().Hour() > conf.GetTenRedpacketInfo().End {
    35  		redPacketMatchOnlineNumber[1] = 0
    36  	}
    37  	if time.Now().Hour() < conf.GetHundredRedpacketInfo().Start || time.Now().Hour() > conf.GetHundredRedpacketInfo().End {
    38  		redPacketMatchOnlineNumber[2] = 0
    39  	}
    40  	//十元红包场
    41  	redPacketMatchOnlineNumber[3] = 0
    42  	user.WriteMsg(&msg.S2C_UpdateRedPacketMatchOnlineNumber{
    43  		Numbers: redPacketMatchOnlineNumber,
    44  	})
    45  }
    46  
    47  // 发送未领取的红包比赛奖励数量
    48  func (user *User) sendUntakenRedPacketMatchPrizeNumber() {
    49  	count := 0
    50  	skeleton.Go(func() {
    51  		db := mongoDB.Ref()
    52  		defer mongoDB.UnRef(db)
    53  		count, _ = db.DB(DB).C("redpacketmatchresult").
    54  			Find(bson.M{"userid": user.baseData.userData.UserID, "redpacket": bson.M{"$gt": 0}, "taken": false}).Count()
    55  	}, func() {
    56  		user.WriteMsg(&msg.S2C_UpdateUntakenRedPacketMatchPrizeNumber{
    57  			Number: count,
    58  		})
    59  	})
    60  }
    61  
    62  func (user *User) sendRedPacketMatchRecord(pageNumber int, pageSize int) {
    63  	resultData := new(RedPacketMatchResultData)
    64  	var items []msg.RedPacketMatchRecordItem
    65  	count := 0
    66  	skeleton.Go(func() {
    67  		db := mongoDB.Ref()
    68  		defer mongoDB.UnRef(db)
    69  		count, _ = db.DB(DB).C("redpacketmatchresult").Find(bson.M{"userid": user.baseData.userData.UserID, "redpacket": bson.M{"$gt": 0}}).Count()
    70  
    71  		iter := db.DB(DB).C("redpacketmatchresult").Find(bson.M{"userid": user.baseData.userData.UserID, "redpacket": bson.M{"$gt": 0}}).
    72  			Sort("-createdat").Skip((pageNumber - 1) * pageSize).Limit(pageSize).Iter()
    73  		if err := iter.Close(); err != nil {
    74  			log.Error("iter close error: %v", err)
    75  		}
    76  		for iter.Next(&resultData) {
    77  			items = append(items, msg.RedPacketMatchRecordItem{
    78  				ID:            resultData.ID,
    79  				RedPacketType: resultData.RedPacketType,
    80  				RedPacket:     resultData.RedPacket,
    81  				Taken:         resultData.Taken,
    82  				Date:          time.Unix(resultData.CreatedAt, 0).Format("2006/01/02 15:04:05"),
    83  				CardCode:      resultData.CardCode,
    84  			})
    85  		}
    86  	}, func() {
    87  		user.WriteMsg(&msg.S2C_RedPacketMatchRecord{
    88  			Items:      items,
    89  			Total:      count,
    90  			PageNumber: pageNumber,
    91  			PageSize:   pageSize,
    92  		})
    93  	})
    94  }
    95  
    96  func (user *User) takeRedPacketMatchPrize(id bson.ObjectId) {
    97  	if user.baseData.userData.CircleID < 1 {
    98  		user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
    99  			Error: msg.S2C_TakeRedPacketMatchPrize_CircleIDInvalid,
   100  		})
   101  		user.requestCircleID()
   102  		return
   103  	}
   104  	userID := user.baseData.userData.UserID
   105  
   106  	resultData := new(RedPacketMatchResultData)
   107  	skeleton.Go(func() {
   108  		db := mongoDB.Ref()
   109  		defer mongoDB.UnRef(db)
   110  
   111  		err := db.DB(DB).C("redpacketmatchresult").FindId(id).One(&resultData)
   112  		if err != nil {
   113  			resultData = nil
   114  			log.Debug("find redpacketmatchresult: %v error: %v", id, err)
   115  			return
   116  		}
   117  	}, func() {
   118  		if resultData == nil {
   119  			user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
   120  				Error: msg.S2C_TakeRedPacketMatchPrize_IDInvalid,
   121  				ID:    id,
   122  			})
   123  			return
   124  		}
   125  		if resultData.UserID != user.baseData.userData.UserID || resultData.RedPacket <= 0 {
   126  			user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
   127  				Error: msg.S2C_TakeRedPacketMatchPrize_NotYetWon,
   128  				ID:    id,
   129  			})
   130  			return
   131  		}
   132  		if resultData.Taken {
   133  			user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
   134  				Error:     msg.S2C_TakeRedPacketMatchPrize_TakeRepeated,
   135  				ID:        id,
   136  				RedPacket: resultData.RedPacket,
   137  			})
   138  			return
   139  		}
   140  		if resultData.Handling {
   141  			return
   142  		}
   143  		updateRedPacketMatchResultData(id, bson.M{"$set": bson.M{"handling": true}}, func() {
   144  			/*
   145  				// 请求生成一个圈圈红包
   146  				desc := strconv.Itoa(resultData.RedPacketType) + "元红包比赛奖励"
   147  				user.requestCircleRedPacket(resultData.RedPacket, desc, func() {
   148  					takeRedPacketMatchPrizeSuccess(userID, id, resultData.RedPacket)
   149  				}, func() {
   150  					takeRedPacketMatchPrizeFail(userID, id)
   151  				})
   152  			*/
   153  			takeRedPacketMatchPrizeSuccess(userID, id, resultData.RedPacket)
   154  		})
   155  	})
   156  }
   157  
   158  func takeRedPacketMatchPrizeSuccess(userID int, id bson.ObjectId, redPacket float64) {
   159  	var cb func()
   160  	if user, ok := userIDUsers[userID]; ok {
   161  		user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
   162  			Error:     msg.S2C_TakeRedPacketMatchPrize_OK,
   163  			ID:        id,
   164  			RedPacket: common.Round(redPacket, 2),
   165  		})
   166  		cb = func() {
   167  			if theUser, ok := userIDUsers[userID]; ok {
   168  				theUser.sendUntakenRedPacketMatchPrizeNumber()
   169  			}
   170  		}
   171  	} else {
   172  		cb = nil
   173  	}
   174  	updateRedPacketMatchResultData(id, bson.M{"$set": bson.M{"taken": true, "handling": false, "updatedat": time.Now().Unix()}}, cb)
   175  }
   176  
   177  func takeRedPacketMatchPrizeFail(userID int, id bson.ObjectId) {
   178  	if user, ok := userIDUsers[userID]; ok {
   179  		user.WriteMsg(&msg.S2C_TakeRedPacketMatchPrize{
   180  			Error: msg.S2C_TakeRedPacketMatchPrize_Error,
   181  			ID:    id,
   182  		})
   183  	}
   184  	updateRedPacketMatchResultData(id, bson.M{"$set": bson.M{"handling": false}}, nil)
   185  }