185 lines
4.8 KiB
Go
185 lines
4.8 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/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.Errorf("User_FindByAccount err %v", err)
|
|
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.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.modelSign.checkResetSignData(session)
|
|
|
|
//this.Sign(session, &pb.UserSignReq{})
|
|
// 检查特权 并发送每日邮件
|
|
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
|
|
}
|