go_dreamfactory/modules/user/model_user.go
2022-12-05 16:09:13 +08:00

259 lines
6.8 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/sys/configure"
cfg "go_dreamfactory/sys/configure/structs"
"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"
"go.mongodb.org/mongo-driver/x/bsonx"
)
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)
// 通过uid创建索引
this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}},
})
this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
Keys: bsonx.Doc{{Key: "name", Value: bsonx.Int32(1)}},
})
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 := configure.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.Errorf("GetUser uid:%v err:%v",uid,err)
// return
// }
if this.module.IsCross() {
if model, err := this.module.GetDBModuleByUid(uid, this.TableName, this.Expired); err != nil {
this.module.Errorln(err)
} else {
if err = model.Get(uid, user); err != nil {
this.module.Errorf("err:%v", err)
}
}
} else {
if err := this.Get(uid, user); err != nil {
this.module.Errorf("err:%v", err)
}
}
return
}
//设置属性
func (this *ModelUser) updateUserAttr(uid string, data map[string]interface{}) error {
if this.module.IsCross() {
if model, err := this.module.GetDBModuleByUid(uid, this.TableName, this.Expired); err != nil {
this.module.Errorln(err)
} else {
if err = model.Change(uid, data); err != nil {
this.module.Errorf("err:%v", err)
}
}
} else {
return this.Change(uid, data)
}
return nil
}
//是否今天首次登录
func (this *ModelUser) isLoginFirst(timestamp int64) bool {
now := configure.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.DelByUId(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) updateOfflineTime(uid string) {
if err := this.updateUserAttr(uid, map[string]interface{}{"offlinetime": configure.Now().Unix()}); err != nil {
this.module.Errorln(err)
}
}
// change exp
func (this *ModelUser) ChangeExp(event interface{}, next func(event interface{})) {
ul := event.(*UserListen)
// TODO nothing
next(ul)
}
//change level
func (this *ModelUser) ChangeLevel(event interface{}, next func(event interface{})) {
ul := event.(*UserListen)
curLv := ul.lv
//下一等级配置
nextLvConf := this.module.configure.GetPlayerlvConf(curLv + 1)
var (
rewards []*cfg.Gameatn
curExp int64
)
curExp = ul.exp
for nextLvConf != nil && curExp >= int64(nextLvConf.Exp) {
curExp = curExp - int64(nextLvConf.Exp)
curLv++
//叠加奖励
rewards = append(rewards, nextLvConf.Reward...)
nextLvConf = this.module.configure.GetPlayerlvConf(curLv + 1)
}
// 最大等级经验封顶
curLvConf := this.module.configure.GetPlayerlvConf(curLv)
if curExp > int64(curLvConf.Exp) {
if nextLvConf == nil {
curExp = int64(curLvConf.Exp)
}
}
// 等级有递增时再更新
if curLv > ul.lv {
update := map[string]interface{}{
"lv": curLv,
"exp": curExp,
}
if err := this.module.modelUser.Change(ul.session.GetUserId(), update); err != nil {
this.module.Error("玩家等级经验更新", log.Fields{"uid": ul.session.GetUserId(), "exp": curExp, "lv": curLv})
return
}
if err := ul.session.SendMsg(string(this.module.GetType()), UserSubTypeLvChangedPush,
&pb.UserLvChangedPush{Uid: ul.session.GetUserId(), Exp: curExp, Lv: curLv}); err != nil {
this.module.Error("玩家等级变化 UserSubTypeLvChangedPush推送失败", log.Fields{"uid": ul.session.GetUserId(), "exp": curExp, "lv": curLv})
}
if code := this.module.DispenseRes(ul.session, rewards, true); code != pb.ErrorCode_Success {
this.module.Error("资源发放", log.Fields{"uid": ul.session.GetUserId(), "rewards": rewards})
}
mc, err := this.module.service.GetModule(comm.ModuleChat)
if err != nil {
return
}
if chat, ok := mc.(comm.IChat); ok {
chat.SendSysChatToUser(ul.session, comm.ChatSystem12, curLv, 0, ul.name)
}
} else {
if nextLvConf == nil {
update := map[string]interface{}{
"exp": curExp,
}
if err := this.module.modelUser.Change(ul.session.GetUserId(), update); err != nil {
this.module.Error("玩家经验更新", log.Fields{"uid": ul.session.GetUserId(), "exp": curExp, "lv": curLv})
return
}
if err := ul.session.SendMsg(string(this.module.GetType()), "reschanged",
&pb.UserResChangedPush{Exp: curExp}); err != nil {
this.module.Error("玩家经验变化 UserResChangedPush推送失败", log.Fields{"uid": ul.session.GetUserId(), "exp": curExp, "lv": curLv})
}
}
}
}
//玩家信息监听
type UserListen struct {
event_v2.Event
session comm.IUserSession
exp int64
lv int32
name string
}