diff --git a/src/HttpServer/logic/constdef.go b/src/HttpServer/logic/constdef.go new file mode 100644 index 0000000..43c2bf3 --- /dev/null +++ b/src/HttpServer/logic/constdef.go @@ -0,0 +1,55 @@ +package logic + +//任务成就类型枚举 协议上报用 +const ( + TASKTYPE_PASSLEVEL = 1 //表示通过x关卡 + TASKTYPE_GETREDBAG = 2 //领取x次红包 + TASKTYPE_WATCHADS = 3 //3表示观看x次广告 + TASKTYPE_KILLSTAR = 4 //4表示消除x颗星星 + TASKTYPE_USEITEM = 5 //5表示使用x次道具 +) + +//任务类型 对应表 +const ( + DAILY_TASKTYPE_LOGIN = 1 //1 每日登录 + DAILY_TASKTYPE_GETGUANCNT = 2 //提取存钱罐 + DAILY_TASKTYPE_PASSLEVEL = 3 //近日通过关 + DAILY_TASKTYPE_USEITEM = 4 //使用道具数 + DAILY_TASKTYPE_GETREDBAG = 5 //领取红包次数 + DAILY_TASKTYPE_GETGUANGOLD = 6 //收取金币x枚 + DAILY_TASKTYPE_ONLINEMIN = 7 //在线分钟数 +) + +//成就类型 对应表 +const ( + ACHIEVETYPE_WATCHADDS = 1 //累计观看广告次数 + ACHIEVETYPE_USERLV = 2 //人物等级 + ACHIEVETYPE_KILLSTAR = 3 //累计消除星星数 + ACHIEVETYPE_GETGUANCNT = 4 //累计存钱罐提取 + ACHIEVETYPE_USEITEMCNT = 5 //累计道具使用 + +) + +//奖励类型枚举 +const ( + REWARDTYPE_STAR = 1 //星星 + REWARDTYPE_CHUI = 2 + REWARDTYPE_SHUA = 3 + REWARDTYPE_SWAP = 4 + REWARDTYPE_ELIMITE = 5 + REWARDTYPE_EXP = 6 + REWARDTYPE_GOLD = 7 +) + +const ( + //XIAOXINGXING_SERVERKEYTEST = "e2cd22102143cdcd9c181f962d031685" + XIAOXINGXING_SERVERKEYTEST = "33e0c3238c108a36d87025544c6a2d2f" + XIAOXINGXING_SERVERKEYTEST_1015 = "a81eb66afd923d24e65a4b542592bc41" + //XIAOXINGXING_SDKURLOFFICAL = "https://testapi-gamesdk.d3games.com/" + XIAOXINGXING_SDKURLOFFICAL = "https://api.gamesdk.hmjoy.cn/" +) + +const ( + WATCH_ADD_DAY_LIMIT = 50 //当天获取红包次数限制 + ACCGOLDRATELIMIT = 3 //玩家每天看视频加速金币次数 +) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index 21cee1a..c19983e 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -98,9 +98,14 @@ type GenerateBoxResp struct { type AcclecteReq struct { //Uuid int `json:"uuid"` } +type AcclectData struct { + LeftTimes int `json:"leftTimes"` + Coin DoBuyCatCoin `json:"coin"` +} type AcclecteResp struct { - Code int `json:"code"` - Message string `json:"message"` + Code int `json:"code"` + Message string `json:"message"` + Data AcclectData `json:"data"` } type AcclecteBoxResp struct { @@ -288,6 +293,32 @@ type QueryPlayerRankResp struct { Data []RankInfoDesc `json:"data"` } +type CatPosInfo struct { + Position int `json:"position"` + Cat int `json:"cat"` + RedPacket int `json:"redPacket"` + Time int `json:"time"` + StartTime int `json:"startTime"` +} + +type adRateData struct { + Multiple int `json:"multiple"` + EndTime int `json:"endTime"` +} + +type GetMainPageInfoData struct { + LimitCatList []int `json:"limitCatList"` + CatList []CatPosInfo `json:"catList"` + Coin DoBuyCatCoin `json:"coin"` + AdRate adRateData `json:"adRate"` +} + +type GetMainPageInfoResp struct { + Code int `json:"code"` + Message string `json:"message"` + Data GetMainPageInfoData `json:"data"` +} + type QueryCompleteTaskDesc struct { Taskid int `json:"taskid"` } @@ -435,7 +466,9 @@ type UserData struct { Highestlv int //当前最高猫等级 InviteId int //邀请者uid CurBoxLv int //当前猫箱子等级 - IsDouble int //当前加速标签 1表示双倍收益 0表示正常 + IsDouble int //当前加速标签 1表示3倍收益 0表示正常 + StartDoubleTime int //开始双倍时间 + DoubleLeftTimes int //开始双倍时间 IsAuto int //当前是否自动合成 IsBoxAcc int //是否处于加速生成箱子状态 RandGiftNum int //当前剩余空投猫粮次数 @@ -448,10 +481,11 @@ type UserData struct { IsFirstRedBgCat int //是否合成过红包猫 0表示否1表示是 OfflineGold int64 //离线金币 OfflineLove int64 //离线爱心 + LastLoginTime int //上次登陆时间 CatShopInfo CatShopData //猫咖门店数据 Taskinfo TaskData //任务数据 AchieveMent AchieveMentData //成就数据 - PosInfo []PosData //位置信息 从0开始 + PosInfo []CatPosInfo //位置信息 从0开始 BuyCatInfo []BuyCatInfoData //商店购买猫数据 第一个元素为1级猫 第二个为2级猫以此类推 CatRoomInfo []CatRoomData //猫咖店数据 diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 73df733..7089044 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -6,10 +6,51 @@ import ( "common/logger" "common/redis" "encoding/json" + "sort" "strconv" "time" ) +func (u *UserData) HandlePassDay() { + 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 { + //已经过了很多天了 + + isdiffday = true + } else { + //t同一天 不做处理 + } + } else { + //不是同一天了 + isdiffday = true + if nowtimestamp.Unix() != lasttimestamp.Unix()+86400 { + + } else { + + } + logger.Info("HandlePassDay now=%v,last=%v", nowtimestamp.Unix(), lasttimestamp.Unix()) + } + + if isdiffday { + //跨天了 + u.DoubleLeftTimes = ACCGOLDRATELIMIT + } + + u.LastLoginTime = int(nowtime.Unix()) + + SaveUserInfo(u, strconv.Itoa(u.UserId)) +} + func SaveUserInfo(data *UserData, uniqueid string) error { savestr, err := json.Marshal(data) @@ -54,12 +95,15 @@ func InitUserInfo(data *UserLoginReq, resp *UserLoginResp, uuid int) { udata.RandGiftTime = int(time.Now().Unix()) udata.Redbag = 0 udata.IsFirstRedBgCat = 0 + udata.DoubleLeftTimes = ACCGOLDRATELIMIT + udata.RegTime = int(time.Now().Unix()) + udata.LastLoginTime = int(time.Now().Unix()) //初始化16个猫爬架 for i := 0; i < 16; i++ { - var d1 PosData - d1.Pos = i - d1.Catlv = 0 + var d1 CatPosInfo + d1.Position = i + d1.Cat = 0 udata.PosInfo = append(udata.PosInfo, d1) var d2 DataDesc d2.Pos = i @@ -118,9 +162,9 @@ func InitUserInfo(data *UserLoginReq, resp *UserLoginResp, uuid int) { 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 + if v.Cat == 0 { + uinfo.PosInfo[k].Cat = clv + uinfo.PosInfo[k].Position = k //v.Catlv = clv //v.Pos = k pos = k @@ -140,11 +184,11 @@ func (udata *UserData) CalcGoldRate() int64 { return 0 } for _, v := range udata.PosInfo { - if v.Catlv > 0 && v.Catlv < 100 { + if v.Cat > 0 && v.Cat < 100 { //有猫存在的要计算一下 //非红包猫 for _, vv := range jsonconf.GetJsonConf().CatConfig { - if vv.Id == v.Catlv { + if vv.Id == v.Cat { onerate, _ := strconv.ParseInt(vv.Gold_get, 10, 64) sumrate += onerate break @@ -152,16 +196,16 @@ func (udata *UserData) CalcGoldRate() int64 { } } - if v.Catlv > 100 { + if v.Cat > 100 { //红包猫 需要判断是否产金币 - rcfg := jsonconf.GetRedCatConfig(v.Catlv) + rcfg := jsonconf.GetRedCatConfig(v.Cat) if rcfg != nil { if rcfg.Is_37 != 0 { onerate, _ := strconv.ParseInt(cfg37.Gold_get, 10, 64) sumrate += onerate } } else { - logger.Error("GetRedCatConfig failed lv=%v", v.Catlv) + logger.Error("GetRedCatConfig failed lv=%v", v.Cat) } } } @@ -189,6 +233,7 @@ func (udata *UserData) CalcGoldRate() int64 { } } + udata.Goldrate = sumrate return sumrate } @@ -205,8 +250,8 @@ func (udata *UserData) AddToRank() error { func (u *UserData) CalcHigestCatName() string { higestlv := 0 for _, val := range u.PosInfo { - if higestlv < val.Catlv { - higestlv = val.Catlv + if higestlv < val.Cat { + higestlv = val.Cat } } @@ -247,3 +292,36 @@ func (u *UserData) CalcHigestCatName() string { } } + +//获取红包猫列表 +func (u *UserData) GetRedCatIdList() []int { + var rtsl []int + for _, val := range u.PosInfo { + if val.Cat > 100 { + rtsl = append(rtsl, val.Cat-100) + } + } + + udatastr, err := redishandler.GetRedisClient().HGet(redis.USER_WAREHOUSE_INFO, strconv.Itoa(u.UserId)) + if err != nil { + logger.Error("CalcGoldRate failed err=%v", err) + return rtsl + } + wdata := new(UserWareHouseData) + err = json.Unmarshal([]byte(udatastr), wdata) + if err != nil { + logger.Error("CalcGoldRate Unmarshal redis failed ") + return rtsl + } + for _, val := range wdata.Info { + rtsl = append(rtsl, val.Warelv) + } + + if len(rtsl) > 16 { + sort.Ints(rtsl) + return rtsl[:len(rtsl)-16] + } else { + return rtsl + } + +} diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 651b479..2ffcfb1 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -172,31 +172,33 @@ func startServerHttpServe() { http.HandleFunc("/api/home/buy", DoBuyCat) //购买猫 http.HandleFunc("/api/home/synResource", GetUserData) //同步资源 http.HandleFunc("/api/home/recvOfflineReward", GetOfflineReward) //领取离线奖励 - http.HandleFunc("api/ranking/list", QueryPlayerRank) //排行榜 + http.HandleFunc("/api/ranking/list", QueryPlayerRank) //排行榜 + http.HandleFunc("/api/home/index", GetMainPageInfo) //主页面 + http.HandleFunc("/api/home/adRate", AcclecteGold) //看广告加速 http.HandleFunc("/happycat/exchangetwoPos", ExchangePos) //交换位置 http.HandleFunc("/happycat/clickcatbox", ClickCatBox) //请求点击猫箱子 http.HandleFunc("/happycat/upgradecatbox", UpgradeCatBox) //请求点击猫箱子 - http.HandleFunc("/happycat/acclecte", AcclecteGold) //请求点击猫箱子 + //http.HandleFunc("/happycat/acclecte", AcclecteGold) //请求点击猫箱子 http.HandleFunc("/happycat/automerge", AutoMerge) //请求自动合成 http.HandleFunc("/happycat/generatebox", GenerateBox) //请求点击猫箱子 http.HandleFunc("/happycat/clickrandgift", ClickRandGift) //请求点击猫箱子 http.HandleFunc("/happycat/querybuycat", QueryBuyCat) //请求商店购买信息 - http.HandleFunc("/happycat/querwarehouse", QueryWareHouse) //请求仓库信息 - http.HandleFunc("/happycat/putcattowarehouse", PutCattoWareHouse) //将合成界面的猫放入仓库 - http.HandleFunc("/happycat/takecatoutfromwarehouse", TakeCatoutfromWareHouse) //将仓库的猫取出 - http.HandleFunc("/happycat/acclecteboxrate ", AcclecteBoxRate) //请求点击猫箱子 - http.HandleFunc("/happycat/queryautomergeinfo ", QueryAutomergeInfo) //请求点击猫箱子 - http.HandleFunc("/happycat/querycatroominfo ", QueryCatRoomInfo) //请求点击猫箱子 - http.HandleFunc("/happycat/buycatroom ", BuyCatRoom) //请求点击猫箱子 - http.HandleFunc("/happycat/upcattoroom ", UpCattoRoom) //请求点击猫箱子 - http.HandleFunc("/happycat/querycatshopinfo ", QueryCatShopInfo) //请求点击猫箱子 - http.HandleFunc("/happycat/catshoplay ", CatShoPlay) //请求点击猫箱子 - http.HandleFunc("/happycat/getcatshopreward ", GetCatShopReward) //请求点击猫箱子 - http.HandleFunc("/happycat/acclectecatstory ", AcclecteCatStory) //请求点击猫箱子 - http.HandleFunc("/chappycatat/updateuserinfo ", UpdateUserInfo) //请求点击猫箱子 - http.HandleFunc("/happycat/queryplayerrank ", QueryPlayerRank) //请求点击猫箱子 + http.HandleFunc("/happycat/querwarehouse", QueryWareHouse) //请求仓库信息 + http.HandleFunc("/happycat/putcattowarehouse", PutCattoWareHouse) //将合成界面的猫放入仓库 + http.HandleFunc("/happycat/takecatoutfromwarehouse", TakeCatoutfromWareHouse) //将仓库的猫取出 + http.HandleFunc("/happycat/acclecteboxrate ", AcclecteBoxRate) //请求点击猫箱子 + http.HandleFunc("/happycat/queryautomergeinfo ", QueryAutomergeInfo) //请求点击猫箱子 + http.HandleFunc("/happycat/querycatroominfo ", QueryCatRoomInfo) //请求点击猫箱子 + http.HandleFunc("/happycat/buycatroom ", BuyCatRoom) //请求点击猫箱子 + http.HandleFunc("/happycat/upcattoroom ", UpCattoRoom) //请求点击猫箱子 + http.HandleFunc("/happycat/querycatshopinfo ", QueryCatShopInfo) //请求点击猫箱子 + http.HandleFunc("/happycat/catshoplay ", CatShoPlay) //请求点击猫箱子 + http.HandleFunc("/happycat/getcatshopreward ", GetCatShopReward) //请求点击猫箱子 + http.HandleFunc("/happycat/acclectecatstory ", AcclecteCatStory) //请求点击猫箱子 + http.HandleFunc("/chappycatat/updateuserinfo ", UpdateUserInfo) //请求点击猫箱子 + //http.HandleFunc("/happycat/queryplayerrank ", QueryPlayerRank) //请求点击猫箱子 http.HandleFunc("/happycat/querycompletetask ", QueryCompleteTask) //请求点击猫箱子 http.HandleFunc("/happycat/querycompleteachievement ", QueryCompleteAchievement) //请求点击猫箱子 http.HandleFunc("/happycat/gettaskreward ", GetTaskReward) //请求点击猫箱子 @@ -334,6 +336,24 @@ func UpdateUserInfo(w http.ResponseWriter, r *http.Request) { //HandlerUpdateUserInfo(w, s, Uuid) } +func GetMainPageInfo(w http.ResponseWriter, r *http.Request) { + Uuid := 0 + if len(r.Header) > 0 { + Uuid, _ = strconv.Atoi(r.Header.Get("uid")) + } + if Uuid == 0 { + SetHeader(w) + return + } + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("GetMainPageInfo , body:%v,uuid=%v", s, Uuid) + + HandlerGetMainPageInfo(w, s, Uuid) +} + func QueryPlayerRank(w http.ResponseWriter, r *http.Request) { Uuid := 0 if len(r.Header) > 0 { @@ -697,7 +717,7 @@ func AcclecteBoxRate(w http.ResponseWriter, r *http.Request) { func AcclecteGold(w http.ResponseWriter, r *http.Request) { Uuid := 0 if len(r.Header) > 0 { - Uuid, _ = strconv.Atoi(r.Header.Get("Uuid")) + Uuid, _ = strconv.Atoi(r.Header.Get("uid")) } if Uuid == 0 { SetHeader(w) @@ -709,7 +729,7 @@ func AcclecteGold(w http.ResponseWriter, r *http.Request) { s := string(result) logger.Info("AcclecteGold , body:%v,uuid=%v", s, Uuid) - // HandlerAcclecteGold(w, s, Uuid) + HandlerAcclecteGold(w, s, Uuid) } func ExchangePos(w http.ResponseWriter, r *http.Request) { diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index 224bde4..1dfdd11 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -69,7 +69,8 @@ func HandlerLogin(w http.ResponseWriter, data string, uuid int, token string) { resp.Data.AccessToken = token resp.Data.HeadImg = uinfo.Head resp.Data.LoginType = rdata.Lype - + uinfo.LastLoginTime = int(time.Now().Unix()) + SaveUserInfo(uinfo, strconv.Itoa(uuid)) } //回包 @@ -203,6 +204,8 @@ func HandlerGetUserData(w http.ResponseWriter, data string, uuid int) { resp.Message = "get userinfo failed" break } + //处理一下跨天了 + uinfo.HandlePassDay() if nowtime-int64(lasttime) > 5*60 { //算离线收益 @@ -220,10 +223,34 @@ func HandlerGetUserData(w http.ResponseWriter, data string, uuid int) { resp.Data.OfflineReward.Income = strconv.FormatInt(uinfo.OfflineGold, 10) } else { //按费离线收益计算 + //先计算一下双倍时间是否过期了 + addgold := int64(0) offsec := nowtime - int64(lasttime) + if uinfo.IsDouble == 1 { + if nowtime > int64(uinfo.IsDouble+150) { + + //加速过期了 + //计算部分三倍的 + if lasttime > uinfo.IsDouble+150 { + addgold = uinfo.Goldrate * offsec + } else { + noroffsec := nowtime - int64(uinfo.IsDouble+150) + accoffsec := offsec - noroffsec + addgold = uinfo.Goldrate*accoffsec*3 + noroffsec*uinfo.Goldrate + } + uinfo.IsDouble = 0 + uinfo.StartDoubleTime = 0 + + } else { + //还在加速期 + addgold = uinfo.Goldrate * offsec * 3 + } + + } + resp.Data.TimingReward = true resp.Data.Now = int(time.Now().Unix()) - addgold := uinfo.Goldrate * offsec + uinfo.Gold = addgold uinfo.GoldSum += addgold uinfo.AddToRank() @@ -336,3 +363,92 @@ func HandlerQueryPlayerRank(w http.ResponseWriter, data string, uuid int) { respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) } + +func HandlerGetMainPageInfo(w http.ResponseWriter, data string, uuid int) { + SetHeader(w) + var resp GetMainPageInfoResp + resp.Code = 0 + resp.Message = "success" + for { + uinfo, err := GetUserInfo(strconv.Itoa(uuid)) + if err != nil || uinfo == nil { + logger.Error("HandlerGetMainPageInfo getuserinfo failed=%v", err) + resp.Code = 1 + resp.Message = "get userinfo failed" + break + } + redlist := uinfo.GetRedCatIdList() + resp.Data.LimitCatList = append(resp.Data.LimitCatList, redlist...) + + resp.Data.CatList = append(resp.Data.CatList, uinfo.PosInfo...) + 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.Data.AdRate.Multiple = 1 + if uinfo.IsDouble == 1 { + resp.Data.AdRate.Multiple = 3 + resp.Data.AdRate.EndTime = uinfo.StartDoubleTime + 150 + accrate := uinfo.Goldrate * 3 + resp.Data.Coin.IcomeRate = strconv.FormatInt(accrate, 10) + } + 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 + resp.Message = "success" + + for { + + uinfo, err := GetUserInfo(strconv.Itoa(uuid)) + if err != nil || uinfo == nil { + logger.Error("HandlerAcclecteGold 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 + } + if uinfo.DoubleLeftTimes <= 0 { + //不够次数了 + logger.Error("HandlerAcclecteGold not enoughtimes failed=%v", err) + resp.Code = 1 + resp.Message = "enoughtimes" + break + } + + uinfo.IsDouble = 1 + uinfo.StartDoubleTime = int(time.Now().Unix()) + uinfo.DoubleLeftTimes-- + + SaveUserInfo(uinfo, strconv.Itoa(uuid)) + + resp.Data.LeftTimes = uinfo.DoubleLeftTimes + resp.Data.Coin.UserId = uuid + resp.Data.Coin.Coin = strconv.FormatInt(uinfo.Gold, 10) + accrate := uinfo.Goldrate * 3 + resp.Data.Coin.IcomeRate = strconv.FormatInt(accrate, 10) + resp.Data.Coin.UpdateTime = int(time.Now().Unix()) + resp.Code = 0 + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} -- libgit2 0.21.0