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

     1  package internal
     2  
     3  import (
     4  	"common"
     5  	"game/circle"
     6  	"math/rand"
     7  	"msg"
     8  	"time"
     9  
    10  	"github.com/name5566/leaf/log"
    11  	"gopkg.in/mgo.v2/bson"
    12  )
    13  
    14  func (user *User) sendTaskList(firstLogin bool, cb func()) {
    15  	var redPacketTaskList []TaskData
    16  	var chipTaskList []TaskData
    17  
    18  	skeleton.Go(func() {
    19  		if len(user.baseData.taskIDTaskDatas) > 0 {
    20  			redPacketTaskList = toTaskList(user.baseData.taskIDTaskDatas, taskRedPacket)
    21  			chipTaskList = toTaskList(user.baseData.taskIDTaskDatas, taskChip)
    22  			return
    23  		}
    24  
    25  		db := mongoDB.Ref()
    26  		defer mongoDB.UnRef(db)
    27  		data := new(UserTaskListData)
    28  		err := db.DB(DB).C("usertasklist").
    29  			Find(bson.M{"userid": user.baseData.userData.UserID}).One(&data)
    30  		if err == nil {
    31  			redPacketTaskList = data.RedPacketTaskList
    32  			redPacketTaskList = updateRedPacketTaskList(redPacketTaskList)
    33  
    34  			chipTaskList = data.ChipTaskList
    35  			chipTaskList = updateChipTaskList(chipTaskList)
    36  		} else {
    37  			var taskIDs []int
    38  			if firstLogin {
    39  				taskIDs = getRandomTaskIDs(1, taskRedPacket, FirstLoginRedPacketIDs)
    40  			} else {
    41  				if user.baseData.userData.Chips >= 50000 {
    42  					taskIDs = getRandomTaskIDs(1, taskRedPacket, RedPacketIDs2)
    43  				} else {
    44  					taskIDs = getRandomTaskIDs(1, taskRedPacket, RedPacketIDs)
    45  				}
    46  			}
    47  			redPacketTaskList = buildTaskList(taskIDs)
    48  
    49  			taskIDs = []int{1000}
    50  			// taskIDs = append(taskIDs, getRandomTaskIDs(3, taskChip)...)
    51  			chipTaskList = buildTaskList(taskIDs)
    52  		}
    53  		// 活动任务更新和移除
    54  		chipTaskList = updateActivityTaskList(chipTaskList)
    55  
    56  		user.baseData.taskIDTaskDatas = loadTaskList(redPacketTaskList, user.baseData.taskIDTaskDatas)
    57  		user.baseData.taskIDTaskDatas = loadTaskList(chipTaskList, user.baseData.taskIDTaskDatas)
    58  	}, func() {
    59  		user.WriteMsg(&msg.S2C_UpdateRedPacketTaskList{
    60  			Items: buildTaskItems(redPacketTaskList),
    61  		})
    62  		user.WriteMsg(&msg.S2C_UpdateChipTaskList{
    63  			Items: buildTaskItems(chipTaskList),
    64  		})
    65  		if cb != nil {
    66  			cb()
    67  		}
    68  	})
    69  }
    70  
    71  func (user *User) saveTaskList() {
    72  	skeleton.Go(func() {
    73  		db := mongoDB.Ref()
    74  		defer mongoDB.UnRef(db)
    75  		update := &struct {
    76  			RedPacketTaskList []TaskData
    77  			ChipTaskList      []TaskData
    78  			UpdatedAt         int64
    79  		}{
    80  			RedPacketTaskList: toTaskList(user.baseData.taskIDTaskDatas, taskRedPacket),
    81  			ChipTaskList:      toTaskList(user.baseData.taskIDTaskDatas, taskChip),
    82  			UpdatedAt:         time.Now().Unix(),
    83  		}
    84  		_, err := db.DB(DB).C("usertasklist").
    85  			Upsert(bson.M{"userid": user.baseData.userData.UserID}, bson.M{"$set": update})
    86  		if err != nil {
    87  			log.Debug("update userID: %v usertasklist error: %v", user.baseData.userData.UserID, err)
    88  		}
    89  	}, nil)
    90  }
    91  
    92  func (user *User) doTask(taskID int) {
    93  	if task, ok := user.baseData.taskIDTaskDatas[taskID]; ok {
    94  		if task.Progress < TaskList[taskID].Total {
    95  			task.Progress++
    96  			if TaskList[taskID].Type == taskRedPacket && task.Progress == TaskList[taskID].Total {
    97  				upsertTaskTicket(bson.M{"userid": user.baseData.userData.UserID, "finish": false, "taskid": task.TaskID},
    98  					bson.M{"$set": bson.M{"finish": true, "updatedat": time.Now().Unix()}})
    99  			}
   100  			user.WriteMsg(&msg.S2C_UpdateTaskProgress{
   101  				TaskID:   task.TaskID,
   102  				Progress: task.Progress,
   103  			})
   104  		}
   105  	}
   106  }
   107  
   108  func (user *User) takeTaskPrize(taskID int) {
   109  	task := user.baseData.taskIDTaskDatas[taskID]
   110  	if task.Taken {
   111  		user.WriteMsg(&msg.S2C_TakeTaskPrize{Error: msg.S2C_TakeTaskPrize_Repeated})
   112  		return
   113  	}
   114  	if task.Progress < TaskList[taskID].Total {
   115  		user.WriteMsg(&msg.S2C_TakeTaskPrize{Error: msg.S2C_TakeTaskPrize_NotDone})
   116  		return
   117  	}
   118  	switch TaskList[taskID].Type {
   119  	case taskRedPacket:
   120  		if task.Handling {
   121  			return
   122  		}
   123  		task.Handling = true
   124  		redPacket := rand.Float64()/2 + 1
   125  		if redPacketCounter%200 == 0 {
   126  			redPacket += float64(rand.Intn(3)) + 1
   127  		}
   128  		redPacket = common.Decimal(redPacket)
   129  		userID := user.baseData.userData.UserID
   130  
   131  		go func() {
   132  			exchangeCode, err := circle.GetRedPacketCode(redPacket)
   133  			if err != nil {
   134  				takeRedPacketTaskPrizeFail(userID, taskID)
   135  				return
   136  			}
   137  			takeRedPacketTaskPrizeSuccess(userID, taskID, redPacket, exchangeCode)
   138  			WriteRedPacketGrantRecord(user.baseData.userData, 1, TaskList[taskID].Desc, redPacket)
   139  			redPacketCounter++
   140  		}()
   141  	case taskChip:
   142  		task.Taken = true
   143  		task.TakenAt = time.Now().Unix()
   144  
   145  		chips := TaskList[taskID].Chips
   146  		user.baseData.userData.Chips += chips
   147  		user.WriteMsg(&msg.S2C_UpdateUserChips{
   148  			Chips: user.baseData.userData.Chips,
   149  		})
   150  		user.WriteMsg(&msg.S2C_TakeTaskPrize{
   151  			Error:  msg.S2C_TakeTaskPrize_TakeChipPrizeOK,
   152  			TaskID: taskID,
   153  			Chips:  chips,
   154  		})
   155  		saveChipTaskPrize(user.baseData.userData.UserID, taskID)
   156  	}
   157  }
   158  
   159  func takeRedPacketTaskPrizeSuccess(userID, taskID int, redPacket float64, exchangeCode string) {
   160  	saveRedPacketTaskPrize(userID, taskID, redPacket, exchangeCode)
   161  	if user, ok := userIDUsers[userID]; ok {
   162  		if task, ok := user.baseData.taskIDTaskDatas[taskID]; ok {
   163  			task.Taken = true
   164  			task.TakenAt = time.Now().Unix()
   165  			task.Handling = false
   166  			user.WriteMsg(&msg.S2C_TakeTaskPrize{
   167  				Error:        msg.S2C_TakeTaskPrize_TakeRedPacketPrizeOK,
   168  				TaskID:       taskID,
   169  				RedPacket:    common.Round(redPacket, 2),
   170  				ExchangeCode: exchangeCode,
   171  			})
   172  			user.updateRedPacketTaskList()
   173  		}
   174  		user.redpacketTaskRecord()
   175  	} else {
   176  		task := &TaskData{
   177  			TaskID:   taskID,
   178  			Progress: TaskList[taskID].Total,
   179  			Taken:    true,
   180  			TakenAt:  time.Now().Unix(),
   181  			Handling: false,
   182  		}
   183  		updateUserTask(userID, task)
   184  	}
   185  }
   186  
   187  func takeRedPacketTaskPrizeFail(userID, taskID int) {
   188  	if user, ok := userIDUsers[userID]; ok {
   189  		if task, ok := user.baseData.taskIDTaskDatas[taskID]; ok {
   190  			task.Handling = false
   191  			user.WriteMsg(&msg.S2C_TakeTaskPrize{
   192  				Error:  msg.S2C_TakeTaskPrize_Error,
   193  				TaskID: taskID,
   194  			})
   195  			user.WriteMsg(&msg.S2C_UpdateTaskProgress{
   196  				TaskID:   taskID,
   197  				Progress: task.Progress,
   198  			})
   199  		}
   200  	} else {
   201  		task := &TaskData{
   202  			TaskID:   taskID,
   203  			Progress: TaskList[taskID].Total,
   204  			Handling: false,
   205  		}
   206  		updateUserTask(userID, task)
   207  	}
   208  }
   209  
   210  func saveChipTaskPrize(userID, taskID int) {
   211  	now := time.Now()
   212  	skeleton.Go(func() {
   213  		db := mongoDB.Ref()
   214  		defer mongoDB.UnRef(db)
   215  		insert := &ChipTaskPrizeData{
   216  			UserID:    userID,
   217  			TaskID:    taskID,
   218  			Chips:     TaskList[taskID].Chips,
   219  			CreatedAt: now.Unix(),
   220  			UpdatedAt: now.Unix(),
   221  		}
   222  		err := db.DB(DB).C("chiptaskprize").Insert(insert)
   223  		if err != nil {
   224  			log.Debug("insert userid: %v chiptaskprize error: %v", userID, err)
   225  		}
   226  	}, nil)
   227  }
   228  
   229  func saveRedPacketTaskPrize(userID, taskID int, redPacket float64, exchangeCode string) {
   230  	now := time.Now()
   231  	db := mongoDB.Ref()
   232  	defer mongoDB.UnRef(db)
   233  	insert := &RedPacketTaskPrizeData{
   234  		UserID:       userID,
   235  		TaskID:       taskID,
   236  		RedPacket:    redPacket,
   237  		ExchangeCode: exchangeCode,
   238  		Desc:         TaskList[taskID].Desc,
   239  		CreatedAt:    now.Unix(),
   240  		UpdatedAt:    now.Unix(),
   241  		Taken:        false,
   242  	}
   243  	err := db.DB(DB).C("redpackettaskprize").Insert(insert)
   244  	if err != nil {
   245  		log.Debug("insert userid: %v redpackettaskprize error: %v", userID, err)
   246  	}
   247  }
   248  
   249  func (user *User) updateRedPacketTaskList() {
   250  	n := 0
   251  	for _, task := range user.baseData.taskIDTaskDatas {
   252  		switch TaskList[task.TaskID].Type {
   253  		case taskRedPacket:
   254  			if task.Taken {
   255  				delete(user.baseData.taskIDTaskDatas, task.TaskID)
   256  			} else {
   257  				n++
   258  			}
   259  		}
   260  	}
   261  	if n == 0 {
   262  		var taskIDs []int
   263  		if user.baseData.userData.Chips >= 50000 {
   264  			taskIDs = getRandomTaskIDs(1, taskRedPacket, RedPacketIDs2)
   265  		} else {
   266  			taskIDs = getRandomTaskIDs(1, taskRedPacket, RedPacketIDs)
   267  		}
   268  		redPacketTaskList := buildTaskList(taskIDs)
   269  		user.baseData.taskIDTaskDatas = loadTaskList(redPacketTaskList, user.baseData.taskIDTaskDatas)
   270  		user.WriteMsg(&msg.S2C_UpdateRedPacketTaskList{
   271  			Items: buildTaskItems(redPacketTaskList),
   272  		})
   273  	}
   274  }
   275  
   276  func (user *User) changeRedPacketTaskList(free bool) {
   277  }
   278  
   279  func saveRedPacketTaskChange(userID int, oldTaskID, newTaskID []int, free bool) {
   280  	now, fare := time.Now().Unix(), int64(0)
   281  	if !free {
   282  		fare = 5000
   283  	}
   284  	skeleton.Go(func() {
   285  		db := mongoDB.Ref()
   286  		defer mongoDB.UnRef(db)
   287  		err := db.DB(DB).C("redpackettaskchange").Insert(struct {
   288  			UserID    int
   289  			OldTaskID []int
   290  			NewTaskID []int
   291  			Fare      int64
   292  			CreatedAt int64
   293  		}{
   294  			UserID:    userID,
   295  			OldTaskID: oldTaskID,
   296  			NewTaskID: newTaskID,
   297  			Fare:      fare,
   298  			CreatedAt: now,
   299  		})
   300  		if err != nil {
   301  			log.Debug("insert userid: %v redpackettaskprize error: %v", userID, err)
   302  		}
   303  	}, nil)
   304  }
   305  
   306  func (user *User) freeChangeCountDown() {
   307  	countDown := time.Now().Unix() - user.baseData.userData.FreeChangedAt - 24*60*60
   308  	if countDown < 0 {
   309  		countDown = -countDown
   310  	} else {
   311  		countDown = 0
   312  	}
   313  	user.WriteMsg(&msg.S2C_FreeChangeCountDown{
   314  		Second: countDown,
   315  	})
   316  }