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 }