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 }