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 }