package db import ( "errors" cherryApp "f1-game/internal/cherry_app" dbFacade "f1-game/internal/component/db/facade" nameDB "f1-game/internal/name/db" dbItem "f1-game/nodes/game/internal/db/data/item" clog "github.com/cherry-game/cherry/logger" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" ) // ItemTable 道具表 type ItemTable struct { PlayerID int64 `bson:"PlayerID,omitempty"` NodeID string `bson:"NodeID,omitempty"` dbItem.Data `bson:"Data,omitempty"` dbFacade.TableBase `bson:",inline"` } func (*ItemTable) TableName() string { return nameDB.Table_Item } func (p *ItemTable) PrimaryValue() any { return p.PlayerID } // func (p *ItemTable) Filter() bson.M { // return bson.M{ // nameDB.Field_NodeID: p.NodeID, // nameDB.Field_PlayerID: p.PlayerID, // } // } func (p *ItemTable) CheckField() { p.Data.CheckField() } func (p *ItemTable) Save2Queue() { // TODO 后面去除 for _, item := range p.ItemMap { if item.Num < 1 { p.ItemMap.Remove(item.ItemID) } } save2Queue(p) } func GetItemTable(playerID int64) *ItemTable { if val, ok := itemTableCache.GetIfPresent(playerID); ok { return val.(*ItemTable) } itemTable := GetItemTableFromDB(playerID) itemTableCache.Put(playerID, itemTable) return itemTable } func GetItemTableFromDB(playerID int64) *ItemTable { table := newItemTable(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 newItemTable(playerID int64) *ItemTable { return &ItemTable{ PlayerID: playerID, NodeID: cherryApp.NodeID(), Data: dbItem.NewData(), } }