function.go 3.2 KB
package logic

import (
	"HttpServer/jsonconf"
	"HttpServer/redishandler"
	"common/logger"
	"common/redis"
	"encoding/json"
	"net/http"
	"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")
}

func SaveUserInfo(data *UserData) error {

	savestr, err := json.Marshal(data)
	if err != nil {
		return err
	}

	err = redishandler.GetRedisClient().HSet(redis.USER_DATA_KEY, data.Openid, string(savestr))

	return err
}

func GetUserInfo(openid string) (*UserData, error) {

	//先判断用户是否存在 不存在创建新的用户
	isexist, err := redishandler.GetRedisClient().HExists(redis.USER_DATA_KEY, openid)
	if err != nil {
		logger.Error("redis failed err=%v", err)
		return nil, err
	}

	tmp := new(UserData)
	if !isexist {
		//不存在
		//属于新登录的玩家数据
		err = tmp.InitUserInfo(openid)
	} else {
		//已经登陆过了 需要获取玩家数据
		data, err := redishandler.GetRedisClient().HGet(redis.USER_DATA_KEY, openid)
		if err != nil {
			return nil, err
		}

		err = json.Unmarshal([]byte(data), tmp)
		if err != nil {
			return nil, err
		}
	}

	return tmp, nil
}

func (u *UserData) InitUserInfo(openid string) error {
	nowtime := time.Now()
	u.Openid = openid
	u.SignRound = 1
	u.IsSign = 0
	u.LastGetTime = 0
	u.LeftCnt = DAILY_FETCH_CNT
	u.MaxLevel = 1
	u.Property = 0
	u.SingDay = 0
	u.TodaySec = int(time.Date(nowtime.Year(), nowtime.Month(), nowtime.Day(), 0, 0, 0, 0, nowtime.Location()).Unix())
	u.TotalFetchCnt = 0 //用于计算当前领取次数

	err := SaveUserInfo(u)
	if err != nil {
		logger.Error("InitUserInfo err=%v", err)
	}
	return err
}

//计算当前领取宝箱需要的数值
func (u *UserData) CalcCurLe() int64 {
	cfg := jsonconf.GetGoldChestConfig(u.TotalFetchCnt + 1)
	if cfg == nil {
		logger.Error("CalcCurLe failed u=%v", u)
		return 0
	}

	return cfg.Score
}

//计算速率
func (u *UserData) CalcSpeed() int64 {
	cfg := jsonconf.GetGoldGunsConfig(u.MaxLevel)
	if cfg == nil {
		logger.Error("CalcSpeed failed u=%v", u)
		return 0
	}
	return cfg.Speed
}

//计算物资
func (u *UserData) CalcProperty() {
	nowtime := int(time.Now().Unix())
	if nowtime < u.LastGetTime {
		logger.Error("CalcProperty err n=%v,l=%v", nowtime, u.LastGetTime)
	} else if nowtime >= u.LastGetTime+60*3 {
		//超过三次请求了 不再计算离线收益

	} else {
		//计算一下离线收益
		mult := nowtime - u.LastGetTime
		speed := u.CalcSpeed()
		u.Property += int64(mult) * speed
	}
	u.LastGetTime = nowtime

	//判断跨天
	if nowtime < u.TodaySec {
		logger.Error("CalcProperty err2")
		nowtt := time.Now()
		u.TodaySec = int(time.Date(nowtt.Year(), nowtt.Month(), nowtt.Day(), 0, 0, 0, 0, nowtt.Location()).Unix())
	} else {
		if nowtime > u.TodaySec+86400 {
			//跨天了
			nowtt := time.Now()
			u.TodaySec = int(time.Date(nowtt.Year(), nowtt.Month(), nowtt.Day(), 0, 0, 0, 0, nowtt.Location()).Unix())
			u.LeftCnt = DAILY_FETCH_CNT
			u.IsSign = 0
			if u.SingDay == 7 {
				u.SingDay = 0
				u.SignRound++
			}
		}
	}
	//保存
	err := SaveUserInfo(u)
	if err != nil {
		logger.Error("CalcProperty err=%v", err)
	}
}