package user import ( "go_dreamfactory/comm" "go_dreamfactory/lego/sys/event" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" "go_dreamfactory/utils" "go.mongodb.org/mongo-driver/mongo" ) // 参数校验 func (this *apiComp) LoginCheck(session comm.IUserSession, req *pb.UserLoginReq) (errdata *pb.ErrorData) { if req.Account == "" { errdata = &pb.ErrorData{ Code: pb.ErrorCode_ReqParameterError, Title: pb.ErrorCode_ReqParameterError.ToString(), } } return } // 登录 func (this *apiComp) Login(session comm.IUserSession, req *pb.UserLoginReq) (errdata *pb.ErrorData) { if errdata = this.LoginCheck(session, req); errdata != nil { return } var ( err error user *pb.DBUser lastLoginTime int64 ) rsp := &pb.UserLoginResp{} //从mgo查询user user, err = this.module.modelUser.FindByAccount(req.Sid, req.Account) if err != nil { if err != mongo.ErrNoDocuments { log.Error("User_FindByAccount", log.Field{Key: "uid", Value: req.Sid}, log.Field{Key: "account", Value: req.Account}, log.Field{Key: "err", Value: err.Error()}, ) return } } var isNewUser bool if user == nil { //如果是新玩家,创建一条基础的数据,页面会引导进入创角页面 user = &pb.DBUser{ Sid: req.Sid, Binduid: req.Account, Lastloginip: session.GetIP(), Skins: make([]string, 0), Area: req.Area, Channel: req.Channel, Vcode: req.Vcode, Vname: req.Vname, } err = this.module.modelUser.User_Create(user) if err != nil { log.Errorf("User_CreateUser err %v", err) return } isNewUser = true } else { // 玩家是否已在线 if cu := this.module.modelSession.getUserSession(user.Uid); cu != nil { if cu.SessionId != "" { // 通知先登录的玩家并解绑 this.module.SendMsgToUser(string(this.module.GetType()), "othertermlogin", &pb.UserOtherTermLoginPush{Uid: cu.Uid}, cu.Uid) if isession, ok := this.module.ModuleBase.GetUserSession(cu.Uid); ok { if err := isession.UnBind(); err != nil { this.module.Errorf("解绑失败 uid:%v sessionId:%v err:%v", cu.Uid, cu.SessionId, err) } } } } } //bind user err = session.Bind(user.Uid, this.service.GetId()) if err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_BindUser, Title: pb.ErrorCode_BindUser.ToString(), } return } //缓存user session err = this.module.modelSession.addUserSession(user.Uid, session) if err != nil { this.module.Errorf("set user session err:%v", err) errdata = &pb.ErrorData{ Code: pb.ErrorCode_UserSessionNobeing, Title: pb.ErrorCode_UserSessionNobeing.ToString(), } return } // 在logintime更新前判断是否是昨天 if utils.IsYestoday(user.Logintime) { go this.module.ModuleBuried.TriggerBuried(session.Clone(), comm.GetBuriedParam(comm.Rtype9, 1)) } else { this.module.ModuleBuried.ResetBuriedByType(user.Uid, comm.Rtype9) } //不是新账号 if !isNewUser { lastLoginTime = user.Logintime user.Logintime = configure.Now().Unix() user.Lastloginip = session.GetIP() user.Offlinetime = 0 user.Area = req.Area user.Channel = req.Channel user.Vcode = req.Vcode user.Vname = req.Vname update := utils.StructToMap(user) //尽量不要更新整个数据 err = this.module.modelUser.Change(user.Uid, update) if err != nil { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } if this.module.modelUser.isLoginFirst(lastLoginTime) { this.module.ModuleHero.NoLoginDay(user.Uid, int32(utils.DiffDays(lastLoginTime, configure.Now().Unix()))) go this.module.ModuleBuried.TriggerBuried(session.Clone(), comm.GetBuriedParam(comm.Rtype8, 1)) this.module.modelExpand.updateLoginDay(user.Uid, lastLoginTime) // 清理点赞 this.module.ModuleFriend.ResetFriend(user.Uid) this.module.modelSign.UserSign(session) } // 判断昨日是否登录 rsp.Data = user // 查询玩家扩展数据 if expand, err := this.module.GetUserExpand(session.GetUserId()); err != nil { if err != mongo.ErrNoDocuments { errdata = &pb.ErrorData{ Code: pb.ErrorCode_DBError, Title: pb.ErrorCode_DBError.ToString(), Message: err.Error(), } return } } else { rsp.Ex = expand } } else { //新号 rsp.Ex = &pb.DBUserExpand{} this.module.modelSign.UserSign(session) go this.module.ModuleBuried.TriggerBuried(session.Clone(), comm.GetBuriedParam(comm.Rtype8, 1)) } // 转盘活动 if a, err := this.module.ModuleActivity.GetHdInfoByItype(pb.HdType_HdTypeTurntable); err != nil { // bEnd := false for _, v := range a { if configure.Now().Unix() > v.Etime { bEnd = true break } } if bEnd { // 活动结束 活动道具转换 t := this.module.ModuleTools.GetGlobalConf().VenturegiftsDraw var reward []*pb.UserAssets if item, err := this.module.configure.GetItemConfigureData(t); err != nil { amount := this.module.ModuleItems.QueryItemAmount(session.GetUserId(), t) if amount > 0 { this.module.ModuleItems.AddItem(session, t, -int32(amount), true) for _, v := range item.Sale { reward = append(reward, &pb.UserAssets{ A: v.A, T: v.T, N: v.N * int32(amount), }) } // 发邮件 this.mail.SendMailByCid(session, comm.Venturegifts, reward) // if err := this.module.DispenseRes(session, item.Sale, true); err != nil { // return // } } } } } this.module.ModuleHero.CheckPeachReward(session, user.Ctime) this.module.RecoverUserPsStart(user.Uid) // 日常登录任务 go this.module.ModuleBuried.TriggerBuried(session.Clone(), comm.GetBuriedParam(comm.Rtype7, 1)) this.module.ModulePrivilege.CheckDailyPrivilegeMail(session) rsp.Data = user rsp.TimeNow = configure.Now().Unix() // 设置服务器时间 session.SendMsg(string(this.module.GetType()), UserSubTypeLogin, rsp) event.TriggerEvent(comm.EventUserLogin, session.Clone()) return }