go_dreamfactory/modules/user/api_login.go

186 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
}
}
// 初始化随机任务数据
// TODO: 判断次功能开启时再初始化
go 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
}