package logic import ( "HttpServer/jsonconf" "HttpServer/redishandler" "bytes" "common/beegomap" "common/logger" "common/redis" "crypto/md5" "encoding/hex" "encoding/json" "errors" "fmt" "io/ioutil" "math/rand" "net/http" "sort" "strconv" "strings" "sync" "time" ) var ( m_userInfo *beegomap.BeeMap //make(map[int32]*UserData Maplock *sync.RWMutex llock sync.RWMutex luserdatalock sync.RWMutex usercostlock sync.RWMutex offlinelock sync.RWMutex ) func init() { m_userInfo = beegomap.NewBeeMap() Maplock = new(sync.RWMutex) //llock = new(sync.RWMutex) } func SetHeader(w http.ResponseWriter) { w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域 w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Uuid") } func (v *TaskList) Len() int { return len(v.Taskdata) } func (v *TaskList) Swap(i, j int) { v.Taskdata[i], v.Taskdata[j] = v.Taskdata[j], v.Taskdata[i] } func (v *TaskList) Less(i, j int) bool { if v.Taskdata[i].Taskstatus == v.Taskdata[j].Taskstatus { return v.Taskdata[i].Taskid < v.Taskdata[j].Taskid } return v.Taskdata[i].Taskstatus > v.Taskdata[j].Taskstatus } func (u *UserData) HandlePassDay(uuid int) { isdiffday := false nowtime := time.Now() lasttime := time.Unix(int64(u.LastLoginTime), 0) nowdaynum := time.Now().Day() lastdaynum := time.Unix(int64(u.LastLoginTime), 0).Day() nowtimestamp := time.Date(nowtime.Year(), nowtime.Month(), nowtime.Day(), 0, 0, 0, 0, nowtime.Location()) lasttimestamp := time.Date(lasttime.Year(), lasttime.Month(), lasttime.Day(), 0, 0, 0, 0, lasttime.Location()) logger.Info("HandlePassDay lasttime=%v,lasttimestamp=%v", lasttime, lasttimestamp) logger.Info("HandlePassDay2 IsResetToday=%v,nowtimestampmin=%v", u.IsResetToday, nowtime.Minute()) if u.IsResetToday == 0 && nowtime.Hour() >= 12 { u.IsResetToday = 1 } if nowdaynum == lastdaynum { //同一天 if int64(u.LastLoginTime)-time.Now().Unix() > 86400 { //已经过了很多天了 u.ContinueLoginDay = 1 u.SumLoginDay++ } else { //t同一天 不做处理 } } else { //不是同一天了 isdiffday = true if nowtimestamp.Unix() != lasttimestamp.Unix()+86400 { u.ContinueLoginDay = 1 } else { u.ContinueLoginDay++ } u.SumLoginDay++ logger.Info("HandlePassDay now=%v,last=%v", nowtimestamp.Unix(), lasttimestamp.Unix()) } if isdiffday { //跨天了 u.RandRedBagLeftTime = RANDGIFTLIMIT u.ShakeTime = SHAKETIMELIMIT u.CurLoveVideo = 0 u.IsResetToday = 0 /*randint := rand.Intn(100) floatval := float32(randint) / 100 u.TodayZhaocai = 180 + floatval*/ u.IsSignToday = 0 if u.SignSum >= 7 { //进入新的一轮 u.SignSum = 0 } u.SignShow = 1 err := InitTaskAndAchievement(uuid) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) } //任务部分 u.Task.OnlineMin = 0 u.Task.MergeCat = 0 u.Task.TwistEgg = 0 u.Task.WatchAds = 0 // if u.EggTimeReset != 99 { u.EggTimeResetTime = int(time.Now().Unix()) u.EggTime = NOFREETWIEST u.FreeEggTime = FREETWIEST u.FELcnt = 3 } u.EggTimeReset = 0 } u.LastLoginTime = int(nowtime.Unix()) SaveUinfoToredis(u, uuid) } //计算转盘抽奖 func CalcTurnTableNum() (int, int, int) { rtnum := 0 rtex := 0 rtid := 0 sumrate := 0 tmprate := 0 idx := -1 rand.Seed(time.Now().UnixNano()) randnum := rand.Intn(100) cflist := jsonconf.GetJsonConf().TwistedEggConfig logger.Info("CalcTurnTableNum cfg=%+v", jsonconf.GetJsonConf().TwistedEggConfig) for _, vv := range cflist { sumrate += vv.Weight } logger.Info("CalcTurnTableNum sumrate=%v,randnum=%v,cflist=%+v", sumrate, randnum, cflist) for k, v := range cflist { tmprate += int(v.Weight * 100 / sumrate) logger.Info("CalcTurnTableNum tmprate=%v", tmprate) if tmprate >= randnum { idx = k break } } if idx == -1 { if len(cflist) > 0 { rtnum = cflist[0].Reward[1] rtid = 0 + 1 } } else { if cflist[idx].Reward[0] == 2 { rtnum = cflist[idx].Reward[1] } else { rtnum = 0 rtex = cflist[idx].Reward[1] } rtid = idx + 1 } return rtnum, rtid, rtex } func GetServerKey(gameid string) string { rtkey := "" if gameid == "1025" { rtkey = "27d65903425cb23d92e9758050c3f932" } if gameid == "1023" { rtkey = "e2a49028f48f5651dfe8a32709ecfcfc" } return rtkey } //计算领取随机红包值 func (u *UserData) CalcRandRedBagNum() float32 { //todo 用公式计算 rand.Seed(time.Now().UnixNano()) addnum := float32(0) if u.SumRandRedBagTimes <= 10 { addnum = float32(rand.Intn(30))/100 + 0.2 } else if u.SumRandRedBagTimes > 10 && u.SumRandRedBagTimes <= 20 { addnum = float32(rand.Intn(30))/100 + 0.1 } else if u.SumRandRedBagTimes > 20 && u.SumRandRedBagTimes <= 30 { addnum = float32(rand.Intn(20))/100 + 0.1 } else if u.SumRandRedBagTimes > 30 && u.SumRandRedBagTimes <= 100 { addnum = float32(rand.Intn(20)) / 100 } else { addnum = float32(rand.Intn(10)) / 100 } return addnum } func GettotalParam(paramlist []string) string { //排序 sort.Strings(paramlist) //拼接 sumparam := "" for _, val := range paramlist { sumparam += val } return sumparam } func GetHashValue(signsum string) string { /*h := sha1.New() h.Write([]byte(signsum)) bs := h.Sum(nil) sign := hex.EncodeToString(bs)*/ ctx := md5.New() ctx.Write([]byte(signsum)) return hex.EncodeToString(ctx.Sum(nil)) } func DoHttpPost(bys []byte, apistr string) (string, error) { body := bytes.NewBuffer(bys) url1 := XIAOXINGXING_SDKURLOFFICAL + apistr //"api/server/addcoin" res, err := http.Post(url1, "application/json;charset=utf-8", body) if err != nil { logger.Error("DoHttpPost failed err=%v", err) return "", err } result, _ := ioutil.ReadAll(res.Body) defer res.Body.Close() return string(result), nil } func GetCashList(uuid int, gameid string, channel string, start int, number int) (*[]WithDrawRecord, error) { //SERVERKEY := conf.GetCoinConf().Key SERVERKEY := GetServerKey(gameid) /*if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 }*/ var paramlist []string var params GetCashListDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) params.Start = start params.Number = number signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) pstart := "start=" + strconv.Itoa(start) pnumber := "number=" + strconv.Itoa(number) paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) if start != 0 { paramlist = append(paramlist, pstart) } paramlist = append(paramlist, pnumber) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY logger.Info("GetCashList sumparam=%v", signsum) //进行hash sign := GetHashValue(signsum) params.Sign = sign bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCashList failed=%v", err) return nil, err } res, err := DoHttpPost(bys, "api/server/tixian/lst") if err != nil { logger.Error("GetCashList failed=%v", err) return nil, err } logger.Info("GetCashList res=%v", res) var resp GetCashListResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return nil, err } if resp.Code != "0" { logger.Error("GetCoinFromSdk failed=%v", resp.Msg) return nil, err } return &resp.Data, nil } func GetCashFromSDK(uuid int, goldnum int, gameid, channel, openid, nickname, headurl, ver string, checkcoin int) (int, error) { logger.Info("GetCashFromSDK uid=%v,channel=%v", uuid, channel) //需要校验金币是否足够 oldnum, err := GetCoinFromSdk(uuid, gameid, channel) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } if oldnum < goldnum*100 { logger.Error("GetCashFromSDK gold not enough failed=%v", err) return 0, errors.New("金币不足!") } //SERVERKEY := u.GetServerKey() //conf.GetCoinConf().Key SERVERKEY := GetServerKey(gameid) if goldnum == 0 || uuid == 0 || gameid == "" || channel == "" || openid == "" || ver == "" { logger.Error("GetCashFromSDK param empty") return 0, errors.New("param empty") } var paramlist []string var params TixianDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) params.Headurl = headurl params.Money = goldnum params.Openid = openid params.Nickname = nickname params.Typ = 6 params.Ver = ver params.Editcoin = 1 params.Checkcoin = checkcoin signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) phead := "headurl=" + headurl pnickname := "nickname=" + nickname popenid := "openid=" + openid pmoney := "money=" + strconv.Itoa(goldnum) ptype := "typ=" + "6" //微信 ped := "editcoin=1" pcheco := "checkcoin=" + strconv.Itoa(checkcoin) //pver := "ver=" + params.Ver paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) if headurl != "" { paramlist = append(paramlist, phead) } if nickname != "" { paramlist = append(paramlist, pnickname) } paramlist = append(paramlist, popenid) paramlist = append(paramlist, pmoney) paramlist = append(paramlist, ptype) paramlist = append(paramlist, ped) paramlist = append(paramlist, pcheco) //paramlist = append(paramlist, pver) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY //进行hash sign := GetHashValue(signsum) params.Sign = sign bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/tixian") logger.Info("GetCashFromSDK sumparam is:%v,sign is:%v", signsum, sign) logger.Info("GetCashFromSDK sumparam param=%v", string(bys)) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } logger.Info("GetCashFromSDK res=%v", res) var resp GetCashResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } if resp.Code != "0" { logger.Error("GetCashFromSDK failed=%v", resp.Msg) return 0, errors.New(resp.Msg) } //拉取一下新的金币值 newnum, err := GetCoinFromSdk(uuid, gameid, channel) if err != nil { logger.Error("GetCashFromSDK failed=%v", err) return 0, err } return newnum, nil } func (u *UserData) AddRedPackect(num float32, atype int, channel, gameid string, uuid int) (int, error) { SERVERKEY := GetServerKey(gameid) goldnum := int(num * 10000) var paramlist []string sign_type := "sign_type=md5" paramlist = append(paramlist, sign_type) time_stamp := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramlist = append(paramlist, time_stamp) paramgameid := "gameid=" + gameid paramlist = append(paramlist, paramgameid) pchannel := "channel=" + channel paramlist = append(paramlist, pchannel) puid := "uid=" + strconv.Itoa(uuid) paramlist = append(paramlist, puid) pcoin := "coin=" + strconv.Itoa(goldnum) paramlist = append(paramlist, pcoin) ptyp := "typ=" + strconv.Itoa(atype) paramlist = append(paramlist, ptyp) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY logger.Info("AddCoinToSdk sumparam=%v", signsum) //进行hash sign := GetHashValue(signsum) var req AddCoinDesc req.Channel = channel req.Gameid = gameid req.Coin = goldnum req.Sign = sign req.Sign_type = "md5" req.Time_stamp = strconv.Itoa(int(time.Now().Unix())) req.Typ = atype req.Uid = uuid bys, err := json.Marshal(&req) if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/addcoin") if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, err } logger.Info("AddCoinToSdk res=%v", res) var resp AddCoinResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("AddCoinToSdk failed=%v", err) return 0, errors.New("failed!") } if resp.Code != "0" { gold, _ := GetCoinFromSdk(uuid, gameid, channel) logger.Error("AddCoinToSdk failed=%v", resp.Msg) return gold, errors.New("failed!") } return resp.Data.Mycoin, nil } func GetCoinFromSdk(uuid int, gameid string, channel string) (int, error) { //SERVERKEY := conf.GetCoinConf().Key SERVERKEY := GetServerKey(gameid) /*if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 }*/ var paramlist []string var params GetCoinDesc params.Sign_type = "md5" params.Gameid = gameid params.Channel = channel params.Uid = uuid params.Time_stamp = strconv.Itoa(int(time.Now().Unix())) signtypestr := "sign_type=" + params.Sign_type timestampstr := "time_stamp=" + strconv.Itoa(int(time.Now().Unix())) paramgameid := "gameid=" + gameid pchannel := "channel=" + channel puid := "uid=" + strconv.Itoa(uuid) paramlist = append(paramlist, signtypestr) paramlist = append(paramlist, timestampstr) paramlist = append(paramlist, paramgameid) paramlist = append(paramlist, pchannel) paramlist = append(paramlist, puid) sumparam := GettotalParam(paramlist) //加serverkey signsum := sumparam + SERVERKEY //进行hash sign := GetHashValue(signsum) params.Sign = sign logger.Info("GetCoinFromSdk sumparam is:%v,sign is:", signsum, sign) bys, err := json.Marshal(¶ms) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } res, err := DoHttpPost(bys, "api/server/getcoin") if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } logger.Info("GetCoinFromSdk res=%v", res) var resp AddCoinResp err = json.Unmarshal([]byte(res), &resp) if err != nil { logger.Error("GetCoinFromSdk failed=%v", err) return 0, err } if resp.Code != "0" { logger.Error("GetCoinFromSdk failed=%v", resp.Msg) return 0, err } return resp.Data.Mycoin, nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// func HandlerClearsigndata(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp ChangeCoinResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerClearsigndata getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo.IsSignToday = 0 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerChangeCoin(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp ChangeCoinResp resp.Code = 0 resp.Message = "success" var rdata ChangeCoinReq err := json.Unmarshal([]byte(data), &rdata) if err != nil { logger.Info("json decode HandlerChangeCoin data failed:%v,for:%v", err, data) resp.Message = "json unmarshal failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) logger.Info("###HandlerLogin###rdata:%v", string(respstr)) fmt.Fprint(w, string(respstr)) return } for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerTestaddCat getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } addgold := rdata.Coin if rdata.Type == 0 { uinfo.Gold += addgold } else if rdata.Type == 1 { uinfo.Gold -= addgold } else if rdata.Type == 2 { uinfo.Love += addgold } else if rdata.Type == 3 { uinfo.Love -= addgold if uinfo.Love < 0 { uinfo.Love = 0 } } resp.Data.Coin.UserId = uuid resp.Data.Coin.Coin = strconv.FormatInt(uinfo.Gold, 10) resp.Data.Coin.IcomeRate = strconv.FormatInt(uinfo.Goldrate, 10) resp.Data.Coin.UpdateTime = int(time.Now().Unix()) SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerTestaddCat(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp TestAddCatResp resp.Code = 0 resp.Message = "success" var rdata TestAddCatReq err := json.Unmarshal([]byte(data), &rdata) if err != nil { logger.Info("json decode HandlerTestaddCat data failed:%v,for:%v", err, data) resp.Message = "json unmarshal failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) logger.Info("###HandlerLogin###rdata:%v", string(respstr)) fmt.Fprint(w, string(respstr)) return } for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerTestaddCat getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if rdata.Position < 0 || rdata.Position > len(uinfo.PosInfo)-1 { logger.Error("HandlerTestaddCat Position failed=%v", err) resp.Code = 1 resp.Message = "get Position failed" break } catid := rdata.CatId if catid == 47 { //红包猫 logger.Error("HandlerTestaddCat Position failed=%v", err) resp.Code = 1 resp.Message = "参数错误" break } else if catid == 48 { } else { uinfo.PosInfo[rdata.Position].Catlv = catid uinfo.PosInfo[rdata.Position].Pos = rdata.Position } uinfo.Goldrate = CalcGoldRate(uinfo, uuid) SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) //logger.Info("###HandlerLogin###rdata:%v", string(respstr)) } //记录,计算购买猫次数的任务 func (u *UserData) CalcBuyCatTask(count int) { u.Taskinfo.BuyCatTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().TaskConfig { if v.Type == TASK_TYPE_BUYCAT { if u.Taskinfo.BuyCatTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } //将所有符合领奖的id加入列表 Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.Taskinfo.HaveComplete[val] if !ok { //没有完成过的才加入 u.Taskinfo.CompleteId[val] = 1 } } } //记录合成猫次数 func (u *UserData) CalcMergeCatTask(count int) { u.Taskinfo.MergeTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().TaskConfig { if v.Type == TASK_TYPE_MERGE { if u.Taskinfo.MergeTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.Taskinfo.HaveComplete[val] if !ok { //没有完成过的才加入 u.Taskinfo.CompleteId[val] = 1 } } } //记录陪玩 func (u *UserData) CalcPlayWithTask(count int) { u.Taskinfo.PlayWithTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().TaskConfig { if v.Type == TASK_TYPE_PLAYWITHCAT { if u.Taskinfo.PlayWithTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.Taskinfo.HaveComplete[val] if !ok { //没有完成过的才加入 u.Taskinfo.CompleteId[val] = 1 } } } //记录看广告 func (u *UserData) CalcWatchAddTask(count int) { u.Taskinfo.WatchAddTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().TaskConfig { if v.Type == TASK_TYPE_WATCHADD { if u.Taskinfo.WatchAddTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.Taskinfo.HaveComplete[val] if !ok { //没有完成过的才加入 u.Taskinfo.CompleteId[val] = 1 } } } //记录解锁新猫 func (u *UserData) CalcGetNewCatAchieve(count int) { u.AchieveMent.GetNewCatTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Type == ACH_TYPE_GETCAT { if u.AchieveMent.GetNewCatTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.AchieveMent.HaveComplete[val] if !ok { //没有完成过的才加入 u.AchieveMent.CompleteId[val] = 1 } } } //记录解锁新猫架子 func (u *UserData) CalcGetNewCatJiaAchieve(count int) { u.AchieveMent.GetAllJia += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Type == ACH_TYPE_GETCATJIA { if u.AchieveMent.GetAllJia >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.AchieveMent.HaveComplete[val] if !ok { //没有完成过的才加入 u.AchieveMent.CompleteId[val] = 1 } } } //记录获得的家具 func (u *UserData) CalcGetCatRoomJuAchieve(count int) { u.AchieveMent.GetRoomJu += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Type == ACH_TYPE_GETCATROOMJIA { if u.AchieveMent.GetRoomJu >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.AchieveMent.HaveComplete[val] if !ok { //没有完成过的才加入 u.AchieveMent.CompleteId[val] = 1 } } } //记录获得的家具 func (u *UserData) CalcNewStoryAchieve(count int) { u.AchieveMent.StoryTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Type == ACH_TYPE_GETSTORY { if u.AchieveMent.StoryTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.AchieveMent.HaveComplete[val] if !ok { //没有完成过的才加入 u.AchieveMent.CompleteId[val] = 1 } } } //记录获得的店铺 func (u *UserData) CalcNewShopAchieve(count int) { u.AchieveMent.ShopTime += count //下面需要判断触发的对应任务数据 var tmpsl []int for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Type == ACH_TYPE_GBESHOP { if u.AchieveMent.ShopTime >= v.Parameter { tmpsl = append(tmpsl, v.Id) } } } Maplock.RLock() defer Maplock.RUnlock() for _, val := range tmpsl { _, ok := u.AchieveMent.HaveComplete[val] if !ok { //没有完成过的才加入 u.AchieveMent.CompleteId[val] = 1 } } } //记录任务数据 func (u *UserData) DoucmentTaskAndAch(count int, ctype int) { return switch ctype { case TASK_TYPE_ONLINE: //在请求拉取任务数据的时候请求一下即可 case TASK_TYPE_BUYCAT: u.CalcBuyCatTask(count) case TASK_TYPE_MERGE: u.CalcMergeCatTask(count) case TASK_TYPE_PLAYWITHCAT: u.CalcPlayWithTask(count) case TASK_TYPE_WATCHADD: u.CalcWatchAddTask(count) case ACH_TYPE_GETCAT: u.CalcGetNewCatAchieve(count) case ACH_TYPE_GETCATJIA: u.CalcGetNewCatJiaAchieve(count) case ACH_TYPE_GETCATROOMJIA: u.CalcGetCatRoomJuAchieve(count) case ACH_TYPE_GETSTORY: u.CalcNewStoryAchieve(count) case ACH_TYPE_GBESHOP: u.CalcNewShopAchieve(count) default: logger.Error("DoucmentTaskAndAch not have thistype=%v", ctype) } } //尝试将合成界面的猫放入仓库 返回位置索引 -1表示仓库已满放入失败 func tryPutToWareHouse(info *UserWareHouseData, lv int, uuid int) int { rtval := -1 for k, v := range info.Info { if v.Warelv == 0 { rtval = k info.Info[k].Warelv = lv //v.Warelv = lv break } } if rtval != -1 { wares, _ := json.Marshal(info) redishandler.GetRedisClient().HSet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid), string(wares)) } return rtval } //合成红包猫 返回红包猫等级 等级为red_catconfig的id+100 func MergeRedBagCat(uinfo *UserData, pos int) int { rtpos := 0 if uinfo.IsFirstRedBgCat == 0 { //第一次合成 必定合成东方猫 uinfo.PosInfo[pos].Pos = pos uinfo.PosInfo[pos].Catlv = 100 + 3 uinfo.PosInfo[pos].Countdown = 0 rtpos = pos uinfo.IsFirstRedBgCat = 1 } else { //走随机合成逻辑 sumrate := float32(0) for _, v := range jsonconf.GetJsonConf().RedCatConfig { sumrate += v.Rate } rand.Seed(time.Now().UnixNano()) randnum := rand.Intn(100) tmprate := 0 for _, v := range jsonconf.GetJsonConf().RedCatConfig { tmprate += int(v.Rate / sumrate) if tmprate >= randnum { uinfo.PosInfo[pos].Pos = pos uinfo.PosInfo[pos].Catlv = 100 + v.Id uinfo.PosInfo[pos].Countdown = v.LeftTime rtpos = pos break } } } return rtpos } //处理红包猫自动合成 func DoAutoMergeRedCat(uinfo *UserData, uuid int) { //首先处理五方招财猫逻辑 eastsum := 0 westsum := 0 southsum := 0 northsum := 0 middlesum := 0 malenum := 0 fmalenum := 0 rednum := 0 for _, v := range uinfo.PosInfo { if v.Catlv == 103 { eastsum++ } if v.Catlv == 104 { westsum++ } if v.Catlv == 105 { southsum++ } if v.Catlv == 106 { northsum++ } if v.Catlv == 107 { middlesum++ } if v.Catlv == 108 { malenum++ } if v.Catlv == 109 { fmalenum++ } if v.Catlv == 110 { rednum++ } } //五方猫 if eastsum > 0 && westsum > 0 && northsum > 0 && southsum > 0 && middlesum > 0 { //合成一天招财猫 //首先去除五只猫 onepos := -1 for k, v := range uinfo.PosInfo { if v.Catlv == 103 { onepos = k uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } for k, v := range uinfo.PosInfo { if v.Catlv == 104 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } for k, v := range uinfo.PosInfo { if v.Catlv == 105 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } for k, v := range uinfo.PosInfo { if v.Catlv == 106 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } for k, v := range uinfo.PosInfo { if v.Catlv == 107 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } if onepos < 0 { logger.Error("DoAutoMergeRedCat failed onepos=%v", onepos) } uinfo.PosInfo[onepos].Catlv = 102 //全球招财猫 cfg := GetRedCatConfig(uinfo.PosInfo[onepos].Catlv) if cfg == nil { logger.Error("DoAutoMergeRedCat getrdcfg failed lv=%v", uinfo.PosInfo[onepos].Catlv) } else { uinfo.PosInfo[onepos].Countdown = cfg.LeftTime } } //情侣猫 if malenum > 0 && fmalenum > 0 { for k, v := range uinfo.PosInfo { if v.Catlv == 108 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } for k, v := range uinfo.PosInfo { if v.Catlv == 109 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } //直接获得红包 cfg := GetRedCatConfig(109) if cfg != nil { uinfo.Redbag += int(cfg.Money * 100) logger.Info("user get money uid=%v,num=%v", uuid, int(cfg.Money*100)) } } //红包猫 if rednum > 0 { for k, v := range uinfo.PosInfo { if v.Catlv == 110 { uinfo.PosInfo[k].Catlv = 0 uinfo.PosInfo[k].Countdown = 0 break } } cfg := GetRedCatConfig(110) if cfg != nil { uinfo.Redbag += int(cfg.Money * 100) logger.Info("user get money uid=%v,num=%v", uuid, int(cfg.Money*100)) } } } //处理自动合成 func DoAutoMerge(uinfo *UserData, uuid int) { stop := false for { if stop { break } isrestart := false for i := 0; i < len(uinfo.PosInfo); i++ { isrestart = false for j := 0; j < len(uinfo.PosInfo); j++ { if j <= i { //只需要跟比自己后面的元素 continue } //不是红包猫 //logger.Info("DoAutoMerge i=%v j=%v", i, j) if uinfo.PosInfo[i].Catlv == uinfo.PosInfo[j].Catlv && uinfo.PosInfo[i].Catlv > 0 && uinfo.PosInfo[i].Catlv < 100 && uinfo.PosInfo[i].Catlv <= uinfo.Highestlv-1 { uinfo.PosInfo[j].Catlv = 0 uinfo.PosInfo[i].Catlv++ if uinfo.PosInfo[i].Catlv > uinfo.Highestlv { uinfo.Highestlv = uinfo.PosInfo[i].Catlv //得到新的猫 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCAT) for { if uinfo.Highestlv-7 > len(uinfo.BuyCatInfo) { clv := uinfo.Highestlv - 7 initcatcfg := GetCatConfig(clv) if initcatcfg != nil { var info BuyCatInfoData info.Buytime = 0 info.CurPrice = initcatcfg.Price info.IsMaxBuytime = 0 uinfo.BuyCatInfo = append(uinfo.BuyCatInfo, info) logger.Info("ADD BuyCatInfo good higest=%v", uinfo.Highestlv) } else { logger.Error("HandlerExchangePos failed") } } else { break } } } newcatcfg := GetCatConfig(uinfo.PosInfo[i].Catlv) if newcatcfg == nil { logger.Error("HandlerExchangePos failed") } else { addnum := newcatcfg.CSNum - len(uinfo.PosInfo) for i := 0; i < addnum; i++ { var tmp PosData tmp.Pos = i + len(uinfo.PosInfo) tmp.Catlv = 0 uinfo.PosInfo = append(uinfo.PosInfo, tmp) //得到新的猫架子 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCATJIA) } } //算一次合成 做一个记录 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_MERGE) isrestart = true break } } if isrestart { break } if i == len(uinfo.PosInfo)-1 { //遍历到最后一处也没有可合并的则推出 stop = true } } } uinfo.Goldrate = CalcGoldRate(uinfo, uuid) logger.Info("automeger uinfo=%v", uinfo) } func IsCatUpToRoom(uinfo *UserData, lv int) bool { for _, v := range uinfo.CatRoomInfo { if v.LvCatlv == lv { return true } } return false } //获取普通猫等级 func GetCatConfig(lv int) *jsonconf.Cdesc { for _, v := range jsonconf.GetJsonConf().CatConfig { if v.Id == lv { return &v } } return nil } //获取任务配置 func GetTaskConfig(id int) *jsonconf.Adesc { for _, v := range jsonconf.GetJsonConf().TaskConfig { if v.Id == id { return &v } } return nil } //获取成就配置 func GetAchieveConfig(id int) *jsonconf.Adesc { for _, v := range jsonconf.GetJsonConf().AchievementConfig { if v.Id == id { return &v } } return nil } //获取猫咖门店配置 func GetCatShopConfig(id int) *jsonconf.Shopdesc { for _, v := range jsonconf.GetJsonConf().ShopConfig { if v.Id == id { return &v } } return nil } //获取红包猫配置 func GetRedCatConfig(lv int) *jsonconf.RCdesc { reallv := lv - 100 if reallv < 1 { reallv = 1 } for _, v := range jsonconf.GetJsonConf().RedCatConfig { if v.Id == reallv { return &v } } return nil } //获取猫店配置 func GetCatRoomCfg(lv int) *jsonconf.CRdesc { for _, v := range jsonconf.GetJsonConf().CatRoomConfig { if v.Id == lv { return &v } } return nil } //计算购买后猫箱子的位置,将箱子放到对应位置 返回值表示位置 -1表示失败都满了 func getCatPutPos(uinfo *UserData, clv int) int { pos := -1 for k, v := range uinfo.PosInfo { if v.Catlv == 0 { uinfo.PosInfo[k].Catlv = clv uinfo.PosInfo[k].Pos = k //v.Catlv = clv //v.Pos = k pos = k break } } return pos } func CalcGoldRate(udata *UserData, uuid int) int64 { //计算出所有速率的和 //计算方式为 首先计算合成界面猫的产出速率,然后计算红毛包的产出速率,最后计算仓库中的猫的产出速率 var sumrate int64 sumrate = 0 //udata.Goldrate cfg37 := GetCatConfig(37) if cfg37 == nil { logger.Error("37cfg err!!") } for _, v := range udata.PosInfo { if v.Catlv > 0 && v.Catlv < 100 { //有猫存在的要计算一下 //非红包猫 for _, vv := range jsonconf.GetJsonConf().CatConfig { if vv.Id == v.Catlv { //logger.Info("CalcGoldRate rate=%v", sumrate) sumrate += vv.Goldget break } else { //logger.Info("CalcGoldRate2") } } } if v.Catlv > 100 { //红包猫 需要判断是否产金币 rcfg := GetRedCatConfig(v.Catlv) if rcfg != nil { if rcfg.Is37 != 0 { //logger.Info("CalcGoldRate rate=%v", sumrate) sumrate += cfg37.Goldget } } else { logger.Error("GetRedCatConfig failed lv=%v", v.Catlv) } } } /*udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid)) if err != nil { //logger.Error("CalcGoldRate failed err=%v", err) return sumrate } wdata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), wdata) if err != nil { logger.Error("CalcGoldRate Unmarshal redis failed ") return sumrate } for _, v := range wdata.Info { rcfg := GetRedCatConfig(v.Warelv + 100) if rcfg != nil { if rcfg.Is37 != 0 { sumrate += cfg37.Goldget } } else { logger.Error("GetRedCatConfig failed lv=%v", v.Warelv+100) } }*/ return sumrate } func CalcLoveRate(data *UserData) float32 { //额外加成 extrarate := 0 sumrate := float32(0) //计算上阵速率 sumup := 0 for _, v := range data.CatRoomInfo { if v.LvCatlv != 0 { sumup++ cfg := GetCatConfig(v.LvCatlv) if cfg != nil { sumrate += cfg.Loveadd extrarate += cfg.Loveget } } } if sumup >= 0 { sumrate += 1 } finalrate := sumrate*5 + float32(extrarate) return finalrate } //初始化玩家信息 func InitUserInfo(data *UserLoginData, resp *UserLoginResp, uuid int) { udata := new(UserData) udata.Gold = 0 udata.Love = 2000 udata.InviteId = data.Fromid udata.Highestlv = 0 udata.CurBoxLv = 1 udata.IsDouble = 0 udata.IsAuto = 0 udata.IsBoxAcc = 0 udata.RandGiftDay = time.Now().Day() udata.RandGiftNum = 6 udata.RandGiftTime = int(time.Now().Unix()) udata.Redbag = 0 udata.IsFirstRedBgCat = 0 udata.RandRedBagLeftTime = RANDGIFTLIMIT udata.ContinueLoginDay = 1 udata.SumLoginDay = 1 udata.LastLoginTime = int(time.Now().Unix()) udata.ShakeTime = SHAKETIMELIMIT udata.FreeEggTime = FREETWIEST udata.EggTime = NOFREETWIEST udata.FELcnt = 3 udata.EggTimeReset = 0 udata.IsNew = 1 resp.Gold = udata.Gold resp.Love = udata.Love resp.Highestlv = udata.Highestlv resp.Curboxlv = udata.CurBoxLv resp.Isdoublegold = udata.IsDouble resp.Isauto = udata.IsAuto udata.Taskinfo.StartOnline = make(map[int]int64) udata.Taskinfo.WatchAddTime = 0 //Maplock.RLock() udata.Taskinfo.CompleteId = make(map[int]int) udata.Taskinfo.HaveComplete = make(map[int]int) //Maplock.RUnlock() //初始化五个猫爬架 for i := 0; i < 5; i++ { var d1 PosData d1.Pos = i d1.Catlv = 0 udata.PosInfo = append(udata.PosInfo, d1) var d2 DataDesc d2.Pos = i d2.Catlv = 0 resp.Data = append(resp.Data, d2) //得到新的猫架子 udata.DoucmentTaskAndAch(1, ACH_TYPE_GETCATJIA) } udata.Goldrate = CalcGoldRate(udata, uuid) udata.Loverate = CalcLoveRate(udata) resp.Goldrate = udata.Goldrate resp.Loverate = udata.Loverate resp.Issignshow = udata.SignShow resp.Isnew = udata.IsNew //初始化商店信息 initcatcfg := GetCatConfig(1) if initcatcfg == nil { logger.Error("get 1catcfg err") return } var info BuyCatInfoData info.Buytime = 0 info.CurPrice = initcatcfg.Price info.IsMaxBuytime = 0 udata.BuyCatInfo = append(udata.BuyCatInfo, info) //初始化猫咖门店数据 udata.CatShopInfo.LeftTime = 0 udata.CatShopInfo.Chapter = 1 udata.CatShopInfo.DayNum = time.Now().Day() udata.CatShopInfo.IsPlaying = 0 udata.CatShopInfo.PlayTimes = 0 udata.CatShopInfo.Section = 1 udata.CatShopInfo.ThisIsWatch = 0 udata.CatShopInfo.TotalWatchNumLeft = 8 // //初始化提现档位 for _, val := range jsonconf.GetJsonConf().RMBConfig { var tmp WithDrawDesc tmp.Cid = val.Id tmp.Cnum = val.Rmb_num if val.Time == 1 { tmp.Isnew = 1 } else { tmp.Isnew = 2 } tmp.Limitlv = val.Cat_level tmp.LoginDayLimit = val.Login_day if val.Id == 1 || val.Rmb_num == 20 { tmp.Preisfind = 1 } else { tmp.Preisfind = 0 } udata.WithDraw.Cashdata = append(udata.WithDraw.Cashdata, tmp) } logger.Info("Init user data=%v", udata) m_userInfo.Set(uint32(uuid), udata) //保存redis SaveUinfoToredis(udata, uuid) //初始化保存一下上一次计算玩家数据时间 nowtime := time.Now().Unix() nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_LAST_LOGIN_TIME, strconv.Itoa(int(uuid)), nowtimestr) //初始化玩家仓库信息 pware := new(UserWareHouseData) for i := 0; i < 15; i++ { var tmp WareHouseDesc tmp.Warelv = 0 pware.Info = append(pware.Info, tmp) } wares, err := json.Marshal(pware) if err != nil { logger.Info("InitUserInfo warehouse failed err=%v", err) } redishandler.GetRedisClient().HSet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid), string(wares)) //保存此次计算时间 redishandler.GetRedisClient().HSet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid), nowtimestr) //初始化一下玩家的任务与成就数据数据 err = InitTaskAndAchievement(uuid) } func GetTaskInfo(uuid int, tasktype int) (*TaskList, error) { unqiueuuid := strconv.Itoa(uuid) var data string var err error if tasktype == 1 { data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid) //兼容老的数据 if err != nil { //没有读到数据 则去读取一下老的id olddata, err := redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid)) if err == nil { err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, unqiueuuid, olddata) if err == nil { //删除老的数据 以后都走新的数据 err = redishandler.GetRedisClient().HDel(redis.USER_TASKINFO_LIST, strconv.Itoa(uuid)) logger.Info("GetTaskInfo uuid=%v do set", uuid) } data, err = redishandler.GetRedisClient().HGet(redis.USER_TASKINFO_LIST, unqiueuuid) } } } else { logger.Error("tasktype invalid") return nil, errors.New("tasktype invalid") } if err != nil { return nil, err } var list TaskList err = json.Unmarshal([]byte(data), &list) if err != nil { logger.Error("GetTaskInfo err=%v", err) return nil, err } return &list, err } func SaveTaskInfo(uuid string, tasktype int, list *TaskList) error { savestr, err := json.Marshal(list) if err != nil { logger.Error("SaveTaskInfo err =%v", err) return err } if tasktype == 1 { err = redishandler.GetRedisClient().HSet(redis.USER_TASKINFO_LIST, uuid, string(savestr)) } else if tasktype == 2 { //err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, uuid, string(savestr)) //logger.Info("SaveTaskInfo savestr=%v", string(savestr)) } else { logger.Error("tasktype invalid") return errors.New("tasktype invalid") } return err } func (t *TaskList) IsInTaskList(id int) bool { for _, val := range t.Taskdata { if val.Taskid == id { return true } } return false } func InitTaskAndAchievement(uuid int) error { unqiueid := strconv.Itoa(uuid) //先初始化任务 tlist, _ := GetTaskInfo(uuid, 1) if tlist == nil { tasklist := new(TaskList) for _, val := range jsonconf.GetJsonConf().NewTaskConfig { var tmp TaskListDesc tmp.Taskstatus = 1 tmp.Taskid = val.Id tmp.Taskprogress = 0 tasklist.Taskdata = append(tasklist.Taskdata, tmp) } err := SaveTaskInfo(unqiueid, 1, tasklist) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) //return err } } else { for _, val := range jsonconf.GetJsonConf().NewTaskConfig { if !tlist.IsInTaskList(val.Id) { var tmp TaskListDesc tmp.Taskstatus = 1 tmp.Taskid = val.Id tmp.Taskprogress = 0 tlist.Taskdata = append(tlist.Taskdata, tmp) } } for k, _ := range tlist.Taskdata { tlist.Taskdata[k].Taskprogress = 0 tlist.Taskdata[k].Taskstatus = 1 } err := SaveTaskInfo(unqiueid, 1, tlist) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) //return err } } return nil } func GetUserInfo(uuid int) *UserData { udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_INFO, strconv.Itoa(uuid)) if err != nil { logger.Info("GetOfflineData failed uuid=%v", uuid) return nil } udata := new(UserData) err = json.Unmarshal([]byte(udatastr), udata) if err != nil { logger.Info("GetOfflineData failed err=%v", err) return nil } return udata } func SaveUinfoToredis(udata *UserData, uuid int) { //保存金币到排行榜 /*var rinfo UserRankInfo rinfo.Gold = udata.Gold rinfo.Highestlv = udata.Highestlv rinfo.Head = udata.Head rinfo.NickName = udata.NickName rinfo.Uuid = uuid rinfostr, _ := json.Marshal(&rinfo)*/ redishandler.GetRedisClient().Zadd(redis.USER_GOLD_RANK, float64(udata.Gold), strconv.Itoa(uuid)) //保存玩家数据 //m_userInfo.Set(uint32(uuid), udata) userinfos, err := json.Marshal(udata) if err != nil { logger.Error("SaveUinfoToredis failed err=%v", err) } err = redishandler.GetRedisClient().HSet(redis.USER_INFO, strconv.Itoa(uuid), string(userinfos)) if err != nil { logger.Error("SaveUinfoToredis failed err=%v uuio=%v", err, uuid) } } func GetOfflineData(uuid int, resp *UserLoginResp) { udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_INFO, strconv.Itoa(uuid)) if err != nil { logger.Info("GetOfflineData failed err=%v", err) return } udata := new(UserData) err = json.Unmarshal([]byte(udatastr), udata) //udata.LastLoginTime = int(time.Now().Unix()) resp.Gold = udata.Gold resp.Highestlv = udata.Highestlv resp.Goldrate = udata.Goldrate resp.Loverate = udata.Loverate resp.Love = udata.Love resp.Curboxlv = udata.CurBoxLv resp.Isdoublegold = udata.IsDouble resp.Isauto = udata.IsAuto resp.Issignshow = udata.SignShow resp.Isnew = udata.IsNew for _, v := range udata.PosInfo { var tmp DataDesc tmp.Catlv = v.Catlv tmp.Pos = v.Pos resp.Data = append(resp.Data, tmp) } //此时需要计算一下离线的数据 CalcOfflineData(uuid, resp, udata) //存入map //m_userInfo.Set(uint32(uuid), udata) udata.HandlePassDay(uuid) SaveUinfoToredis(udata, uuid) } //计算离线数据 func CalcOfflineData(uuid int, resp *UserLoginResp, udata *UserData) { if len(resp.Data) != len(udata.PosInfo) { logger.Error("CalcOfflineData len not equal") return } //首先重新计算一下上一次计算时间 v, err := redishandler.GetRedisClient().HGet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid)) if err != nil { logger.Info("CalcOfflineData get USER_LAST_CALC_TIME failed=%v", err) return } lasttime, _ := strconv.Atoi(v) nowtime := time.Now().Unix() if nowtime-int64(lasttime) < 10 { //小于10秒不计算? return } resp.Gold = udata.Gold //计算一下金币 offsec := nowtime - int64(lasttime) if offsec > 300 { if offsec > 2*3600 { offsec = 2 * 3600 } //udata.Gold += offsec * udata.Goldrate //udata.Love += offsec * udata.Loverate /*if udata.IsDouble == 1 { udata.Gold *= 2 }*/ udata.OfflineGold = offsec * udata.Goldrate udata.OfflineLove = int64(float32(offsec) * udata.Loverate) resp.Offlinegold = udata.OfflineGold resp.Offlinelove = udata.OfflineLove } //如果时间超过一分钟需要计算离线空宝箱产出 if offsec > 1*60 { offboxnum := offsec / 10 for k, v := range udata.PosInfo { if v.Catlv == 0 && offboxnum > 0 { offboxnum-- //v.Catlv = -1 udata.PosInfo[k].Catlv = -1 resp.Data[k].Catlv = -1 if offboxnum == 0 { break } } } } //保存此次计算时间 nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid), nowtimestr) } func HandlerExchangePos(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp ExchangePosResp resp.Code = 0 var rdata ExchangePosReq err := json.Unmarshal([]byte(data), &rdata) if err != nil { logger.Info("json decode HandlerExchangePos data failed:%v", err, " for:%v", data) resp.Message = "json unmarshal failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) return } //vv := m_userInfo.Get(uint32(uuid)) for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } sumpos := len(uinfo.PosInfo) - 1 //检查位置索引的合法性 if rdata.Pos_1 < 0 || rdata.Pos_2 < 0 || rdata.Pos_1 > sumpos || rdata.Pos_2 > sumpos { resp.Code = 1 resp.Message = "pos index not legal" break } //下面判断是交换还是合成 if uinfo.PosInfo[rdata.Pos_1].Catlv == uinfo.PosInfo[rdata.Pos_2].Catlv && uinfo.PosInfo[rdata.Pos_1].Catlv != len(jsonconf.GetJsonConf().CatConfig) { //相同 则合成 //首先判断是否是顶级猫了 if uinfo.PosInfo[rdata.Pos_1].Catlv == len(jsonconf.GetJsonConf().CatConfig) { /*//todo 走红包猫的逻辑 rdctlv := MergeRedBagCat(uinfo, rdata.Pos_1) //DoAutoMergeRedCat(uinfo, uuid) //此处处理一下红包猫的自动合成逻辑 resp.Pos1_lv = rdctlv resp.Pos2_lv = 0*/ logger.Error("HandlerExchangePos failed") } else { // uinfo.PosInfo[rdata.Pos_1].Catlv = 0 uinfo.PosInfo[rdata.Pos_2].Catlv++ if uinfo.PosInfo[rdata.Pos_2].Catlv > uinfo.Highestlv { uinfo.Highestlv = uinfo.PosInfo[rdata.Pos_2].Catlv //得到新的猫 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCAT) //需要计算是否解锁新的猫购买 for { if uinfo.Highestlv-7 > len(uinfo.BuyCatInfo) { clv := uinfo.Highestlv - 7 initcatcfg := GetCatConfig(clv) if initcatcfg != nil { var info BuyCatInfoData info.Buytime = 0 info.CurPrice = initcatcfg.Price info.IsMaxBuytime = 0 uinfo.BuyCatInfo = append(uinfo.BuyCatInfo, info) logger.Info("ADD BuyCatInfo good higest=%v", uinfo.Highestlv) } else { logger.Error("HandlerExchangePos failed") } } else { break } } //需要解锁新的等级红包 uinfo.WaitFetchLv = append(uinfo.WaitFetchLv, uinfo.Highestlv) sort.Ints(uinfo.WaitFetchLv) } //重新计算速率 uinfo.Goldrate = CalcGoldRate(uinfo, uuid) uinfo.Loverate = CalcLoveRate(uinfo) newcatcfg := GetCatConfig(uinfo.PosInfo[rdata.Pos_2].Catlv) if newcatcfg == nil { resp.Code = 1 resp.Message = "get config failed" break } resp.Add_num = newcatcfg.CSNum //需要扩展位置 addnum := resp.Add_num - len(uinfo.PosInfo) for i := 0; i < addnum; i++ { var tmp PosData tmp.Pos = i + len(uinfo.PosInfo) tmp.Catlv = 0 uinfo.PosInfo = append(uinfo.PosInfo, tmp) //得到新的猫架子 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCATJIA) } resp.Highest_lv = uinfo.Highestlv resp.Pos1_lv = uinfo.PosInfo[rdata.Pos_1].Catlv resp.Pos2_lv = uinfo.PosInfo[rdata.Pos_2].Catlv uinfo.IsNew = 0 //此处记录合成次数 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_MERGE) } uinfo.Task.MergeCat++ } else { //不相同 交换即可 uinfo.PosInfo[rdata.Pos_1].Catlv, uinfo.PosInfo[rdata.Pos_2].Catlv = uinfo.PosInfo[rdata.Pos_2].Catlv, uinfo.PosInfo[rdata.Pos_1].Catlv } //保存玩家数据 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func (u *UserData) CalcMainCatNum() int { sumnum := 0 for _, v := range u.PosInfo { if v.Catlv > 0 { sumnum++ } } return sumnum } func (u *UserData) CleadPos(pos int) { if pos < 0 || pos >= len(u.PosInfo) { logger.Error("CleadPos failed pos=%v,posinfo=%v", pos, u.PosInfo) return } u.PosInfo[pos].Catlv = 0 u.PosInfo[pos].Pos = pos u.PosInfo[pos].Countdown = 0 } func HandlerRecovery(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp RecoveryResp resp.Code = 0 resp.Message = "success" var rdata RecoveryReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerRecovery data failed:%v", err, " for:%v", data) resp.Message = "服务器错误" resp.Code = 1 break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerRecovery getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "服务器错误" break } if rdata.Position < 0 || rdata.Position >= len(uinfo.PosInfo) { logger.Error("HandlerRecovery Position failed=%v", err) resp.Code = 1 resp.Message = "服务器错误" break } if uinfo.PosInfo[rdata.Position].Catlv > 100 || uinfo.PosInfo[rdata.Position].Catlv <= 0 { //高级猫或者没有猫无法卖 logger.Error("HandlerRecovery CatLV failed=%v", err) resp.Code = 1 resp.Message = "37级猫咪无法回收哦!" break } catnum := uinfo.CalcMainCatNum() logger.Info("HandlerRecovery catnum=%v", catnum) if catnum <= 1 { logger.Error("HandlerRecovery CatLV failed=%v", err) resp.Code = 1 resp.Message = "当前只有一只猫咪无法回收!" break } cfg := GetCatConfig(uinfo.PosInfo[rdata.Position].Catlv) if cfg == nil { logger.Error("HandlerRecovery CatLVCFG failed=%v", uinfo.PosInfo[rdata.Position].Catlv) resp.Code = 1 resp.Message = "服务器错误d" break } uinfo.CleadPos(rdata.Position) //重新计算速度 uinfo.Goldrate = CalcGoldRate(uinfo, uuid) //加金币 uinfo.Gold += cfg.Price / 10 SaveUinfoToredis(uinfo, uuid) resp.Data.Coin.UserId = uuid resp.Data.Coin.Coin = strconv.FormatInt(uinfo.Gold, 10) resp.Data.Coin.UpdateTime = int(time.Now().Unix()) resp.Data.Coin.IcomeRate = strconv.FormatInt(uinfo.Goldrate, 10) resp.Code = 0 break } //回包 logger.Info("HandlerRecovery resp=%v", resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetUserData(w http.ResponseWriter, data string, uuid int) { SetHeader(w) luserdatalock.Lock() defer luserdatalock.Unlock() var resp GetUserDataResp resp.Code = 0 var rdata GetUserDataReq err := json.Unmarshal([]byte(data), &rdata) if err != nil { logger.Info("json decode HandlerGetUserData data failed:%v", err, " for:%v", data) resp.Message = "json unmarshal failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) return } v, err := redishandler.GetRedisClient().HGet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid)) if err != nil { logger.Info("CalcOfflineData get USER_LAST_CALC_TIME failed=%v", err) resp.Message = "redishandler failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) return } lasttime, _ := strconv.Atoi(v) nowtime := time.Now().Unix() if nowtime-int64(lasttime) < 0 { logger.Error("HandlerGetUserData nowtime=%v lasttime=%v", nowtime, lasttime) resp.Message = "request time small than zero" resp.Code = 1 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) return } //计算一下金币 offsec := nowtime - int64(lasttime) if offsec > 2*3600 { offsec = 2 * 3600 } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetUserData failed") resp.Message = "request time small than zero" resp.Code = 1 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) return } if uinfo.EggTimeReset == 0 { //判断时间点 if time.Now().Hour() >= 12 { uinfo.EggTimeReset = 1 uinfo.EggTimeResetTime = int(time.Now().Unix()) uinfo.EggTime = NOFREETWIEST uinfo.FreeEggTime = FREETWIEST uinfo.FELcnt = 3 } if time.Now().Hour() >= 18 { uinfo.EggTimeReset = 99 uinfo.EggTimeResetTime = int(time.Now().Unix()) uinfo.EggTime = NOFREETWIEST uinfo.FreeEggTime = FREETWIEST uinfo.FELcnt = 3 } } if uinfo.EggTimeReset == 1 { if time.Now().Hour() >= 18 { uinfo.EggTimeReset = 99 uinfo.EggTimeResetTime = int(time.Now().Unix()) uinfo.EggTime = NOFREETWIEST uinfo.FreeEggTime = FREETWIEST uinfo.FELcnt = 3 } } addgold := offsec * uinfo.Goldrate addlove := float32(offsec) * uinfo.Loverate //uinfo.Gold += offsec * uinfo.Goldrate //uinfo.Love += offsec * uinfo.Loverate resp.Goldrate = uinfo.Goldrate resp.Loverate = uinfo.Loverate uinfo.Gold += addgold uinfo.Love += int64(addlove) resp.Gold = uinfo.Gold resp.Love = uinfo.Love if uinfo.IsDouble == 1 { uinfo.Gold += addgold uinfo.Love += int64(addlove) uinfo.Love += int64(addlove) resp.Gold = uinfo.Gold resp.Love = uinfo.Love resp.Goldrate = resp.Goldrate * 2 //如果是双倍需要判断是否已经过期 v, err := redishandler.GetRedisClient().HGet(redis.USER_STARTDOUBLE_TIME, strconv.Itoa(uuid)) if err == nil { startdoubletime, _ := strconv.Atoi(v) if nowtime-int64(startdoubletime) > 10*60 { uinfo.IsDouble = 0 //删除开启双倍时间 redishandler.GetRedisClient().HDel(redis.USER_STARTDOUBLE_TIME, strconv.Itoa(uuid)) resp.Dougoldlefttime = 0 } else { ss := int(nowtime - int64(startdoubletime)) resp.Dougoldlefttime = 600 - ss } } } if uinfo.IsAuto == 1 { //如果是双倍需要判断是否已经过期 v, err := redishandler.GetRedisClient().HGet(redis.USER_STARTAUTO_TIME, strconv.Itoa(uuid)) if err == nil { startdoubletime, _ := strconv.Atoi(v) if nowtime-int64(startdoubletime) > 10*60 { uinfo.IsAuto = 0 redishandler.GetRedisClient().HDel(redis.USER_STARTAUTO_TIME, strconv.Itoa(uuid)) resp.Automlefttime = 0 } else { ss := int(nowtime) - startdoubletime resp.Automlefttime = 600 - ss if rdata.Isauto == 1 { //处理自动合成 logger.Info("testautomerge") DoAutoMerge(uinfo, uuid) DoAutoMergeRedCat(uinfo, uuid) } else { logger.Info("HandlerGetUserData not merge") } } } } if uinfo.IsBoxAcc == 1 { v, err := redishandler.GetRedisClient().HGet(redis.USER_STARTACC_BOX_TIME, strconv.Itoa(uuid)) if err == nil { startdoubletime, _ := strconv.Atoi(v) if nowtime-int64(startdoubletime) > 2*60 { uinfo.IsBoxAcc = 0 redishandler.GetRedisClient().HDel(redis.USER_STARTACC_BOX_TIME, strconv.Itoa(uuid)) resp.Acclcteboxlefttime = 0 } else { timesss := int(nowtime) - startdoubletime //logger.Info("testsssssssssssssssssssssssssssssssssss t=%v", timesss) resp.Acclcteboxlefttime = 120 - timesss } } } //处理空投猫粮事件 HandleRandGift(uinfo, &resp) for _, v := range uinfo.PosInfo { var tmp DataDesc tmp.Catlv = v.Catlv tmp.Pos = v.Pos resp.Data = append(resp.Data, tmp) } //resp.Isdoublegold = uinfo.IsDouble //resp.Isauto = uinfo.IsAuto //保存 SaveUinfoToredis(uinfo, uuid) resp.Redbagnum = uinfo.StoreRandRedBag resp.Leftredbagnum = uinfo.RandRedBagLeftTime resp.Shakeleftcnt = uinfo.ShakeTime //保存此次计算时间 nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_LAST_CALC_TIME, strconv.Itoa(uuid), nowtimestr) //logger.Info("HandlerGetUserData save USER_LAST_CALC_TIME resp=%+v", resp) //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUploadusercost(w http.ResponseWriter, data string, uuid int) { SetHeader(w) usercostlock.Lock() defer usercostlock.Unlock() var resp UploadusercostResp resp.Code = 0 resp.Message = "success" var rdata UploadusercostReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerUploadusercost json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerUploadusercost getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if rdata.Rtype == 1 { //摇一摇次数 uinfo.ShakeTime -= rdata.Value if uinfo.ShakeTime < 0 { uinfo.ShakeTime = 0 } resp.Data.Lefttime = uinfo.ShakeTime } else { resp.Code = 1 resp.Message = "类型不正确!" break } resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandleRandGift(data *UserData, resp *GetUserDataResp) { nowday := time.Now().Day() nowtime := int(time.Now().Unix()) if nowday != data.RandGiftDay { //跨天了 data.RandGiftDay = nowday data.RandGiftNum = 5 data.RandGiftTime = nowtime resp.Israndgift = 1 } else { if nowtime-data.RandGiftTime > 180 && data.RandGiftNum > 0 { //data.RandGiftNum-- data.RandGiftTime = nowtime resp.Israndgift = 1 } else { resp.Israndgift = 0 } } } func HandlerLogin(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp UserLoginResp resp.Code = 0 var rdata UserLoginData err := json.Unmarshal([]byte(data), &rdata) if err != nil { logger.Info("json decode HandlerLogin data failed:%v,for:%v", err, data) resp.Message = "json unmarshal failed" resp.Code = 1 respstr, _ := json.Marshal(&resp) logger.Info("###HandlerLogin###rdata:%v", string(respstr)) fmt.Fprint(w, string(respstr)) return } //首先判断一下是否是首次登陆 isexist, _ := redishandler.GetRedisClient().HExists(redis.USER_INFO, strconv.Itoa(uuid)) if !isexist { //不存在 //属于新登录的玩家数据 InitUserInfo(&rdata, &resp, uuid) } else { //已经登陆过了 需要获取玩家数据 GetOfflineData(uuid, &resp) } //保存最新的登陆时间 nowtime := time.Now().Unix() nowtimestr := strconv.FormatInt(nowtime, 10) err = redishandler.GetRedisClient().HSet(redis.USER_LAST_LOGIN_TIME, strconv.Itoa(uuid), nowtimestr) if err != nil { logger.Info("redis set redis.USER_LAST_LOGIN_TIME failed") resp.Code = 1 } //判断一下邀请关系是否存在 不存在需要保存 isexist, _ = redishandler.GetRedisClient().HExists(redis.USER_INVITE_ID, strconv.Itoa(uuid)) if !isexist { //不存在 redishandler.GetRedisClient().HSet(redis.USER_INVITE_ID, strconv.Itoa(uuid), strconv.Itoa(rdata.Fromid)) } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) logger.Info("###HandlerLogin###rdata:%v", string(respstr)) } func HandlerClickRandGift(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp ClickRandGiftResp resp.Code = 0 var rdata ClickRandGiftReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerClickRandGift json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.RandGiftNum <= 0 { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo.RandGiftNum-- goldnum := 15 * 60 * uinfo.Goldrate uinfo.Gold += goldnum resp.Gold = goldnum resp.Lefttime = uinfo.RandGiftNum uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAutoMerge(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AutomergeResp resp.Code = 0 var rdata AutomergeReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerAutoMerge json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.IsAuto == 1 { //已经是加速状态 logger.Error("HandlerAutoMerge alreadyauto failed=%v", err) resp.Code = 1 resp.Message = "alreadyauto" break } uinfo.IsAuto = 1 //记录时间 nowtime := time.Now().Unix() nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_STARTAUTO_TIME, strconv.Itoa(uuid), nowtimestr) uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAcclecteBoxRate(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AcclecteBoxResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.IsBoxAcc == 1 { //已经是加速状态 logger.Error("HandlerAcclecteBoxRate alreadyacclete failed") resp.Code = 1 resp.Message = "alreadyacclete" break } uinfo.IsBoxAcc = 1 //记录时间 nowtime := time.Now().Unix() nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_STARTACC_BOX_TIME, strconv.Itoa(uuid), nowtimestr) uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAcclecteGold(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AcclecteResp resp.Code = 0 var rdata AcclecteReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerAcclecteGold json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.IsDouble == 1 { //已经是加速状态 logger.Error("HandlerAcclecteGold alreadyacclete failed=%v", err) resp.Code = 1 resp.Message = "alreadyacclete" break } uinfo.IsDouble = 1 //记录时间 nowtime := time.Now().Unix() nowtimestr := strconv.FormatInt(nowtime, 10) redishandler.GetRedisClient().HSet(redis.USER_STARTDOUBLE_TIME, strconv.Itoa(uuid), nowtimestr) uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGenerateBox(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GenerateBoxResp resp.Code = 0 var rdata GenerateBoxReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGenerateBox json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if rdata.Pos < 0 || rdata.Pos >= len(uinfo.PosInfo) { logger.Error("HandlerClickCatBox pos not legal failed=%v", err) resp.Code = 1 resp.Message = "pos not legal" break } if uinfo.PosInfo[rdata.Pos].Catlv != 0 { //不合法 logger.Error("HandlerClickCatBox pos not empty failed=%v", err) resp.Code = 102 //位置已满 resp.Message = "pos not empty" break } uinfo.PosInfo[rdata.Pos].Catlv = -1 //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUpgradeCatBox(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp UpgradeBoxResp resp.Code = 0 var rdata UpgradeBoxReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerUpgradeCatBox json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //先判断一下当前猫箱子是否可以升级 catcfg := GetCatConfig(uinfo.Highestlv) if catcfg == nil || uinfo.CurBoxLv >= catcfg.Recbuy { //超过最大限制无法升级 logger.Error("HandlerClickCatBox maxcatlv failed=%v", err) resp.Code = 1 resp.Message = "maxcatlv" break } //判断一下金钱是否足够 /*cattocfg := GetCatConfig(uinfo.CurBoxLv + 1) if cattocfg == nil || uinfo.Gold <= cattocfg.Price { logger.Error("HandlerClickCatBox moneynotenough failed=%v", err) resp.Code = 1 resp.Message = "moneynotenough" break } //升级 扣钱 uinfo.CurBoxLv++ uinfo.Gold = uinfo.Gold - cattocfg.Price*/ uinfo.CurBoxLv++ resp.Boxlv = uinfo.CurBoxLv //保存 SaveUinfoToredis(uinfo, uuid) logger.Info("HandlerUpgradeCatBox uinfo=%+v", uinfo) resp.Code = 0 break } //回包 logger.Info("HandlerUpgradeCatBox resp=%+v", resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryBuyCat(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryBuyCatResp resp.Code = 0 var rdata QueryBuyCatReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerQueryBuyCat json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } maxlv := uinfo.Highestlv - 7 if maxlv < 1 { //最小1j maxlv = 1 } resp.Maxcatlv = maxlv for k, v := range uinfo.BuyCatInfo { var tmp BuyCatDesc tmp.Lv = k tmp.Goldnum = v.CurPrice resp.Data = append(resp.Data, tmp) } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerDoBuyCat(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp DoBuyCatResp resp.Code = 0 var rdata DoBuyCatReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerDoBuyCat json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //当前可购买的最大等级 maxlv := uinfo.Highestlv - 7 if maxlv < 1 { //最小1j maxlv = 1 } if rdata.Lv > maxlv || rdata.Lv < 1 || rdata.Lv > len(uinfo.BuyCatInfo) { logger.Error("HandlerDoBuyCat buy lv failed=%v", err) resp.Code = 1 resp.Message = "buy lv invalid" break } curprice := uinfo.BuyCatInfo[rdata.Lv-1].CurPrice if uinfo.Gold < curprice { logger.Error("HandlerDoBuyCat gold not enough failed=%v", err) resp.Code = 101 //金币不足 resp.Message = "gold not enough" break } //获取配置 catcfg := GetCatConfig(rdata.Lv) if catcfg == nil { logger.Error("HandlerDoBuyCat get cat cfg failed=%v,lv=%v", err, rdata.Lv) resp.Code = 1 resp.Message = "get cat cfg failed" break } //需要找到一个位置 catpos := getCatPutPos(uinfo, rdata.Lv) if catpos < 0 { logger.Error("HandlerDoBuyCat not enough place failed=%v", err) resp.Code = 102 //位置已满 resp.Message = "not enough place" break } //扣钱 uinfo.Gold -= curprice //重新计算价格 if uinfo.BuyCatInfo[rdata.Lv-1].IsMaxBuytime == 0 { uinfo.BuyCatInfo[rdata.Lv-1].CurPrice = int64(float64(uinfo.BuyCatInfo[rdata.Lv-1].CurPrice) * float64(catcfg.Ratio)) uinfo.BuyCatInfo[rdata.Lv-1].Buytime++ if uinfo.BuyCatInfo[rdata.Lv-1].Buytime >= catcfg.Ilimit { uinfo.BuyCatInfo[rdata.Lv-1].IsMaxBuytime = 1 } } resp.Nextprice = uinfo.BuyCatInfo[rdata.Lv-1].CurPrice if uinfo.IsAuto == 1 { //DoAutoMerge(uinfo, uuid) } //记录成就数据 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_BUYCAT) resp.Pos = catpos resp.Code = 0 uinfo.Goldrate = CalcGoldRate(uinfo, uuid) //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryAutomergeInfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryAutomergeResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } for k, v := range uinfo.PosInfo { var tmp DataDesc tmp.Pos = k tmp.Catlv = v.Catlv resp.Data = append(resp.Data, tmp) } newcatcfg := GetCatConfig(uinfo.Highestlv) if newcatcfg == nil { logger.Error("DoAutoMerge getcatcfg failed,lv=%v ", uinfo.Highestlv) resp.Code = 1 resp.Message = "get cat cfg" break } resp.Curcatjianum = newcatcfg.CSNum //需要扩展位置 addnum := resp.Curcatjianum - len(uinfo.PosInfo) for i := 0; i < addnum; i++ { var tmp PosData tmp.Pos = i + len(uinfo.PosInfo) tmp.Catlv = 0 uinfo.PosInfo = append(uinfo.PosInfo, tmp) //得到新的猫架子 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCATJIA) } resp.Goldrate = uinfo.Goldrate resp.Higestlv = uinfo.Highestlv resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryWareHouse(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryWareHouseResp resp.Code = 0 for { udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid)) if err != nil { logger.Info("HandlerTakeCatoutfromWareHouse failed err=%v", err) resp.Code = 1 resp.Message = "get redis failed" break } udata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), udata) if err != nil { logger.Error("HandlerTakeCatoutfromWareHouse Unmarshal redis failed ") resp.Code = 1 resp.Message = "Unmarshal redis failed" break } for k, v := range udata.Info { var tmp DataDesc tmp.Pos = k tmp.Catlv = v.Warelv resp.Data = append(resp.Data, tmp) } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerTakeCatoutfromWareHouse(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp TakeWareHouseResp resp.Code = 0 var rdata TakeWareHouseReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerTakeCatoutfromWareHouse json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid)) if err != nil { logger.Info("HandlerTakeCatoutfromWareHouse failed err=%v", err) resp.Code = 1 resp.Message = "get redis failed" break } udata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), udata) if err != nil { logger.Error("HandlerTakeCatoutfromWareHouse Unmarshal redis failed ") resp.Code = 1 resp.Message = "Unmarshal redis failed" break } vv := m_userInfo.Get(uint32(uuid)) if vv == nil { logger.Error("HandlerTakeCatoutfromWareHouse getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo, _ := vv.(*UserData) if rdata.Warepos < 0 || rdata.Warepos >= 15 { logger.Error("HandlerTakeCatoutfromWareHouse wpos failed=%v", err) resp.Code = 1 resp.Message = "wpos" break } pos := getCatPutPos(uinfo, udata.Info[rdata.Warepos].Warelv+100) if pos == -1 { logger.Error("HandlerTakeCatoutfromWareHouse not enough place failed=%v", err) resp.Code = 1 resp.Message = "not enough place" break } udata.Info[rdata.Warepos].Warelv = 0 wares, _ := json.Marshal(udata) redishandler.GetRedisClient().HSet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid), string(wares)) //需要判断是否自动合成红包猫 //DoAutoMergeRedCat(uinfo, uuid) resp.Pos = pos resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerPutCattoWareHouse(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp PutWareHouseResp resp.Code = 0 var rdata PutWareHouseReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerPutCattoWareHouse json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(uuid)) if err != nil { logger.Info("HandlerPutCattoWareHouse failed err=%v", err) resp.Code = 1 resp.Message = "get redis failed" break } udata := new(UserWareHouseData) err = json.Unmarshal([]byte(udatastr), udata) if err != nil { logger.Error("HandlerPutCattoWareHouse Unmarshal redis failed ") resp.Code = 1 resp.Message = "Unmarshal redis failed" break } vv := m_userInfo.Get(uint32(uuid)) if vv == nil { logger.Error("HandlerPutCattoWareHouse getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo, _ := vv.(*UserData) if rdata.Pos < 0 || rdata.Pos >= len(uinfo.PosInfo) { logger.Error("HandlerPutCattoWareHouse posnotvalid failed=%v", err) resp.Code = 1 resp.Message = "posnotvalid" break } //合成界面红包猫的等级采用id+100的形式 rtval := tryPutToWareHouse(udata, uinfo.PosInfo[rdata.Pos].Catlv-100, uuid) if rtval == -1 { logger.Error("HandlerPutCattoWareHouse warehouse full failed=%v", err) resp.Code = 1 resp.Message = "warehouse full" break } uinfo.PosInfo[rdata.Pos].Catlv = 0 resp.Code = 0 resp.Warepos = rtval //保存 SaveUinfoToredis(uinfo, uuid) break } respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerClickCatBox(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp ClickBoxResp resp.Code = 0 var rdata ClickBoxReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerClickCatBox json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if rdata.Pos < 0 || rdata.Pos >= len(uinfo.PosInfo) { logger.Error("HandlerClickCatBox pos not legal failed=%v", err) resp.Code = 1 resp.Message = "pos not legal" break } if uinfo.PosInfo[rdata.Pos].Catlv != -1 { //不合法 logger.Error("HandlerClickCatBox not box failed=%v", err) resp.Code = 103 resp.Message = "not box" break } uinfo.PosInfo[rdata.Pos].Catlv = uinfo.CurBoxLv resp.Pos = rdata.Pos resp.Lv = uinfo.PosInfo[rdata.Pos].Catlv if uinfo.IsAuto == 1 { //DoAutoMerge(uinfo, uuid) //放到getuserdata处理 } uinfo.Goldrate = CalcGoldRate(uinfo, uuid) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUpCattoRoom(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp BuyCatRoomResp resp.Code = 0 var rdata UpCattoRoomReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerUpCattoRoom json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } /*if rdata.Roompos < 0 || rdata.Roompos > len(uinfo.CatRoomInfo)-1 { logger.Error("HandlerUpCattoRoom Roompos err") resp.Code = 1 resp.Message = "Roompos er" break }*/ //判断猫等级是否达到 if rdata.Callv < 0 || rdata.Callv > uinfo.Highestlv { logger.Error("HandlerUpCattoRoom youhavenotthiscat failed") resp.Code = 1 resp.Message = "youhavenotthiscat" break } //判断猫等级是否可以在这个位置上阵 ctroomcfg := GetCatRoomCfg(rdata.Roompos + 1) if ctroomcfg == nil { logger.Error("HandlerUpCattoRoom getctroomcfg failed=%v", err) resp.Code = 1 resp.Message = "getctroomcfg" break } /*if strings.Index(ctroomcfg.Catup, strconv.Itoa(rdata.Callv)) == -1 { logger.Error("HandlerUpCattoRoom catcannotup lv=%v,pos=", rdata.Callv, rdata.Roompos) resp.Code = 1 resp.Message = "catcannotup" break }*/ if rdata.Optype == 1 { //上阵 //uinfo.CatRoomInfo[rdata.Roompos].LvCatlv = rdata.Callv for i := 0; i < len(uinfo.CatRoomInfo); i++ { if uinfo.CatRoomInfo[i].BuildId == rdata.Roompos { uinfo.CatRoomInfo[i].LvCatlv = rdata.Callv break } } } else { //下阵 if uinfo.CatRoomInfo[rdata.Roompos].LvCatlv != 0 { uinfo.CatRoomInfo[rdata.Roompos].LvCatlv = 0 } } //需要重新计算爱心速率 uinfo.Loverate = CalcLoveRate(uinfo) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerBuyCatRoom(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp BuyCatRoomResp resp.Code = 0 var rdata BuyCatRoomReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerBuyCatRoom json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //判断购买的等级对不对 /*if rdata.Lv != len(uinfo.CatRoomInfo)+1 { logger.Error("HandlerBuyCatRoom lvnotgood failed=%v", err) resp.Code = 1 resp.Message = "lvnotgood" break }*/ ctroomcfg := GetCatRoomCfg(rdata.Lv) if ctroomcfg == nil { logger.Error("HandlerBuyCatRoom getctroomcfg failed=%v", err) resp.Code = 1 resp.Message = "getctroomcfg" break } if uinfo.Love < ctroomcfg.Love { logger.Error("HandlerBuyCatRoom lovenotenough failed=%v", err) resp.Code = 1 resp.Message = "lovenotenough" break } //判断是否重复 isin := false for i := 0; i < len(uinfo.CatRoomInfo); i++ { if uinfo.CatRoomInfo[i].BuildId == rdata.Lv { isin = true break } } if isin { logger.Error("HandlerBuyCatRoom lovenotenough failed=%v", err) resp.Code = 1 resp.Message = "解锁的家具不合法" break } //扣爱心值 uinfo.Love -= ctroomcfg.Love var tmp CatRoomData tmp.LvCatlv = 0 tmp.BuildId = rdata.Lv logger.Info("buycatroomddt! len=%d", len(uinfo.CatRoomInfo)) uinfo.CatRoomInfo = append(uinfo.CatRoomInfo, tmp) //得到新的家具 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETCATROOMJIA) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryCatRoomInfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryCatRoomInfoResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } for _, v := range uinfo.CatRoomInfo { var tmp CatRoomDesc tmp.Catlv = v.LvCatlv tmp.Pos = v.BuildId resp.Data = append(resp.Data, tmp) } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryCatShopInfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryCatShopInfoResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } resp.Chapter = uinfo.CatShopInfo.Chapter resp.Section = uinfo.CatShopInfo.Section resp.Lefttime = uinfo.CatShopInfo.LeftTime resp.Canwatch = uinfo.CatShopInfo.ThisIsWatch if uinfo.CatShopInfo.IsPlaying == 1 { if uinfo.CatShopInfo.LeftTime > 0 { resp.Storyhappen = 3 } else { //判断是否触发故事 scfg := GetCatShopConfig(uinfo.CatShopInfo.Chapter) if scfg == nil { logger.Error("HandlerQueryCatShopInfo GetCatShopConfig failed id=%v ", uinfo.CatShopInfo.Chapter) resp.Code = 1 resp.Message = "GetCatShopConfig" break } sthp := strings.Split(scfg.Storyhanppen, ",") if uinfo.CatShopInfo.Section < 0 || uinfo.CatShopInfo.Section >= len(sthp) { logger.Error("HandlerQueryCatShopInfo sthpfailed failedsthjp=%v ", sthp) resp.Code = 1 resp.Message = "sthpfailed" break } needtimes, _ := strconv.Atoi(sthp[uinfo.CatShopInfo.Section-1]) if uinfo.CatShopInfo.PlayTimes >= needtimes { resp.Storyhappen = 1 uinfo.CatShopInfo.IsStoryHappen = 1 //触发新的故事 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GETSTORY) } else { resp.Storyhappen = 0 } } } else { resp.Storyhappen = 2 } SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerCatShoPlay(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp CatShoPlayResp resp.Code = 0 var rdata CatShoPlayReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerCatShoPlay json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //检查当前是否可以玩 if uinfo.CatShopInfo.IsPlaying == 1 { //当前处于正在进行中,不能陪玩 logger.Error("HandlerCatShoPlay alreadyplaying ") resp.Code = 1 resp.Message = "alreadyplaying" break } if uinfo.CatShopInfo.IsMax == 1 { logger.Error("HandlerCatShoPlay ismax ") resp.Code = 1 resp.Message = "ismax" break } scfg := GetCatShopConfig(uinfo.CatShopInfo.Chapter) if scfg == nil { logger.Error("HandlerCatShoPlay GetCatShopConfig failed id=%v ", uinfo.CatShopInfo.Chapter) resp.Code = 1 resp.Message = "GetCatShopConfigfailed" break } //判断一下当前猫是否上阵 isup := IsCatUpToRoom(uinfo, rdata.Catlv) if !isup { logger.Error("HandlerCatShoPlay catisnotup failed ") resp.Code = 1 resp.Message = "catisnotup" break } uinfo.CatShopInfo.IsPlaying = 1 uinfo.CatShopInfo.PlayTimes++ uinfo.CatShopInfo.LeftTime = scfg.Time * 60 uinfo.CatShopInfo.ThisIsWatch = 0 uinfo.CatShopInfo.CurCatLv = rdata.Catlv uinfo.CatShopInfo.IsStoryHappen = 0 resp.Lefttime = uinfo.CatShopInfo.LeftTime if uinfo.CatShopInfo.TotalWatchNumLeft > 0 { resp.Canwatch = 1 } else { resp.Canwatch = 0 } //记录陪玩 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_PLAYWITHCAT) //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetCatShopReward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetCatShopRewardResp resp.Code = 0 var rdata GetCatShopRewardReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetCatShopReward json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.CatShopInfo.IsPlaying != 0 || uinfo.CatShopInfo.LeftTime > 0 { //不能领取 logger.Error("HandlerGetCatShopReward cannotfetch ") resp.Code = 1 resp.Message = "cannotfetch" break } catcfg := GetCatConfig(uinfo.CatShopInfo.CurCatLv) shopcfg := GetCatShopConfig(uinfo.CatShopInfo.Chapter) if catcfg == nil || shopcfg == nil { logger.Error("HandlerGetCatShopReward getcatcfgfailed catlv=%v,shopcfg=%v ", uinfo.CatShopInfo.CurCatLv, uinfo.CatShopInfo.Chapter) resp.Code = 1 resp.Message = "getcatcfgfailed" break } resp.Love = int64((float32(shopcfg.Love) * (float32(100) + catcfg.Loveadd) / float32(100))) if rdata.Optype == 2 { resp.Love = resp.Love * 2 //双倍 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) } uinfo.Love += resp.Love //领完奖处理数据 uinfo.CatShopInfo.PlayTimes++ uinfo.CatShopInfo.Section++ uinfo.CatShopInfo.CurCatLv = 0 uinfo.CatShopInfo.LeftTime = 0 uinfo.CatShopInfo.IsPlaying = 0 uinfo.CatShopInfo.ThisIsWatch = 0 uinfo.CatShopInfo.IsStoryHappen = 0 //判断一下是否进入下一章节 if uinfo.CatShopInfo.Section > shopcfg.Story { //判断一下是否最大章节了 nextshopcfg := GetCatShopConfig(uinfo.CatShopInfo.Chapter + 1) if nextshopcfg == nil { uinfo.CatShopInfo.Section-- uinfo.CatShopInfo.IsMax = 1 } else { uinfo.CatShopInfo.Chapter++ uinfo.CatShopInfo.Section = 1 uinfo.CatShopInfo.PlayTimes = 0 //触发新的店铺 uinfo.DoucmentTaskAndAch(1, ACH_TYPE_GBESHOP) } } //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAcclecteCatStory(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AcclecteCatStoryResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } if uinfo.CatShopInfo.ThisIsWatch == 1 { logger.Error("HandlerAcclecteCatStory alreadywatch ") resp.Code = 1 resp.Message = "alreadywatch" break } if uinfo.CatShopInfo.TotalWatchNumLeft <= 0 { logger.Error("HandlerAcclecteCatStory notenoughwatchtimes ") resp.Code = 1 resp.Message = "notenoughwatchtimes" break } uinfo.CatShopInfo.ThisIsWatch = 1 uinfo.CatShopInfo.TotalWatchNumLeft-- if uinfo.CatShopInfo.LeftTime > 3600 { uinfo.CatShopInfo.LeftTime -= 3600 } else { uinfo.CatShopInfo.LeftTime = 0 } //记录猫咖缩短 uinfo.DoucmentTaskAndAch(1, TASK_TYPE_WATCHADD) SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUpdateUserInfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp UpdateUserInfoResp resp.Code = 0 var rdata UpdateUserInfoReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerUpdateUserInfo json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo.NickName = rdata.Nickname uinfo.Head = rdata.Headurl uinfo.RealName = rdata.Realname //保存 logger.Info("HandlerUpdateUserInfo uindo=%+v", uinfo) SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryPlayerRank(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryPlayerRankResp resp.Code = 0 for { selfrank := 101 //取100名 vv, err := redishandler.GetRedisClient().ZRevRangewithIndex(redis.USER_GOLD_RANK, 0, 99) if err == nil { rank := 0 for _, v := range vv { rank++ // rinfobyte, _ := v.([]byte) logger.Info("HandlerQueryPlayerRank ,v=%v", string(rinfobyte)) oneuid, _ := strconv.Atoi(string(rinfobyte)) var tmp RankInfoDesc //err := json.Unmarshal(rinfobyte, &rinfobyte) //logger.Info("TestMyredis k=%v,v=%v", oneuid, oneuid) uinfo := GetUserInfo(oneuid) if uinfo != nil { tmp.Rank = rank tmp.Nickname = uinfo.NickName tmp.Catlv = uinfo.Highestlv tmp.Goldnum = uinfo.Gold tmp.Headurl = uinfo.Head tmp.Uuid = oneuid resp.Data = append(resp.Data, tmp) } if oneuid == uuid { selfrank = rank } } } else { logger.Error("HandlerUpdateUserInfo redisfailed ") resp.Code = 1 resp.Message = "redisfailed" break } //查询自己的信息 selfinfo := GetUserInfo(uuid) if selfinfo != nil { resp.Selfdata.Catlv = selfinfo.Highestlv resp.Selfdata.Goldnum = selfinfo.Gold resp.Selfdata.Nickname = selfinfo.NickName resp.Selfdata.Headurl = selfinfo.Head resp.Selfdata.Rank = selfrank resp.Selfdata.Uuid = uuid } else { logger.Error("HandlerQueryPlayerRank failed") } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryCompleteTask(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryCompleteTaskResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } //Maplock.RLock() //首先计算一下 当前的在线时间任务是否完成 nowtime := time.Now().Unix() for k, v := range uinfo.Taskinfo.StartOnline { thiscfg := GetTaskConfig(k) if thiscfg != nil { if nowtime >= int64(thiscfg.Parameter)*60+v { //此任务已经完成 uinfo.Taskinfo.CompleteId[k] = 1 delete(uinfo.Taskinfo.StartOnline, k) } else { //还没计时结束,则需要通知剩余倒计时 var dtmp QueryOnlienTaskDesc dtmp.Taskid = k dtmp.Lefttime = nowtime - v resp.Online = append(resp.Online, dtmp) } } } for k, _ := range uinfo.Taskinfo.CompleteId { var tmp QueryCompleteTaskDesc tmp.Taskid = k resp.Data = append(resp.Data, tmp) } //Maplock.RUnlock() resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryCompleteAchievement(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryCompleteAchievementResp resp.Code = 0 for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } //Maplock.RLock() for k, _ := range uinfo.AchieveMent.CompleteId { var tmp QueryCompleteAchievementDesc tmp.Achieveid = k resp.Data = append(resp.Data, tmp) } //Maplock.RUnlock() resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetTaskReward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetTaskRewardResp resp.Code = 0 var rdata GetTaskRewardReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetTaskReward json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //Maplock.RLock() //需要判断下是否完成了该任务 _, ok := uinfo.Taskinfo.CompleteId[rdata.Taskid] if !ok { logger.Error("HandlerGetTaskReward tasknot finished! ") resp.Code = 1 resp.Message = "tasknot finished!" //Maplock.RUnlock() break } uinfo.Taskinfo.HaveComplete[rdata.Taskid] = 1 delete(uinfo.Taskinfo.CompleteId, rdata.Taskid) //加钱 taskcfg := GetTaskConfig(rdata.Taskid) if taskcfg != nil { uinfo.Gold += taskcfg.Reward } //Maplock.RUnlock() //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetAchieveReward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetAchieveRewardResp resp.Code = 0 var rdata GetAchieveRewardReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetAchieveReward json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } Maplock.RLock() //需要判断下是否完成了该任务 _, ok := uinfo.Taskinfo.CompleteId[rdata.Achieveid] if !ok { logger.Error("HandlerGetAchieveReward tasknot finished! ") resp.Code = 1 resp.Message = "tasknot finished!" Maplock.RUnlock() break } uinfo.AchieveMent.HaveComplete[rdata.Achieveid] = 1 delete(uinfo.AchieveMent.CompleteId, rdata.Achieveid) //加钱 acfg := GetAchieveConfig(rdata.Achieveid) if acfg != nil { uinfo.Gold += acfg.Reward } Maplock.RUnlock() //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerStartOnlineTask(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp StartOnlineTaskResp resp.Code = 0 var rdata StartOnlineTaskReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerStartOnlineTask json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //Maplock.RLock() //需要判断下是否已经开始计时,或者已经完成过,或者已经完成但是还未领取 _, ok1 := uinfo.Taskinfo.StartOnline[rdata.Taskid] _, ok2 := uinfo.Taskinfo.HaveComplete[rdata.Taskid] _, ok3 := uinfo.Taskinfo.CompleteId[rdata.Taskid] if ok1 || ok2 || ok3 { logger.Error("HandlerGetTaskReward taskid invalid! ok1=%v,ok2+%v,ok3=%v", ok1, ok2, ok3) resp.Code = 1 resp.Message = "taskid invalid!" //Maplock.RUnlock() break } uinfo.Taskinfo.StartOnline[rdata.Taskid] = time.Now().Unix() //Maplock.RUnlock() //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetrandredbag(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetrandredbagResp resp.Code = 0 resp.Message = "success" var rdata GetrandredbagReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetrandredbag json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetrandredbag getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } //直接领取 if rdata.Optype == 1 { //直接领取 if uinfo.RandRedBagLeftTime < 1 { //已经没有领取次数了 logger.Error("HandlerGetrandredbag storenum not enough failed=%v", err) resp.Code = 1 resp.Message = "storenum not enougd" break } addnum := uinfo.CalcRandRedBagNum() uinfo.AddRedPackect(addnum, 100, rdata.Channel, rdata.Gameid, uuid) //addgold := int(addnum * 10000) resp.Data.Getnum = addnum uinfo.SumRandRedBagTimes++ uinfo.RandRedBagLeftTime-- uinfo.StoreRandRedBag = 0 } else if rdata.Optype == 2 { //存储 if uinfo.StoreRandRedBag >= 1 { //不能存更多 logger.Error("HandlerGetrandredbag storenum failed=%v", err) resp.Code = 1 resp.Message = "没有可领取的红包" break } uinfo.StoreRandRedBag = 1 resp.Data.Getnum = 0 } else { //领取存储的红包 if uinfo.StoreRandRedBag < 1 || uinfo.RandRedBagLeftTime < 1 { //没有可以领取的 logger.Error("HandlerGetrandredbag storenum not enough failed=%v", err) resp.Code = 101 resp.Message = "当日领取红包次数已达上限" break } //加红包 //计算一下零取值 addnum := uinfo.CalcRandRedBagNum() uinfo.AddRedPackect(addnum, 100, rdata.Channel, rdata.Gameid, uuid) //addgold := int(addnum * 10000) resp.Data.Getnum = addnum uinfo.StoreRandRedBag = 0 uinfo.SumRandRedBagTimes++ uinfo.RandRedBagLeftTime-- } SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func (uinfo *UserData) GetWithDrawData(money float32) (int, *WithDrawDesc) { //处理提现状态 for k, val := range uinfo.WithDraw.Cashdata { if val.Cnum == money { return k, &val } } return -1, nil } func HandlerGetcashrecord(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetcashrecordResp resp.Code = 0 resp.Message = "success" var rdata CommReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetcashrecord json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetcashrecord getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } list, err := GetCashList(uuid, rdata.Gameid, rdata.Channel, 0, 100) if err != nil { logger.Error("HandlerGetcashrecord failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if list != nil { resp.Data.Withdata = append(resp.Data.Withdata, *list...) } break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetcash(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetcashResp resp.Code = 0 resp.Message = "success" var rdata GetcashReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetcash json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetcash getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } index, info := uinfo.GetWithDrawData(rdata.Money) if index == -1 || info == nil { logger.Error("HandlerGetcash GetWithDrawData failed=%v", err) resp.Code = 1 resp.Message = "get GetWithDrawData failed" break } if info.Cnum == 30 { //30的是连续登陆天数 if uinfo.Highestlv < info.Limitlv || uinfo.ContinueLoginDay < info.LoginDayLimit { logger.Error("HandlerGetcash notfit failed=%v", err) resp.Code = 1 resp.Message = "提现条件不满足" break } } else { //_, highlv := uinfo.CalcHigestCatName() if uinfo.Highestlv < info.Limitlv || uinfo.SumLoginDay < info.LoginDayLimit { logger.Error("HandlerGetcash notfit failed=%v", err) resp.Code = 1 resp.Message = "提现条件不满足" break } } if info.Isnew == 0 { logger.Error("HandlerGetcash notfit failed=%v", err) resp.Code = 1 resp.Message = "新人专享只能提取一次" break } if info.Preisfind == 0 { if rdata.Money == 100 { logger.Error("HandlerGetcash notfit failed=%v", err) resp.Code = 1 resp.Message = "请先完成30元提现" break } else { logger.Error("HandlerGetcash notfit failed=%v", err) resp.Code = 1 resp.Message = "请先完成前一档提现" break } } //判断一下前置条件的下一档 if index == len(uinfo.WithDraw.Cashdata)-1 { //最后一档了不用处理 } else { if index < len(uinfo.WithDraw.Cashdata)-1 { uinfo.WithDraw.Cashdata[index+1].Preisfind = 1 } } checkcoin := 2 //不开启自动审核 drawnum := int(rdata.Money * 100) if drawnum <= 50 { checkcoin = 1 } gold, err := GetCashFromSDK(uuid, drawnum, rdata.Gameid, rdata.Channel, rdata.Openid, uinfo.NickName, uinfo.Head, rdata.Ver, checkcoin) if err != nil { logger.Error("HandlerGetcash GetCashFromSDK failed failed=%v", err) resp.Code = 1 resp.Message = "金币不足" break } if info.Isnew == 1 { uinfo.WithDraw.Cashdata[index].Isnew = 0 } resp.Data.Redbag = float32(gold) / 10000 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAddcatgold(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AddcatgoldResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerFetchlvredbag getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } addgold := CATADDGOLD * uinfo.Goldrate uinfo.Gold += addgold resp.Data.Getgold = addgold resp.Data.Totalgold = uinfo.Gold resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerShakeaddgold(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp ShakeaddgoldResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerFetchlvredbag getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } addgold := SHAKEGOLDMULT * uinfo.Goldrate uinfo.Gold += addgold resp.Data.Goldnum = addgold resp.Data.Goldsumnum = uinfo.Gold resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func (uinfo *UserData) CalcTaskList(list *TaskList, uniqueid string) *TaskList { newlist := new(TaskList) //curtype := -1 //记录当前类型 for k, val := range list.Taskdata { //未完成的才做判断 if val.Taskstatus != 1 { continue } cfg := jsonconf.GetTaskConfig(val.Taskid) if cfg == nil { logger.Error("CalcTaskList GetTaskConfig failed id=%v", val.Taskid) continue } if cfg.Type == DAILY_TASKTYPE_1 { list.Taskdata[k].Taskprogress = uinfo.Task.OnlineMin //当日提取存钱罐次数 if uinfo.Task.OnlineMin >= cfg.Parameter { list.Taskdata[k].Taskstatus = 2 } } else if cfg.Type == DAILY_TASKTYPE_2 { list.Taskdata[k].Taskprogress = uinfo.Task.MergeCat //当日提取存钱罐次数 if uinfo.Task.MergeCat >= cfg.Parameter { list.Taskdata[k].Taskstatus = 2 } } else if cfg.Type == DAILY_TASKTYPE_3 { list.Taskdata[k].Taskprogress = uinfo.Task.WatchAds if uinfo.Task.WatchAds >= cfg.Parameter { list.Taskdata[k].Taskstatus = 2 } } else if cfg.Type == DAILY_TASKTYPE_4 { list.Taskdata[k].Taskprogress = uinfo.Task.TwistEgg if uinfo.Task.TwistEgg >= cfg.Parameter { list.Taskdata[k].Taskstatus = 2 } } } newlist.Fetchrdnum = list.Fetchrdnum newlist.Taskdata = append(newlist.Taskdata, list.Taskdata...) //都返回即可 /*for k, val := range list.Taskdata { cfg := GetTaskConfig(val.Taskid) if cfg == nil { logger.Error("CalcTaskList GetTaskConfig failed id=%v", val.Taskid) continue } if val.Taskstatus == 2 { //未领取已完成 只需要加入第一种 if curtype == cfg.TaskType { continue } else { //将类型加入返回列表 newlist.Taskdata = append(newlist.Taskdata, list.Taskdata[k]) curtype = cfg.TaskType } } else if val.Taskstatus == 1 { //未完成 返回第一个 if curtype == cfg.TaskType { continue } else { //将类型加入返回列表 newlist.Taskdata = append(newlist.Taskdata, list.Taskdata[k]) curtype = cfg.TaskType } } else { //已领取 需要判断一下是否最后一项 if k != len(list.Taskdata)-1 { //不是最后一条数据 nextcfg := GetTaskConfig(list.Taskdata[k+1].Taskid) if nextcfg != nil { if nextcfg.TaskType != cfg.TaskType { //下面一天不是此类型了 newlist.Taskdata = append(newlist.Taskdata, list.Taskdata[k]) curtype = cfg.TaskType } } } else { //最后一条 加入 newlist.Taskdata = append(newlist.Taskdata, list.Taskdata[k]) curtype = cfg.TaskType } } }*/ //需要保存到redis SaveTaskInfo(uniqueid, 1, list) //排序 sort.Sort(newlist) return newlist } func HandlerQuerytaskinfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QuerytaskinfoResp resp.Code = 0 var rdata QuerytaskinfoReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerQuerytaskinfo data failed:%v,for:%v", err, data) resp.Message = "网络错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } uinfo.HandlePassDay(uuid) //需要先计算出任务或者成就 var tasklist *TaskList //先查询一下当前的任务数据 tasklist, err = GetTaskInfo(uuid, 1) if err != nil || tasklist == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } tasklist = uinfo.CalcTaskList(tasklist, strconv.Itoa(uuid)) if tasklist == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } resp.Data.Taskdata = append(resp.Data.Taskdata, tasklist.Taskdata...) resp.Data.Fetchrdnum = uinfo.FetchRdBagNum resp.Code = 0 break } //回包 logger.Info("HandlerQuerytaskinfo,uuid=%v resp=%v", uuid, resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func (uinfo *UserData) HandleGetTaskReward(req *GettaskrewardReq, resp *GettaskrewardResp, list *TaskList, uuid int, ttype int) error { isfind := false index := -1 var taskdesc *TaskListDesc for k, val := range list.Taskdata { if val.Taskid == req.Taskid { isfind = true index = k taskdesc = &val break } } logger.Info("HandleGetTaskReward index=%v taskdesc=%v", index, taskdesc) if isfind && taskdesc != nil && index != -1 { if taskdesc.Taskstatus != 2 { //状态不是可领取状态 无法领取 resp.Code = 99 resp.Message = "当前任务未完成或已领取" return errors.New("当前任务未完成或已领取") } //状态对的情况 如果是成就下需要判断前置条件是否被 /*if req.Tasktype == 2 && index > 0 { precfg := GetAchieveConfig(list.Taskdata[index-1].Taskid) nowcfg := GetAchieveConfig(taskdesc.Taskid) logger.Info("HandleGetTaskRewardGetTaskConfig precfg=%v nowcfg=%v", precfg, nowcfg) if precfg != nil && nowcfg != nil && precfg.TaskType == nowcfg.TaskType && list.Taskdata[index-1].Taskstatus != 0 { resp.Code = ERROR_TASKPRE_NOTGET resp.Message = "前置任务还未领取" return errors.New("当前任务未完成或已领取") } }*/ } else { resp.Code = 1 resp.Message = "当前任务id错误" return errors.New("当前任务id错误") } cfg := jsonconf.GetTaskConfig(taskdesc.Taskid) if cfg == nil || len(cfg.Reward) < 2 { resp.Code = 1 resp.Message = "网络错误" return errors.New("获取配置失败") } //将状态置位已领取 list.Taskdata[index].Taskstatus = 0 //发奖励 sub := len(cfg.Reward) / 2 for i := 0; i < sub; i++ { rtype := cfg.Reward[i*2] rnum := cfg.Reward[i*2+1] if rtype == 1 { if ttype == 1 { //金币 addnum := uinfo.Goldrate * int64(rnum) * 60 uinfo.Gold += addnum resp.Data.Goldnum = addnum } else { //金币 addnum := uinfo.Goldrate * int64(rnum) * 60 * 2 uinfo.Gold += addnum resp.Data.Goldnum = addnum } } else if rtype == 2 { if ttype == 1 { //红包币 rdnum := float32(rnum) / 10000 realgold, err := uinfo.AddRedPackect(rdnum, 100, req.Channel, req.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err) resp.Message = "后台加金币失败了" resp.Code = 1 break } resp.Data.Getrednum = rnum resp.Data.Totalrednum = realgold } else { //红包币 rdnum := float32(rnum) * 2 / 10000 logger.Info("HandleGetTaskReward rdnum=%v", rdnum) realgold, err := uinfo.AddRedPackect(rdnum, 100, req.Channel, req.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err) resp.Message = "后台加金币失败了" resp.Code = 1 break } resp.Data.Getrednum = rnum * 2 resp.Data.Totalrednum = realgold } } } return nil } func HandlerQueryworkinfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryworkinfoResp resp.Code = 0 for { //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v") resp.Message = "服务器错误" resp.Code = 1 break } diff := int(time.Now().Unix()) - uinfo.WorkStartTime uinfo.WorkLeftTime = uinfo.WorkLeftTime - diff if uinfo.WorkLeftTime < 0 { uinfo.WorkLeftTime = 0 } resp.Data.Lefttime = uinfo.WorkLeftTime resp.Data.Curprogram = uinfo.WorkProgramId SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetvideolove(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetvideoloveResp resp.Code = 0 for { //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v") resp.Message = "服务器错误" resp.Code = 1 break } cfg := jsonconf.GetLoveVideoConfig(uinfo.CurLoveVideo + 1) if cfg == nil { logger.Error("HandlerGetvideolove failed CurLoveVideo=%v", uinfo.CurLoveVideo) resp.Message = "今日奖励已领取完毕,请明日再来" resp.Code = 101 break } uinfo.CurLoveVideo++ uinfo.Love += int64(cfg.Reward) resp.Data.Curprocess = uinfo.CurLoveVideo resp.Data.Getlove = cfg.Reward resp.Data.Sumlove = uinfo.Love SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueryvideoloveprocess(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueryvideoloveprocessResp resp.Code = 0 for { //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v") resp.Message = "服务器错误" resp.Code = 1 break } resp.Data.Curprocess = uinfo.CurLoveVideo resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetworkreward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetworkrewardResp resp.Code = 0 var rdata CommReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerGetworkreward data failed:%v,for:%v", err, data) resp.Message = "网络错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetworkreward failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if uinfo.WorkProgramId == 0 || uinfo.WorkLeftTime != 0 { logger.Error("HandlerGetworkreward failed WorkProgramId=%v,WorkLeftTime=%v", uinfo.WorkProgramId, uinfo.WorkLeftTime) resp.Message = "没有可以领取的奖励" resp.Code = 1 break } cfg := jsonconf.GetWorkPartTimeConfig(uinfo.WorkProgramId) if cfg == nil { logger.Error("HandlerGetworkreward failed err=%v", err) resp.Message = "获取配置失败" resp.Code = 1 break } if cfg.Reward[0] == 1 { //金币 addnum := uinfo.Goldrate * int64(cfg.Reward[1]) * 60 uinfo.Gold += addnum resp.Data.Goldnum = addnum } else if cfg.Reward[0] == 2 { //红包币 rdnum := float32(cfg.Reward[1]) / 10000 realgold, err := uinfo.AddRedPackect(rdnum, 100, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Info("HandlerGetworkreward data failed:%v,for:%v", err) resp.Message = "后台加金币失败了" resp.Code = 1 break } resp.Data.Getrednum = cfg.Reward[1] resp.Data.Totalrednum = realgold } uinfo.WorkLeftTime = 0 uinfo.WorkProgramId = 0 uinfo.WorkStartTime = 0 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 logger.Info("HandlerGetworkreward resp=%+v", resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerStartwork(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp StartworkResp resp.Code = 0 var rdata StartworkReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerStartwork data failed:%v,for:%v", err, data) resp.Message = "网络错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if uinfo.WorkProgramId != 0 || uinfo.WorkStartTime != 0 { logger.Error("HandlerStartwork failed err=%v", err) resp.Message = "正在打工无法重复打工" resp.Code = 1 break } cfg := jsonconf.GetWorkPartTimeConfig(rdata.Workid) if cfg == nil { logger.Error("HandlerStartwork failed err=%v", err) resp.Message = "获取配置失败" resp.Code = 1 break } uinfo.WorkProgramId = rdata.Workid uinfo.WorkLeftTime = cfg.Time * 60 uinfo.WorkStartTime = int(time.Now().Unix()) resp.Data.Lefttime = uinfo.WorkLeftTime SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 logger.Info("HandlerStartwork resp=%+v", resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGettaskreward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GettaskrewardResp resp.Code = 0 var rdata GettaskrewardReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerGettaskreward data failed:%v,for:%v", err, data) resp.Message = "网络错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } //需要先计算出任务或者成就 var tasklist *TaskList //先查询一下当前的任务数据 tasklist, err = GetTaskInfo(uuid, 1) if err != nil || tasklist == nil { logger.Error("GetTaskInfo failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } //领奖 err = uinfo.HandleGetTaskReward(&rdata, &resp, tasklist, uuid, rdata.Ttype) logger.Info("HandlerGettaskreward tasklist=%v", tasklist) logger.Info("HandlerGettaskreward uinfo=%v", uinfo) if err != nil { logger.Error("HandleGetTaskReward failed err=%v", err) resp.Message = "奖励已经领取" resp.Code = 1 break } //保存数据 SaveUinfoToredis(uinfo, uuid) err = SaveTaskInfo(strconv.Itoa(uuid), 1, tasklist) resp.Code = 0 break } //回包 logger.Info("HandlerGettaskreward resp=%+v", resp) respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUpdatetaskandachieve(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp OnlinentfResp resp.Code = 0 resp.Message = "success" var rdata UpdatetaskReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerDrawguangold data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerFetchlvredbag getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } switch rdata.Tasktype { case TASK_TYPE_1: uinfo.Task.WatchAds += rdata.Value } resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerOnlinentf(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp OnlinentfResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerFetchlvredbag getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } uinfo.Task.OnlineMin++ resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerDoubletwistegg(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp DoubletwisteggResp resp.Code = 0 resp.Message = "success" var rdata CommReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerDoubletwistegg data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerDoubletwistegg data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } if uinfo.EggBonusId == 0 { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "没有可以领取的双倍奖励" resp.Code = 1 break } cfg := jsonconf.GetTwistConfig(uinfo.EggBonusId) if cfg == nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "获取配置失败" resp.Code = 1 break } if cfg.Reward[0] == 2 { rdnum := float32(cfg.Reward[1]) / 10000 realgold, err := uinfo.AddRedPackect(rdnum, 100, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "后台加金币失败了" resp.Code = 1 break } resp.Data.Getrednum = cfg.Reward[1] resp.Data.Totalredbag = realgold } else { //加的是金币 addnum := uinfo.Goldrate * int64(cfg.Reward[1]) uinfo.Gold += addnum resp.Data.Getgold = addnum } uinfo.EggBonusId = 0 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerAddfreeeggtime(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp AddfreeeggtimeResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } if uinfo.FELcnt <= 0 { logger.Info("GetUserInfo HandlerTwistegg data failed:%v", data) resp.Message = "没有看视频次数了!" resp.Code = 104 break } uinfo.FELcnt-- uinfo.FreeEggTime += 3 SaveUinfoToredis(uinfo, uuid) resp.Data.Lefttime = uinfo.FELcnt resp.Code = 0 break } logger.Info("HandlerAddfreeeggtime resp=%+v", resp) //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerTwistegg(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp TwisteggResp resp.Code = 0 resp.Message = "success" var rdata CommReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } if uinfo.FreeEggTime == 0 && uinfo.EggTime == 0 { //已经没有抽奖次数了 logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "已经没有抽奖次数了" resp.Code = 1 break } if uinfo.FreeEggTime == 0 { //需要扣金币 _, err := uinfo.AddRedPackect(0.1, 200, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "余额不足" resp.Code = 1 break } } else { } addgold, rewardid, addnum := CalcTurnTableNum() logger.Info("HandlerTwistegg addgold=%v,rewardid=%v", addgold, rewardid) rdnum := float32(addgold) / 10000 uinfo.EggBonusId = rewardid if addgold > 0 { realgold, err := uinfo.AddRedPackect(rdnum, 100, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerTwistegg data failed:%v,for:%v", err, data) resp.Message = "后台加金币失败了" resp.Code = 1 break } resp.Data.Getrednum = addgold resp.Data.Totalredbag = realgold } else { //加的是金币 addnum := uinfo.Goldrate * int64(addnum) * 60 uinfo.Gold += addnum resp.Data.Getgold = addnum } if uinfo.FreeEggTime > 0 { uinfo.FreeEggTime-- } else { uinfo.EggTime-- } uinfo.Task.TwistEgg++ SaveUinfoToredis(uinfo, uuid) resp.Data.Freecnt = uinfo.FreeEggTime resp.Data.Costcnt = uinfo.EggTime resp.Data.Leftaddtime = uinfo.FELcnt resp.Code = 0 break } logger.Info("HandlerTwistegg resp=%+v", resp) //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQueregginfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QueregginfoResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerQuersigndata data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } resp.Data.Freecnt = uinfo.FreeEggTime resp.Data.Costcnt = uinfo.EggTime resp.Data.Leftaddtime = uinfo.FELcnt resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerDosign(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp DosignResp resp.Code = 0 resp.Message = "success" var rdata DosignReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerDosign data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerQuersigndata data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } if uinfo.IsSignToday == 1 { logger.Info(" HandlerDosign issign failed:%v,for:%v", err, data) resp.Message = "当天已签到" resp.Code = 1 break } uinfo.IsSignToday = 1 uinfo.SignSum++ if uinfo.SignSum > 7 { uinfo.SignSum = 1 } cfg := jsonconf.GetsignConfig(uinfo.SignSum) if cfg == nil { logger.Info("GetUserInfo HandlerDosign data failed:%v,for:%v", err, data) resp.Message = "参数错误" resp.Code = 1 break } rnum := float32(cfg.Reward) / 10000 readgold := 0 if rdata.Stype == 1 { } else if rdata.Stype == 2 { rnum = rnum * 2 } readgold, err = uinfo.AddRedPackect(rnum, 100, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Info("GetUserInfo HandlerDosign data failed:%v,for:%v", err, data) resp.Message = "后台失败!" resp.Code = 1 break } uinfo.SignShow = 0 resp.Data.Curday = uinfo.SignSum resp.Data.Issigntaday = uinfo.IsSignToday resp.Data.Walletgold = readgold resp.Data.Getgold = cfg.Reward if rdata.Stype == 2 { resp.Data.Getgold = cfg.Reward * 2 } SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQuersigndata(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QuersigndataResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Info("GetUserInfo HandlerQuersigndata data failed:%v", data) resp.Message = "GetUserInfo failed" resp.Code = 1 break } resp.Data.Curday = uinfo.SignSum resp.Data.Issigntaday = uinfo.IsSignToday resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQuerygetcashinfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QuerygetcashinfoResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGetflyboxreward getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } //返回 resp.Data.Logindaycontinue = uinfo.ContinueLoginDay resp.Data.Logindaysum = uinfo.SumLoginDay resp.Data.Cashdata = append(resp.Data.Cashdata, uinfo.WithDraw.Cashdata...) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerFetchlvredbag(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp FetchlvredbagResp resp.Code = 0 resp.Message = "success" var rdata FetchlvredbagReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerFetchlvredbag json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerFetchlvredbag getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } if len(uinfo.WaitFetchLv) == 0 { //请求领取的等级红包不正确 logger.Error("HandlerFetchlvredbag catlv failed=%v", err) resp.Code = 2 resp.Message = "请求领取的等级红包不正确" break } if rdata.Catlv != uinfo.WaitFetchLv[0] { //请求领取的等级红包不正确 logger.Error("HandlerFetchlvredbag catlv failed=%v", err) resp.Code = 1 resp.Message = "请求领取的等级红包不正确" break } rdnum, err := jsonconf.GetLvRdNum(rdata.Catlv) if err != nil { logger.Error("HandlerFetchlvredbag GetCatConfig failed=%v", err) resp.Code = 1 resp.Message = "获取配置失败" break } _, err = uinfo.AddRedPackect(rdnum, 100, rdata.Channel, rdata.Gameid, uuid) if err != nil { logger.Error("HandlerFetchlvredbag GetCatConfig failed=%v", err) resp.Code = 1 resp.Message = "后台加红包失败!" break } uinfo.WaitFetchLv = uinfo.WaitFetchLv[1:] resp.Data.Redbag = rdnum resp.Code = 0 //保存 SaveUinfoToredis(uinfo, uuid) break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerQuertlvredbag(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QuertlvredbagResp resp.Code = 0 resp.Message = "success" for { uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerQuertlvredbag getuserinfo failed=%v") resp.Code = 1 resp.Message = "get userinfo failed" break } if len(uinfo.WaitFetchLv) == 0 { //没有可领取的 if uinfo.Highestlv < 36 { resp.Data.Catlv = uinfo.Highestlv + 1 } else { resp.Data.Catlv = 0 } resp.Data.Redbag = 0.0 resp.Data.Canfetch = 0 } else { resp.Data.Canfetch = 1 resp.Data.Catlv = uinfo.WaitFetchLv[0] rdnum, err := jsonconf.GetLvRdNum(uinfo.WaitFetchLv[0]) if err != nil { logger.Error("HandlerQuertlvredbag getcatcfg failed lv=%v", uinfo.WaitFetchLv[0]) } else { resp.Data.Redbag = rdnum } } break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetOfflineReward(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetOfflineRewardResp resp.Code = 0 var rdata GetOfflineRewardReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Error("HandlerGetOfflineReward json unmarshal failed=%v", err) resp.Code = 1 resp.Message = "json failed" break } uinfo := GetUserInfo(uuid) if uinfo == nil { logger.Error("HandlerGenerateBox getuserinfo failed=%v", err) resp.Code = 1 resp.Message = "get userinfo failed" break } offlinelock.Lock() defer offlinelock.Unlock() addgold := uinfo.OfflineGold addlove := uinfo.OfflineLove if rdata.Optype == 2 { addgold *= 2 addlove *= 2 } uinfo.Gold += addgold uinfo.Love += addlove resp.Love = addlove //uinfo.Love resp.Gold = addgold //uinfo.Gold //保存 SaveUinfoToredis(uinfo, uuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) }