package user import ( "go_dreamfactory/comm" "go_dreamfactory/lego/sys/log" "go_dreamfactory/pb" "go_dreamfactory/sys/configure" "go_dreamfactory/utils" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "google.golang.org/protobuf/proto" ) //参数校验 func (this *apiComp) LoginCheck(session comm.IUserSession, req *pb.UserLoginReq) (code pb.ErrorCode) { if req.Account == "" { code = pb.ErrorCode_ReqParameterError } return } //登录 func (this *apiComp) Login(session comm.IUserSession, req *pb.UserLoginReq) (code pb.ErrorCode, data proto.Message) { if code = this.LoginCheck(session, req); code != pb.ErrorCode_Success { return } var ( err error user *pb.DBUser ) rsp := &pb.UserLoginResp{} defer func() { if user != nil && code == pb.ErrorCode_Success { rsp.Data = user rsp.TimeNow = configure.Now().Unix() // 设置服务器时间 err = session.SendMsg(string(this.module.GetType()), UserSubTypeLogin, rsp) if err != nil { code = pb.ErrorCode_SystemError return } } }() //从mgo查询user user, err = this.module.modelUser.FindByAccount(req.Sid, req.Account) if err != nil { if err != mongo.ErrNoDocuments { log.Error("User_FindByAccount", log.Fields{"sid": req.Sid, "account": req.Account, "err": err.Error()}) return } } var isNewUser bool if user == nil { //如果是新玩家,创建一条基础的数据,页面会引导进入创角页面 user = &pb.DBUser{ Sid: req.Sid, Binduid: req.Account, Lastloginip: session.GetIP(), } err = this.module.modelUser.User_Create(user) if err != nil { log.Errorf("User_CreateUser err %v", err) return } //初始化任务 go this.module.ModuleTask.InitTaskAll(user.Uid) 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 { this.module.Errorf("user bind err:%v", err) code = pb.ErrorCode_BindUser return } //缓存user session err = this.module.modelSession.addUserSession(user.Uid, session) if err != nil { this.module.Errorf("set user session err:%v", err) code = pb.ErrorCode_UserSessionNobeing return } //不是新账号 if !isNewUser { lastLoginTime := user.Logintime user.Logintime = configure.Now().Unix() user.Lastloginip = session.GetIP() user.Offlinetime = 0 update := utils.StructToMap(user) err = this.module.modelUser.Change(user.Uid, update) if err != nil { code = pb.ErrorCode_DBError return } if this.module.modelUser.isLoginFirst(lastLoginTime) { this.module.ModuleHero.NoLoginDay(user.Uid, int32(utils.DiffDays(lastLoginTime, configure.Now().Unix()))) this.module.modelExpand.updateLoginDay(user.Uid, lastLoginTime) //清空日常 this.module.ModuleTask.ResetTask(user.Uid, comm.TASK_DAILY) this.module.ModuleTask.InitTaskByTag(user.Uid, comm.TASK_DAILY) //清周常 if utils.IsAfterWeek(lastLoginTime) { this.module.ModuleTask.ResetTask(user.Uid, comm.TASK_WEEKLY) this.module.ModuleTask.InitTaskByTag(user.Uid, comm.TASK_WEEKLY) } // 清理点赞 this.module.ModuleFriend.ResetFriend(user.Uid) } rsp.Data = user // 查询玩家扩展数据 if expand, err := this.module.GetUserExpand(session.GetUserId()); err != nil { if err != mongo.ErrNoDocuments { code = pb.ErrorCode_DBError return } } else { rsp.Ex = expand } } // 初始化随机任务数据 this.module.ModuleRtask.InitCondiData(user.Uid) // 日常登录任务 this.module.ModuleRtask.SendToRtask(session, comm.Rtype7, 1) // 检查特权 并发送每日邮件 this.module.ModulePrivilege.QueryPrivilege(session) //推送登录公告 this.chat.SendSysChatToUser(session, comm.UserLoginNotice, 0) mail := &pb.DBMailData{ ObjId: primitive.NewObjectID().Hex(), Uid: user.Uid, Title: "system mail", Contex: "Congratulations on getting a login exclusive gift pack", CreateTime: uint64(configure.Now().Unix()), DueTime: uint64(configure.Now().Unix()) + 30*24*3600, // 30天需要走配置文件 Check: false, Reward: false, } // fj := make([]*pb.UserAssets, 0) // atn1 := &pb.UserAssets{ // A: "hero", // T: "25001", // N: 1, // } // atn2 := &pb.UserAssets{ // A: "attr", // T: "gold", // N: 10000, // } // fj = append(fj, atn1) // fj = append(fj, atn2) // mail.Items = fj this.mail.CreateNewMail(session, mail) return }