package logic import ( "HttpServer/conf" "HttpServer/jsonconf" "HttpServer/redishandler" "bytes" "common/logger" "common/redis" "crypto/md5" "encoding/hex" "encoding/json" "errors" "io/ioutil" "math/rand" "net/http" "sort" "strconv" "time" ) 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,Gameid,Channel") } func (u *UserData) IsRedIdInList(id int) bool { for _, v := range u.RedBagFetchIdlist { if v == id { return true } } return false } 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.Task.GetGuanGold = 0 u.Task.GetRedbagCnt = 0 u.Task.OnlineMin = 0 u.Task.PassLevel = 0 u.Task.UseItemCnt = 0 u.Task.PlaySmall = 0 u.RedBagFetchIdlist = u.RedBagFetchIdlist[:0] u.LuckyBagLeftTimes = LUCKYBAGDAYLIMIT u.FreeTicket = FREETICKETCOUNT u.Ticket = TICKETCOUNT err := InitTaskAndAchievement(uuid, channel) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) } //签到数据处理 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 (udata *UserData) AddToRank() error { err := redishandler.GetRedisClient().Zadd(redis.USER_SCORE_RANK, float64(udata.HighScore), udata.Userid) if err != nil { logger.Error("AddToRank failed err=%v", err) } return err } 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 := conf.GetCoinConf().Host + 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 GetCoinFromSdk(uuid int, gameid string, channel string) (int, error) { SERVERKEY := conf.GetCoinConf().Key /*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 } //1任务 2成就 func GetTaskInfo(uuid int, tasktype int, channel string) (*TaskList, error) { unqiueuuid := strconv.Itoa(uuid) + channel 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 if tasktype == 2 { data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid) //成就这一块需要兼容老的数据 if err != nil { //没有读到数据 则去读取一下老的id olddata, err := redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid)) if err == nil { err = redishandler.GetRedisClient().HSet(redis.USER_ACHIEVEMENTINFO_LIST, unqiueuuid, olddata) if err == nil { //删除老的数据 以后都走新的数据 err = redishandler.GetRedisClient().HDel(redis.USER_ACHIEVEMENTINFO_LIST, strconv.Itoa(uuid)) logger.Info("GetTaskInfo uuid=%v do set", uuid) } data, err = redishandler.GetRedisClient().HGet(redis.USER_ACHIEVEMENTINFO_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, channel string) error { unqiueid := strconv.Itoa(uuid) + channel //先初始化任务 tlist, err := GetTaskInfo(uuid, 1, channel) if tlist == nil { tasklist := new(TaskList) for _, val := range jsonconf.GetJsonConf().TaskConfig { 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().TaskConfig { 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 } } //成就 alist, err := GetTaskInfo(uuid, 2, channel) if alist == nil { achievelist := new(TaskList) for _, val := range jsonconf.GetJsonConf().AchieventConfig { var tmp TaskListDesc tmp.Taskstatus = 1 tmp.Taskid = val.Id tmp.Taskprogress = 0 achievelist.Taskdata = append(achievelist.Taskdata, tmp) } err = SaveTaskInfo(unqiueid, 2, achievelist) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) return err } } else { for _, val := range jsonconf.GetJsonConf().AchieventConfig { if !alist.IsInTaskList(val.Id) { var tmp TaskListDesc tmp.Taskstatus = 1 tmp.Taskid = val.Id tmp.Taskprogress = 0 alist.Taskdata = append(alist.Taskdata, tmp) } } err = SaveTaskInfo(unqiueid, 2, alist) if err != nil { logger.Error("InitTaskAndAchievement err=%v", err) return err } } return nil } func InitUserInfo(resp *UserLoginResp, uniqueuid, gameid, channel string, uuid int) error { var initdata UserData initdata.Lv = 1 initdata.LvRewardGet = 0 initdata.Exp = 0 initdata.Userid = uniqueuid initdata.ContinueLoginDay = 1 initdata.SumLoginDay = 1 initdata.GetFromGuanCnt = 0 initdata.GuanGold = 0 initdata.LastLoginTime = int(time.Now().Unix()) goldnum, _ := GetCoinFromSdk(uuid, gameid, channel) initdata.RealGold = goldnum initdata.WatchAddsTime = WATCH_ADD_DAY_LIMIT initdata.LeftFreeRB = FREE_REDBAG_NUM initdata.UpLvCostTime = 0 initdata.UpLvCostTimeSec = int(time.Now().Unix()) initdata.NickName = "著名沙雕" initdata.HeadUrl = "1" initdata.RegTime = int(time.Now().Unix()) initdata.LuckyBagLeftTimes = LUCKYBAGDAYLIMIT initdata.FreeTicket = FREETICKETCOUNT initdata.Ticket = TICKETCOUNT 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 } if val.Id == 1 { tmp.Preisfind = 1 } else { tmp.Preisfind = 0 } tmp.Day = val.Login_day initdata.WithDraw.Cashdata = append(initdata.WithDraw.Cashdata, tmp) } resp.Data.Guangold = initdata.GuanGold resp.Data.Walletgold = initdata.RealGold resp.Data.Isnew = 1 err := SaveUserInfo(&initdata, uniqueuid) if err != nil { logger.Error("InitUserInfo err=%v", err) return err } //初始化一下玩家的任务与成就数据数据 err = InitTaskAndAchievement(uuid, channel) return err } func SaveUserInfo(data *UserData, uniqueid string) error { savestr, err := json.Marshal(data) if err != nil { return err } err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, string(savestr)) return err } func GetUserInfo(uniqueid string) (*UserData, error) { data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, uniqueid) if err != nil { return nil, err } var tmp UserData err = json.Unmarshal([]byte(data), &tmp) if err != nil { return nil, err } return &tmp, nil } func SaveUserSelfData(uniqueid, savedata string) error { err := redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, uniqueid, savedata) return err } func GetUserSelfData(uniqueid string) (string, error) { data, err := redishandler.GetRedisClient().HGet(redis.USER_SELF_DATA_KEY, uniqueid) if err != nil { return "", err } return data, nil } func AddCoinToSdk(uuid int, goldnum int, gameid string, channel string, atype int) (int, error) { SERVERKEY := conf.GetCoinConf().Key /*if gameid == "1015" { SERVERKEY = XIAOXINGXING_SERVERKEYTEST_1015 }*/ 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, err } if resp.Code != "0" { gold, _ := GetCoinFromSdk(uuid, gameid, channel) logger.Error("AddCoinToSdk failed=%v", resp.Msg) return gold, err } return resp.Data.Mycoin, nil } //计算转盘抽奖 func CalcTurnTableNum() int { rtnum := 0 sumrate := 0 tmprate := 0 idx := -1 rand.Seed(time.Now().UnixNano()) randnum := rand.Intn(100) cflist := jsonconf.GetJsonConf().TrunTableConfig for _, vv := range cflist { sumrate += vv.Rate } logger.Info("CalcTurnTableNum sumrate=%v,randnum=%v,cflist=%+v", sumrate, randnum, cflist) for k, v := range cflist { tmprate += int(v.Rate * 100 / sumrate) logger.Info("CalcTurnTableNum tmprate=%v", tmprate) if tmprate >= randnum { idx = k break } } if idx == -1 { if len(cflist) > 0 { rtnum = cflist[0].Desc } } else { rtnum = cflist[idx].Desc } return rtnum } //计算福袋金额 func CalcLuckYBagNum() int { rtnum := 0 sumrate := 0 tmprate := 0 idx := -1 rand.Seed(time.Now().UnixNano()) randnum := rand.Intn(100) cflist := jsonconf.GetJsonConf().LuckyBagConfig for _, vv := range cflist { sumrate += vv.Rate } logger.Info("CalcLuckYBagNum sumrate=%v,randnum=%v,cflist=%+v", sumrate, randnum, cflist) for k, v := range cflist { tmprate += int(v.Rate * 100 / sumrate) logger.Info("DrawTable tmprate=%v", tmprate) if tmprate >= randnum { idx = k break } } if idx == -1 { if len(cflist) > 0 { rtnum = cflist[0].Coin } } else { rtnum = cflist[idx].Coin } return rtnum }