logic.go 3.8 KB
package logic

import (
	"HttpServer/redishandler"
	"common/logger"
	"common/redis"
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"time"
)

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.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.Leftredbagcnt = data.WatchAddsTime

	return nil
}