package logic import ( "HttpServer/jsonconf" "HttpServer/redishandler" "common/logger" "common/redis" "encoding/json" "fmt" "math/rand" "net/http" "strconv" "sync" "time" ) var llock sync.Mutex func HandlerQuerdrawinfo(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp QuerdrawinfoResp resp.Code = 0 var rdata CommReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerQuerdrawinfo data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } //返回 resp.Data.Logindaysum = uinfo.SumLoginDay resp.Data.Logindaycontinue = uinfo.ContinueLoginDay resp.Data.Cashdata = append(resp.Data.Cashdata, uinfo.WithDraw.Cashdata...) resp.Data.SpecialCashdata = append(resp.Data.SpecialCashdata, uinfo.WithDraw.SpecialCashdata...) resp.Code = 0 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 var rdata GetcashReq 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 } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } drawnum := int(rdata.Money * 100) //需要判断一下金币是否足够 if drawnum*100 > uinfo.RealGold { logger.Error("gold nor enough failed err=%v", err) resp.Message = "提现金币不足" resp.Code = 2 break } //需要处理一下提现级别 index := 0 var info *WithDrawDesc if rdata.Ctype == 1 { index, info = uinfo.GetWithDrawData(rdata.Money) } else { index, info = uinfo.GetSpecialWithDrawData(rdata.Money) } if index == -1 || info == nil { logger.Error("AddWithDrawList failed err=%v", err) resp.Message = "网络错误" resp.Code = 1 break } if uinfo.PassLevel < info.Limitlv { logger.Error("AddWithDrawList failed err=%v", err) resp.Message = "当前通关等级不足" resp.Code = 3 break } if info.Isnew == 0 { logger.Error("AddWithDrawList failed err=%v", err) resp.Message = "新人专享只能提取一次" resp.Code = 4 break } if info.Preisfind == 0 { logger.Error("HandlerGetcash Preisfind err=%v", err) resp.Message = "请先完成前一档提现" resp.Code = 5 break } //普通提现需要判断前置条件 if rdata.Ctype == 1 { //判断一下前置条件的下一档 if index == len(uinfo.WithDraw.Cashdata)-1 { //最后一档了不用处理 } else { if index < len(uinfo.WithDraw.Cashdata)-1 { uinfo.WithDraw.Cashdata[index+1].Preisfind = 1 } } } //如果是2.2.7版本开启提现次数限制 if rdata.Ver == "2.2.7" && uinfo.GetCashCnt > 0 { logger.Error("HandlerGetcash GetCashCnt err=%v", err) resp.Message = "当天已经提现过了,请明天再来" resp.Code = 6 break } if info.Cid == 6 { if uinfo.ContinueLoginDay < info.Logindaylimit { logger.Error("HandlerGetcash GetCashCnt err=%v", err) resp.Message = "连续登陆天数不足" resp.Code = 7 break } }else { if uinfo.SumLoginDay < info.Logindaylimit { logger.Error("HandlerGetcash GetCashCnt err=%v", err) resp.Message = "累计登陆天数不足" resp.Code = 7 break } } //2.2.5版本开启自动审核 checkcoin := 2 if rdata.Ver == "2.2.5" || rdata.Ver == "2.2.6" || rdata.Ver == "2.3.2" { logger.Info("HandlerGetcash autocheckcoin") if drawnum <= 200 { //1.5挡位以下不需要审核 checkcoin = 1 //临时关闭u } } gold, err := GetCashFromSDK(uuid, drawnum, rdata.Gameid, rdata.Channel, rdata.Openid, rdata.Nickname, rdata.Headurl, rdata.Ver, checkcoin) if err != nil { logger.Error("GetCashFromSDK failed err=%v", err) resp.Message = "从后台提现失败了" resp.Code = 8 break } uinfo.GetCashCnt++ //如果是前六挡 if info.Cid <= 6 && rdata.Ctype == 1 { uinfo.WithDraw.Cashdata[index].Isnew = 0 } if rdata.Ctype == 2 { uinfo.WithDraw.SpecialCashdata[index].Isnew = 0 } uinfo.RealGold = gold //uinfo.RealGold -= drawnum * 100 resp.Data.Walletgold = uinfo.RealGold SaveUserInfo(uinfo, uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUploadtili(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp UploadtiliResp resp.Code = 0 var rdata UploadtiliReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerUploadspeciallevel data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } uinfo.Tili = rdata.Tili SaveUserInfo(uinfo,uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerFetchredbag(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp FetchredbagResp resp.Code = 0 var rdata FetchredbagReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerFetchredbag data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if rdata.Rtype == 1 { //先判断一下是否可以领取 if uinfo.GuanRedNum >= uinfo.PassLevel { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "没有可以领取的关卡红包" resp.Code = 1 break } cfg := jsonconf.GetGuanConf(uinfo.GuanRedNum+1) if cfg == nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "获取配置失败!" resp.Code = 1 break } realgold, err := AddCoinToSdk(uuid, cfg.Cash, rdata.Gameid, rdata.Channel, 108) if err !=nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "服务器错误!" resp.Code = 1 break } resp.Data.Getgold = cfg.Cash resp.Data.Walletgold = realgold uinfo.GuanRedNum ++ }else if rdata.Rtype == 2 { if uinfo.JiRedNum+1 >= uinfo.BigLevel { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "没有可以领取的等级红包" resp.Code = 1 break } cfg := jsonconf.GetGuanConf(uinfo.JiRedNum+1) if cfg == nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "获取配置失败!" resp.Code = 1 break } realgold, err := AddCoinToSdk(uuid, cfg.Cash, rdata.Gameid, rdata.Channel, 108) if err !=nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "服务器错误!" resp.Code = 1 break } resp.Data.Getgold = cfg.Cash resp.Data.Walletgold = realgold uinfo.JiRedNum ++ }else if rdata.Rtype == 3{ if uinfo.RandNum <= 0 { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "没有可以领取的随机红包次数了!" resp.Code = 1 break } getnum := rand.Intn(200) + 100 realgold, err := AddCoinToSdk(uuid, getnum, rdata.Gameid, rdata.Channel, 108) if err !=nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "服务器错误!" resp.Code = 1 break } resp.Data.Getgold = getnum resp.Data.Walletgold = realgold uinfo.RandNum-- }else { if uinfo.SpecialLevel <= uinfo.SpecialNum { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "没有可以领取的随机红包次数了!" resp.Code = 1 break } getnum := rand.Intn(300) + 300 realgold, err := AddCoinToSdk(uuid, getnum, rdata.Gameid, rdata.Channel, 108) if err !=nil { logger.Error("HandlerFetchredbag failed err=%v", err) resp.Message = "服务器错误!" resp.Code = 1 break } resp.Data.Getgold = getnum resp.Data.Walletgold = realgold uinfo.SpecialNum++ } SaveUserInfo(uinfo,uniqueuuid) resp.Data.Randnum = uinfo.RandNum resp.Data.Guanrednum = uinfo.GuanRedNum resp.Data.Jirednum = uinfo.JiRedNum resp.Data.Specialguannum = uinfo.SpecialNum resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUploadspeciallevel(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp UploadlevelResp resp.Code = 0 var rdata UploadlevelReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerUploadspeciallevel data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if rdata.Level > uinfo.SpecialLevel { uinfo.SpecialLevel = rdata.Level } SaveUserInfo(uinfo,uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUploadbiglevel(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp UploadlevelResp resp.Code = 0 var rdata UploadlevelReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerUploadbiglevel data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if rdata.Level > uinfo.BigLevel { uinfo.BigLevel = rdata.Level } SaveUserInfo(uinfo,uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerUploadlevel(w http.ResponseWriter, data string, uuid int) { SetHeader(w) llock.Lock() defer llock.Unlock() var resp UploadlevelResp resp.Code = 0 var rdata UploadlevelReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerUploadlevel data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } uniqueuuid := strconv.Itoa(uuid) + rdata.Channel uinfo, err := GetUserInfo(uniqueuuid) if err != nil || uinfo == nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } logger.Info("HandlerUploadlevel uinfo=%v rdata=%v",uinfo.PassLevel,rdata.Level) if rdata.Level > uinfo.PassLevel { uinfo.PassLevel = rdata.Level } SaveUserInfo(uinfo,uniqueuuid) resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerGetcashrecord(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp GetcashrecordResp resp.Code = 0 var rdata GetcashrecordReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerGetcashrecord data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 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 = 2 break } if list != nil { resp.Data.Withdata = append(resp.Data.Withdata, *list...) } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } func HandlerLogin(w http.ResponseWriter, data string, uuid int) { SetHeader(w) var resp UserLoginResp resp.Code = 0 var rdata UserLoginReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { logger.Info("json decode HandlerLogin data failed:%v,for:%v", err, data) resp.Message = "json解析错误" resp.Code = 1 break } //需要加上渠道才是唯一的玩家id,不同渠道视为不同数据 uniqueuuid := strconv.Itoa(uuid) + rdata.Channel //此处需要做一下数据兼容 先判断uuid+channel的key是否存在 //先判断一下是否是新用户 isexist, err := redishandler.GetRedisClient().HExists(redis.USER_DATA_KEY, uniqueuuid) if err != nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } if !isexist { //不存在 //不存在老的数据 之间走新号流程 err = InitUserInfo(&rdata, &resp, uuid, uniqueuuid) } else { //已经迁移过的数据之间返回 //已经登陆过了 需要获取玩家数据 err = GetUserData(uuid, uniqueuuid, &rdata, &resp) } if err != nil { logger.Error("redis failed err=%v", err) resp.Message = "服务器错误" resp.Code = 1 break } resp.Code = 0 break } //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) logger.Info("###HandlerLogin###rdata:%v", string(respstr)) } func (u *UserData) HandlePassDay(uuid int, channel string) { 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) if nowdaynum == lastdaynum { //同一天 if int64(u.LastLoginTime)-time.Now().Unix() > 86400 { //已经过了很多天了 //u.LastLoginTime = int(time.Now().Unix()) u.ContinueLoginDay = 1 isdiffday = true } else { //t同一天 不做处理 } } else { //不是同一天了 isdiffday = true if nowtimestamp.Unix() != lasttimestamp.Unix()+86400 { //超过一天了 u.ContinueLoginDay = 1 } else { u.ContinueLoginDay++ } logger.Info("HandlePassDay now=%v,last=%v", nowtimestamp.Unix(), lasttimestamp.Unix()) } if isdiffday { //跨天了 u.SumLoginDay++ u.WatchAddsTime = WATCH_ADD_DAY_LIMIT //todo 重置任务相关的数据 u.GetFromGuanCnt = 0 u.GetCashCnt = 0 u.RandNum = RANDNUMLIMIT //签到数据处理 u.IsSignToday = 0 if u.SignSum >= 7 { //进入新的一轮 u.SignSum = 0 u.SignRound++ } } u.LastLoginTime = int(nowtime.Unix()) uniqueid := strconv.Itoa(uuid) + channel SaveUserInfo(u, uniqueid) } func GetUserData(uuid int, uniqueuid string, req *UserLoginReq, resp *UserLoginResp) error { data, err := GetUserInfo(uniqueuid) if err != nil || data == nil { resp.Code = 1 resp.Message = "ERROR_SRV_ERROR" return err } //此处要处理一下跨天逻辑 data.HandlePassDay(uuid, req.Channel) //需要处理下提现表信息 等待提现表 err = data.ReInitWithDraw(uniqueuid) if err != nil { logger.Error("GetUserData ReInitWithDraw err=%v", err) } //此处处理一下从sdk拉取钱包金币数量 gold, err := GetCoinFromSdk(uuid, req.Gameid, req.Channel) if err == nil { data.RealGold = gold } else { logger.Error("GetCoinFromSdk err=%v", err) } SaveUserInfo(data, uniqueuid) resp.Data.Walletgold = data.RealGold resp.Data.Curji = data.BigLevel resp.Data.Curlevel = data.PassLevel resp.Data.Guanrednum = data.GuanRedNum resp.Data.Jirednum = data.JiRedNum resp.Data.Randnum = data.RandNum resp.Data.Speciallevel = data.SpecialLevel resp.Data.Specialguannum = data.SpecialNum resp.Data.Tili = data.Tili return nil }