package db import ( "errors" cherryApp "f1-game/internal/cherry_app" dbFacade "f1-game/internal/component/db/facade" nameDB "f1-game/internal/name/db" dbHero "f1-game/nodes/game/internal/db/data/hero" clog "github.com/cherry-game/cherry/logger" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" ) type ( // HeroTable 英雄表 HeroTable struct { PlayerID int64 `bson:"PlayerID,omitempty"` NodeID string `bson:"NodeID,omitempty"` dbHero.Data `bson:"Data,omitempty"` dbFacade.TableBase `bson:",inline"` } ) func (p *HeroTable) TableName() string { return nameDB.Table_Hero } func (p *HeroTable) PrimaryValue() any { return p.PlayerID } func (p *HeroTable) CheckField() { if p.Heroes == nil { p.Heroes = make(dbHero.Heroes) } } func (p *HeroTable) Save2Queue() { save2Queue(p) } func GetHeroTable(playerID int64) *HeroTable { if val, ok := heroTableCache.GetIfPresent(playerID); ok { return val.(*HeroTable) } heroTable := GetHeroTableFromDB(playerID) heroTableCache.Put(playerID, heroTable) return heroTable } func GetHeroTableFromDB(playerID int64) *HeroTable { table := newHeroTable(playerID) filter := bson.M{ nameDB.Field_NodeID: table.NodeID, nameDB.Field_PlayerID: table.PlayerID, } err := dbComponent.FindOne(table, filter) if err != nil { if errors.Is(err, mongo.ErrNoDocuments) { clog.Warnf("[playerID = %d] not found, create new one", playerID) return table } clog.Errorf("[playerID = %d] db error = %v", playerID, err) return table } table.CheckField() return table } func newHeroTable(playerID int64) *HeroTable { return &HeroTable{ PlayerID: playerID, NodeID: cherryApp.NodeID(), Data: dbHero.NewData(), } } //func (p *HeroTable) TeamHeroIDList() []int32 { // ids := make([]int32, 0, len(p.Teams)) // for _, heroID := range p.Teams { // ids = append(ids, heroID) // } // // return ids //} //func (p *HeroTable) TeamLevel() int32 { // level := int32(0) // for _, heroID := range p.Teams { // if hero, ok := p.Heroes.Get(heroID); ok { // level += hero.Level // } // } // // return level //}