go_dreamfactory/modules/user/api_login.go
2023-09-11 17:39:46 +08:00

182 lines
5.0 KiB
Go

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
tasks []*pb.BuriedParam = make([]*pb.BuriedParam, 0)
)
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 isession, ok := this.module.ModuleBase.GetUserSession(user.Uid); ok {
isession.SendMsg(string(this.module.GetType()), "othertermlogin", &pb.UserOtherTermLoginPush{Uid: user.Uid})
isession.SyncPush()
isession.UnBind()
this.module.PutUserSession(isession)
}
}
//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(),
Message: err.Error(),
}
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(),
Message: err.Error(),
}
return
}
// 在logintime更新前判断是否是昨天
if utils.IsYestoday(user.Logintime) {
tasks = append(tasks, 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())))
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype8, 1))
this.module.modelExpand.updateLoginDay(user.Uid, lastLoginTime)
// 清理点赞
this.module.ModuleFriend.ResetFriend(user.Uid)
this.module.modelSign.UserSign(session)
this.module.ModuleItems.InitItemBagData(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)
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype8, 1))
}
this.module.ModuleHero.CheckPeachReward(session, user.Ctime)
// this.module.RecoverUserPsStart(user.Uid)
// 日常登录任务
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype7, 1))
tasks = append(tasks, comm.GetBuriedParam(comm.Rtype230, 1, int32(configure.Now().Weekday())))
this.module.ModulePrivilege.CheckDailyPrivilegeMail(session)
rsp.Data = user
rsp.TimeNow = configure.Now().Unix() // 设置服务器时间
session.SendMsg(string(this.module.GetType()), UserSubTypeLogin, rsp)
if len(tasks) > 0 {
go this.module.ModuleBuried.TriggerBuried(session.Clone(), tasks...)
}
event.TriggerEvent(comm.EventUserLogin, session.Clone())
return
}