157 lines
4.2 KiB
Go
157 lines
4.2 KiB
Go
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/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
|
|
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(),
|
|
}
|
|
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)
|
|
this.module.api.Sign(session, nil)
|
|
}
|
|
|
|
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
|
|
}
|
|
} else {
|
|
rsp.Ex = &pb.DBUserExpand{}
|
|
}
|
|
|
|
this.module.RecoverUserPsStart(user.Uid)
|
|
// 日常登录任务
|
|
// this.module.ModuleRtask.SendToRtask(session, comm.Rtype8, 1)
|
|
go this.module.ModuleRtask.TriggerTask(session.GetUserId(), comm.GettaskParam(comm.Rtype8, 1))
|
|
this.module.ModulePrivilege.CheckDailyPrivilegeMail(session)
|
|
|
|
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
|
|
}
|
|
|
|
return
|
|
}
|