199 lines
4.6 KiB
Go
199 lines
4.6 KiB
Go
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/core"
|
|
event_v2 "go_dreamfactory/lego/sys/event/v2"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/modules"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/utils"
|
|
"time"
|
|
|
|
uuid "github.com/satori/go.uuid"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
)
|
|
|
|
type ModelUser struct {
|
|
modules.MCompModel
|
|
module *User
|
|
eventApp *event_v2.App
|
|
}
|
|
|
|
func (this *ModelUser) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
|
|
this.TableName = comm.TableUser
|
|
err = this.MCompModel.Init(service, module, comp, options)
|
|
this.module = module.(*User)
|
|
this.eventApp = event_v2.NewApp()
|
|
this.eventApp.Listen(comm.EventUserChanged, this.ChangeExp)
|
|
this.eventApp.Listen(comm.EventUserChanged, this.ChangeLevel)
|
|
return
|
|
}
|
|
|
|
func (this *ModelUser) FindByAccount(sid string, account string) (*pb.DBUser, error) {
|
|
filter := bson.M{
|
|
"sid": sid,
|
|
"binduid": account,
|
|
}
|
|
sr := this.DB.FindOne(comm.TableUser, filter)
|
|
var nd *pb.DBUser
|
|
err := sr.Decode(&nd)
|
|
return nd, err
|
|
}
|
|
|
|
//查询昵称
|
|
func (this *ModelUser) NickNameIsExist(name string) bool {
|
|
if err := this.DB.FindOne(comm.TableUser, bson.M{"name": name}).Err(); err != nil {
|
|
if err == mongo.ErrNoDocuments { //无记录
|
|
return true
|
|
}
|
|
|
|
}
|
|
return false
|
|
}
|
|
|
|
//创建初始用户
|
|
func (this *ModelUser) User_Create(user *pb.DBUser) (err error) {
|
|
now := time.Now().Unix()
|
|
_id := primitive.NewObjectID().Hex()
|
|
user.Id = _id
|
|
user.Uid = fmt.Sprintf("%s_%s", user.Sid, _id)
|
|
user.Uuid = uuid.NewV4().String()
|
|
user.Lv = 1 //初始等级
|
|
user.Ctime = now
|
|
user.Logintime = now
|
|
return this.Add(user.Uid, user)
|
|
}
|
|
|
|
//获取用户
|
|
func (this *ModelUser) GetUser(uid string) (user *pb.DBUser) {
|
|
user = &pb.DBUser{}
|
|
if err := this.Get(uid, user); err != nil {
|
|
this.module.Errorln(err)
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
//设置属性
|
|
func (this *ModelUser) updateUserAttr(uid string, data map[string]interface{}) error {
|
|
return this.Change(uid, data)
|
|
}
|
|
|
|
//是否今天首次登录
|
|
func (this *ModelUser) isLoginFirst(timestamp int64) bool {
|
|
now := time.Now()
|
|
if timestamp == 0 || timestamp > now.Unix() {
|
|
this.module.Debugf("lastlogin time great now")
|
|
return false
|
|
}
|
|
tt := time.Unix(timestamp, 0)
|
|
if !utils.IsToday(timestamp) {
|
|
if tt.Before(now) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
//删除用户数据
|
|
func (this *ModelUser) delete(uid string) {
|
|
if err := this.Del(uid); err != nil {
|
|
log.Errorf("%v", err)
|
|
}
|
|
}
|
|
|
|
// 修改玩家名字
|
|
func (this *ModelUser) modifyName(uid string, newName string) (code pb.ErrorCode) {
|
|
user := this.GetUser(uid)
|
|
|
|
if user == nil {
|
|
code = pb.ErrorCode_UserSessionNobeing
|
|
return
|
|
}
|
|
|
|
// 修改名称
|
|
update := map[string]interface{}{
|
|
"name": newName,
|
|
}
|
|
|
|
if err := this.Change(uid, update); err != nil {
|
|
code = pb.ErrorCode_DBError
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// 初始化玩家形象
|
|
func (this *ModelUser) InitFigure(uid string) {
|
|
figureMap := make(map[int32]interface{})
|
|
for _, v := range this.module.configure.GetPlayerFigureConf() {
|
|
|
|
figure := &pb.Figure{
|
|
Hair: &pb.Hair{Color: v.Figure[0].Color},
|
|
Eyes: &pb.Eyes{Color: v.Figure[0].Color},
|
|
Mouth: &pb.Mouth{},
|
|
Body: &pb.Body{},
|
|
Complexion: &pb.Complexion{},
|
|
}
|
|
|
|
figureMap[v.Id] = figure
|
|
}
|
|
|
|
update := map[string]interface{}{
|
|
"preinstall": figureMap,
|
|
}
|
|
this.module.modelExpand.ChangeUserExpand(uid, update)
|
|
}
|
|
|
|
func (this *ModelUser) updateOfflineTime(uid string) {
|
|
if err := this.updateUserAttr(uid, map[string]interface{}{"offlinetime": time.Now().Unix()}); err != nil {
|
|
this.module.Errorln(err)
|
|
}
|
|
}
|
|
|
|
// change exp
|
|
func (this *ModelUser) ChangeExp(event interface{}, next func(event interface{})) {
|
|
ul := event.(*UserListen)
|
|
// TODO
|
|
next(ul)
|
|
}
|
|
|
|
//change level
|
|
func (this *ModelUser) ChangeLevel(event interface{}, next func(event interface{})) {
|
|
ul := event.(*UserListen)
|
|
curLv := ul.lv
|
|
curLvConf := this.module.configure.GetPlayerlvConf(curLv)
|
|
nextLvConf := this.module.configure.GetPlayerlvConf(curLv + 1)
|
|
if curLvConf.Exp == 0 || nextLvConf == nil { //最大等级
|
|
next(ul)
|
|
return
|
|
}
|
|
|
|
if ul.exp > curLvConf.Exp && ul.exp <= nextLvConf.Exp {
|
|
ul.lv++
|
|
// 更新等级
|
|
update := map[string]interface{}{
|
|
"lv": ul.lv,
|
|
}
|
|
this.module.modelUser.Change(ul.session.GetUserId(), update)
|
|
ul.session.SendMsg(string(this.module.GetType()),
|
|
UserSubTypeLvChangedPush,
|
|
&pb.UserChangedPush{Uid: ul.session.GetUserId(), Exp: ul.exp, Lv: ul.lv})
|
|
}
|
|
|
|
}
|
|
|
|
//玩家信息监听
|
|
type UserListen struct {
|
|
event_v2.Event
|
|
session comm.IUserSession
|
|
exp int32
|
|
lv int32
|
|
}
|