go_dreamfactory/modules/user/login_comp.go
2022-06-07 18:14:49 +08:00

104 lines
2.4 KiB
Go

package user
import (
"context"
"encoding/base64"
"go_dreamfactory/comm"
"go_dreamfactory/modules"
"go_dreamfactory/pb"
"go_dreamfactory/sys/cache"
"go_dreamfactory/sys/db"
"go_dreamfactory/utils"
"time"
"github.com/liwei1dao/lego/sys/event"
"github.com/liwei1dao/lego/sys/log"
"github.com/tidwall/gjson"
"go.mongodb.org/mongo-driver/mongo"
)
type LoginComp struct {
modules.MComp_GateComp
}
func DecodeUserData(base64Str string) *pb.DB_UserData {
//解码
dec, err := base64.StdEncoding.DecodeString(base64Str[35:])
if err != nil {
log.Errorf("base64 decode err %v", err)
return nil
}
now := time.Now().Unix()
jsonRet := gjson.Parse(string(dec))
serverId := jsonRet.Get("serverId").Int()
timestamp := jsonRet.Get("timestamp").Int()
if now-time.Unix(timestamp, 0).Unix() > 100 {
return nil
}
account := jsonRet.Get("account").String()
return &pb.DB_UserData{
ServerId: int32(serverId),
Account: account,
}
}
//登录
func (this *LoginComp) Login(ctx context.Context, session comm.IUserSession, req *pb.UserLoginReq) error {
log.Debugf("User - Login: session:%v rsp:%v", session.ToString(), req)
var code pb.ErrorCode = pb.ErrorCode_Success
if !utils.ValidSecretKey(req.Sec) {
session.SendMsg("user", "login", pb.ErrorCode_SecKeyInvalid, nil)
return nil
}
user := DecodeUserData(req.Sec)
db_user, err := db.Defsys.User_FindUserByAccount(user)
if err != nil {
if err != mongo.ErrNoDocuments {
return err
}
}
//如果是新玩家,创建一条基础的数据,页面会引导进入创角页面
if db_user == nil {
err = db.Defsys.User_CreateUser(user)
if err != nil {
log.Errorf("User_CreateUser err %v", err)
return err
}
session.Build(user.UserId)
} else {
session.Build(db_user.UserId)
}
cache_user := &pb.Cache_UserData{
SessionId: session.GetSessionId(),
GatewayServiceId: session.GetGatewayServiceId(),
UserData: db_user,
}
err = cache.Defsys.Update(cache_user)
if err != nil {
log.Errorf("update cache err:%v", err)
return err
}
err = session.SendMsg("user", "login", code, &pb.UserLoginResp{
Data: &pb.Cache_UserData{
UserData: db_user,
},
})
if err != nil {
return err
}
event.TriggerEvent(comm.Event_UserLogin, db_user.UserId)
return nil
}
//注销
func (this *LoginComp) Logout(ctx context.Context, session comm.IUserSession, rsp *pb.UserLoginReq) error {
log.Debugf("User - Logout: session:%v rsp:%v", session.ToString(), rsp)
return nil
}