github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/task.go (about) 1 package internal 2 3 import ( 4 "common" 5 "msg" 6 "sort" 7 "time" 8 9 "github.com/name5566/leaf/log" 10 mgo "gopkg.in/mgo.v2" 11 "gopkg.in/mgo.v2/bson" 12 ) 13 14 func getRandomTaskIDs(n, taskType int, fromTaskIDs []int) []int { 15 var taskIDs []int 16 switch taskType { 17 case taskRedPacket: 18 taskIDs = common.Shuffle(fromTaskIDs) 19 taskIDs = common.RemoveAll(taskIDs, 28) 20 /*if checkRedPacketMatchingTime() { 21 taskIDs = common.RemoveAll(taskIDs, 28) 22 } 23 */ 24 case taskChip: 25 taskIDs = common.Shuffle(ChipTaskIDs[2:]) 26 default: 27 return []int{} 28 } 29 temp := append([]int{}, taskIDs[:n]...) 30 sort.Ints(temp) 31 return temp 32 } 33 34 func loadTaskList(taskList []TaskData, m map[int]*TaskData) map[int]*TaskData { 35 for _, taskData := range taskList { 36 task := &TaskData{ 37 TaskID: taskData.TaskID, 38 Progress: taskData.Progress, 39 Taken: taskData.Taken, 40 TakenAt: taskData.TakenAt, 41 Handling: taskData.Handling, 42 } 43 m[taskData.TaskID] = task 44 } 45 return m 46 } 47 48 func buildTaskList(taskIDs []int) []TaskData { 49 var taskList []TaskData 50 for _, taskID := range taskIDs { 51 taskList = append(taskList, TaskData{ 52 TaskID: taskID, 53 }) 54 } 55 return taskList 56 } 57 58 func addTaskItem(items []msg.TaskItem, taskID, progress int, taken bool) []msg.TaskItem { 59 items = append(items, msg.TaskItem{ 60 TaskID: taskID, 61 Progress: progress, 62 Taken: taken, 63 Total: TaskList[taskID].Total, 64 Desc: TaskList[taskID].Desc, 65 Chips: TaskList[taskID].Chips, 66 Jump: TaskList[taskID].Jump, 67 }) 68 return items 69 } 70 71 func buildTaskItems(taskList []TaskData) []msg.TaskItem { 72 var taskItems []msg.TaskItem 73 m := make(map[int]bool) 74 for _, taskData := range taskList { 75 // 可以领取奖励的任务 76 if !m[taskData.TaskID] && taskData.Progress >= TaskList[taskData.TaskID].Total && !taskData.Taken { 77 taskItems = addTaskItem(taskItems, taskData.TaskID, TaskList[taskData.TaskID].Total, taskData.Taken) 78 m[taskData.TaskID] = true 79 } 80 } 81 for _, taskData := range taskList { 82 // 进行中的任务 83 if !m[taskData.TaskID] && taskData.Progress < TaskList[taskData.TaskID].Total { 84 taskItems = addTaskItem(taskItems, taskData.TaskID, taskData.Progress, taskData.Taken) 85 m[taskData.TaskID] = true 86 } 87 } 88 for _, taskData := range taskList { 89 // 已领取奖励的任务 90 if !m[taskData.TaskID] && taskData.Progress >= TaskList[taskData.TaskID].Total && taskData.Taken { 91 taskItems = addTaskItem(taskItems, taskData.TaskID, TaskList[taskData.TaskID].Total, taskData.Taken) 92 m[taskData.TaskID] = true 93 } 94 } 95 return taskItems 96 } 97 98 func getOrderKeys(m map[int]*TaskData) []int { 99 var keys []int 100 for k := range m { 101 keys = append(keys, k) 102 } 103 sort.Ints(keys) 104 return keys 105 } 106 107 func toTaskList(m map[int]*TaskData, taskType int) []TaskData { 108 var taskList []TaskData 109 keys := getOrderKeys(m) 110 for _, k := range keys { 111 taskData := m[k] 112 if TaskList[taskData.TaskID].Type == taskType { 113 taskList = append(taskList, TaskData{ 114 TaskID: taskData.TaskID, 115 Progress: taskData.Progress, 116 Taken: taskData.Taken, 117 TakenAt: taskData.TakenAt, 118 Handling: taskData.Handling, 119 }) 120 } 121 } 122 return taskList 123 } 124 125 // 更新奖励被领取的红包任务 126 func updateRedPacketTaskList(taskList []TaskData) []TaskData { 127 var newTaskList []TaskData 128 var existTaskIDs []int 129 n := 0 130 for _, taskData := range taskList { 131 // 更新不可用任务 132 if _, ok := TaskList[taskData.TaskID]; !ok || taskData.Taken { 133 n++ 134 } else { 135 newTaskList = append(newTaskList, taskData) 136 existTaskIDs = append(existTaskIDs, taskData.TaskID) 137 } 138 } 139 if n > 0 { 140 taskIDs := common.Remove(RedPacketIDs, existTaskIDs) 141 taskIDs = common.Shuffle(taskIDs) 142 newTaskList = append(newTaskList, buildTaskList(taskIDs[:n])...) 143 } 144 return newTaskList 145 } 146 147 // 更新奖励被领取的金币任务 148 func updateChipTaskList(taskList []TaskData) []TaskData { 149 var newTaskList []TaskData 150 var existTaskIDs []int 151 n := 0 152 for _, taskData := range taskList { 153 // 活动任务直接追加进去 154 if _, ok := ActivityTimeList[taskData.TaskID]; ok { 155 newTaskList = append(newTaskList, taskData) 156 existTaskIDs = append(existTaskIDs, taskData.TaskID) 157 continue 158 } 159 // 任务转换,如果删表可以删除 160 switch taskData.TaskID { 161 case 12: 162 taskData.TaskID = 1000 163 } 164 // 更新不可用任务 165 if _, ok := TaskList[taskData.TaskID]; !ok { 166 //n++ 167 continue 168 } 169 if taskData.Taken { 170 takenTime := time.Unix(taskData.TakenAt, 0) 171 takenMidday := time.Date(takenTime.Year(), takenTime.Month(), takenTime.Day(), 12, 0, 0, 0, time.Local) 172 if takenMidday.Unix() > taskData.TakenAt { 173 takenMidday = takenMidday.Add(-24 * time.Hour) 174 } 175 if time.Now().Sub(takenMidday).Hours() >= 24 { 176 switch taskData.TaskID { 177 case 1000, 1001: 178 taskData.Progress = 0 179 taskData.Taken = false 180 newTaskList = append(newTaskList, taskData) 181 existTaskIDs = append(existTaskIDs, taskData.TaskID) 182 default: 183 n++ 184 } 185 } else { 186 newTaskList = append(newTaskList, taskData) 187 existTaskIDs = append(existTaskIDs, taskData.TaskID) 188 } 189 } else { 190 newTaskList = append(newTaskList, taskData) 191 existTaskIDs = append(existTaskIDs, taskData.TaskID) 192 } 193 } 194 if n > 0 { 195 taskIDs := common.Remove(ChipTaskIDs[2:], existTaskIDs) 196 taskIDs = common.Shuffle(taskIDs) 197 newTaskList = append(newTaskList, buildTaskList(taskIDs[:n])...) 198 } 199 return newTaskList 200 } 201 202 func updateActivityTaskList(taskList []TaskData) []TaskData { 203 now := time.Now().Unix() 204 var newTaskList []TaskData 205 // 非活动任务添加 206 for _, taskData := range taskList { 207 if _, ok := ActivityTimeList[taskData.TaskID]; !ok { 208 newTaskList = append(newTaskList, taskData) 209 } 210 } 211 for id, activityTime := range ActivityTimeList { 212 // 检查活动任务时效性 213 if now < activityTime.Start || now > activityTime.Deadline { 214 continue // 移除任务 215 } 216 have := false // 是否有这个任务 217 for _, taskData := range taskList { 218 if id == taskData.TaskID { 219 have = true 220 newTaskList = append(newTaskList, taskData) 221 break 222 } 223 } 224 if !have { // 没有就添加任务 225 if now < activityTime.End { 226 newTaskList = append(newTaskList, TaskData{ 227 TaskID: id, 228 }) 229 } 230 } 231 } 232 return newTaskList 233 } 234 235 func addTaskProgress(userID, taskID int) { 236 task := TaskList[taskID] 237 if task == nil { 238 log.Debug("taskID: %v 不存在", taskID) 239 return 240 } 241 skeleton.Go(func() { 242 db := mongoDB.Ref() 243 defer mongoDB.UnRef(db) 244 245 var err error 246 switch task.Type { 247 case taskRedPacket: 248 err = db.DB(DB).C("usertasklist"). 249 Update(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$lt": task.Total}}, 250 bson.M{"$inc": bson.M{"redpackettasklist.$.progress": 1}}) 251 if err == nil { 252 count, _ := db.DB(DB).C("usertasklist"). 253 Find(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$eq": task.Total}}). 254 Count() 255 if count == 1 { 256 upsertTaskTicket(bson.M{"userid": userID, "finish": false, "taskid": taskID}, 257 bson.M{"$set": bson.M{"finish": true, "updatedat": time.Now().Unix()}}) 258 } 259 } 260 case taskChip: 261 err = db.DB(DB).C("usertasklist"). 262 Update(bson.M{"userid": userID, "chiptasklist.taskid": taskID, "chiptasklist.progress": bson.M{"$lt": task.Total}}, 263 bson.M{"$inc": bson.M{"chiptasklist.$.progress": 1}}) 264 } 265 if err != nil && err != mgo.ErrNotFound { 266 log.Debug("update userID: %v usertasklist error: %v", userID, err) 267 } 268 }, nil) 269 } 270 271 func resetTaskProgress(userID, taskID int) { 272 task := TaskList[taskID] 273 if task == nil { 274 log.Error("taskID: %v 不存在", taskID) 275 return 276 } 277 skeleton.Go(func() { 278 db := mongoDB.Ref() 279 defer mongoDB.UnRef(db) 280 281 var err error 282 switch task.Type { 283 case taskRedPacket: 284 err = db.DB(DB).C("usertasklist"). 285 Update(bson.M{"userid": userID, "redpackettasklist.taskid": taskID, "redpackettasklist.progress": bson.M{"$lt": task.Total}}, 286 bson.M{"$set": bson.M{"redpackettasklist.$.progress": 0}}) 287 case taskChip: 288 err = db.DB(DB).C("usertasklist"). 289 Update(bson.M{"userid": userID, "chiptasklist.taskid": taskID, "chiptasklist.progress": bson.M{"$lt": task.Total}}, 290 bson.M{"$set": bson.M{"chiptasklist.$.progress": 0}}) 291 } 292 if err != nil && err != mgo.ErrNotFound { 293 log.Debug("update userID: %v usertasklist error: %v", userID, err) 294 } 295 }, nil) 296 } 297 298 func updateUserTask(userID int, task *TaskData) { 299 skeleton.Go(func() { 300 db := mongoDB.Ref() 301 defer mongoDB.UnRef(db) 302 303 var err error 304 switch TaskList[task.TaskID].Type { 305 case taskRedPacket: 306 err = db.DB(DB).C("usertasklist"). 307 Update(bson.M{"userid": userID, "redpackettasklist.taskid": task.TaskID}, 308 bson.M{"$set": bson.M{"redpackettasklist.$": task}}) 309 case taskChip: 310 err = db.DB(DB).C("usertasklist"). 311 Update(bson.M{"userid": userID, "chiptasklist.taskid": task.TaskID}, 312 bson.M{"$set": bson.M{"chiptasklist.$": task}}) 313 } 314 if err != nil { 315 log.Debug("update userID: %v usertasklist error: %v", userID, err) 316 } 317 }, nil) 318 } 319 320 // 做活动任务 321 func doActivityTask(userID int, taskID int) { 322 activityTime, ok := ActivityTimeList[taskID] 323 if !ok { 324 return 325 } 326 now := time.Now().Unix() 327 if now >= activityTime.Start && now < activityTime.End { 328 if user, ok := userIDUsers[userID]; ok { 329 user.doTask(taskID) 330 } else { 331 addTaskProgress(userID, taskID) 332 } 333 } 334 }