package db import ( "errors" cherryApp "f1-game/internal/cherry_app" dbFacade "f1-game/internal/component/db/facade" nameDB "f1-game/internal/name/db" ctime "github.com/cherry-game/cherry/extend/time" clog "github.com/cherry-game/cherry/logger" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" ) type ( // NodeTable 节点信息表,记录当前节点全局信息 NodeTable struct { NodeID string `bson:"NodeID,omitempty"` FirstStartTime int64 `bson:"FirstStartTime,omitempty"` LastStartTime int64 `bson:"LastStartTime,omitempty"` dbFacade.TableBase `bson:",inline"` } ) func (p *NodeTable) TableName() string { return nameDB.Table_Node } func (p *NodeTable) PrimaryValue() any { return p.NodeID } func (p *NodeTable) CheckField() { } func (p *NodeTable) Save2Queue() { save2Queue(p) } // IsFirstTime 是否为首次开服 func (p *NodeTable) IsFirstTime() bool { return p.FirstStartTime > 0 && p.FirstStartTime == p.LastStartTime } func NodeIsFirstTime() bool { nodeTable, _ := GetNodeTable(cherryApp.NodeID()) return nodeTable.IsFirstTime() } func GetNodeTable(nodeID string) (*NodeTable, bool) { if val, ok := nodeTableCache.GetIfPresent(nodeID); ok { return val.(*NodeTable), true } nodeTable, found := GetNodeTableFromDB(nodeID) nodeTableCache.Put(nodeID, nodeTable) return nodeTable, found } func nodeCheck() { nodeTable, found := GetNodeTable(cherryApp.NodeID()) if !found { now := ctime.Now().ToMillisecond() nodeTable.FirstStartTime = now nodeTable.LastStartTime = now } else { nodeTable.LastStartTime = ctime.Now().ToMillisecond() } nodeTable.Save2Queue() } func GetNodeTableFromDB(nodeID string) (*NodeTable, bool) { table := newNodeTable(nodeID) filter := bson.M{ nameDB.Field_NodeID: table.NodeID, } err := dbComponent.FindOne(table, filter) if err != nil { if errors.Is(err, mongo.ErrNoDocuments) { clog.Warnf("[nodeID = %s] not found, create new one", nodeID) return table, false } clog.Errorf("[nodeID = %s] db error = %v", nodeID, err) return table, false } table.CheckField() return table, true } func newNodeTable(nodeID string) *NodeTable { return &NodeTable{ NodeID: nodeID, FirstStartTime: 0, LastStartTime: 0, } }