node_table.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package db
  2. import (
  3. "errors"
  4. cherryApp "f1-game/internal/cherry_app"
  5. dbFacade "f1-game/internal/component/db/facade"
  6. nameDB "f1-game/internal/name/db"
  7. ctime "github.com/cherry-game/cherry/extend/time"
  8. clog "github.com/cherry-game/cherry/logger"
  9. "go.mongodb.org/mongo-driver/v2/bson"
  10. "go.mongodb.org/mongo-driver/v2/mongo"
  11. )
  12. type (
  13. // NodeTable 节点信息表,记录当前节点全局信息
  14. NodeTable struct {
  15. NodeID string `bson:"NodeID,omitempty"`
  16. FirstStartTime int64 `bson:"FirstStartTime,omitempty"`
  17. LastStartTime int64 `bson:"LastStartTime,omitempty"`
  18. dbFacade.TableBase `bson:",inline"`
  19. }
  20. )
  21. func (p *NodeTable) TableName() string {
  22. return nameDB.Table_Node
  23. }
  24. func (p *NodeTable) PrimaryValue() any {
  25. return p.NodeID
  26. }
  27. func (p *NodeTable) CheckField() {
  28. }
  29. func (p *NodeTable) Save2Queue() {
  30. save2Queue(p)
  31. }
  32. // IsFirstTime 是否为首次开服
  33. func (p *NodeTable) IsFirstTime() bool {
  34. return p.FirstStartTime > 0 && p.FirstStartTime == p.LastStartTime
  35. }
  36. func NodeIsFirstTime() bool {
  37. nodeTable, _ := GetNodeTable(cherryApp.NodeID())
  38. return nodeTable.IsFirstTime()
  39. }
  40. func GetNodeTable(nodeID string) (*NodeTable, bool) {
  41. if val, ok := nodeTableCache.GetIfPresent(nodeID); ok {
  42. return val.(*NodeTable), true
  43. }
  44. nodeTable, found := GetNodeTableFromDB(nodeID)
  45. nodeTableCache.Put(nodeID, nodeTable)
  46. return nodeTable, found
  47. }
  48. func nodeCheck() {
  49. nodeTable, found := GetNodeTable(cherryApp.NodeID())
  50. if !found {
  51. now := ctime.Now().ToMillisecond()
  52. nodeTable.FirstStartTime = now
  53. nodeTable.LastStartTime = now
  54. } else {
  55. nodeTable.LastStartTime = ctime.Now().ToMillisecond()
  56. }
  57. nodeTable.Save2Queue()
  58. }
  59. func GetNodeTableFromDB(nodeID string) (*NodeTable, bool) {
  60. table := newNodeTable(nodeID)
  61. filter := bson.M{
  62. nameDB.Field_NodeID: table.NodeID,
  63. }
  64. err := dbComponent.FindOne(table, filter)
  65. if err != nil {
  66. if errors.Is(err, mongo.ErrNoDocuments) {
  67. clog.Warnf("[nodeID = %s] not found, create new one", nodeID)
  68. return table, false
  69. }
  70. clog.Errorf("[nodeID = %s] db error = %v", nodeID, err)
  71. return table, false
  72. }
  73. table.CheckField()
  74. return table, true
  75. }
  76. func newNodeTable(nodeID string) *NodeTable {
  77. return &NodeTable{
  78. NodeID: nodeID,
  79. FirstStartTime: 0,
  80. LastStartTime: 0,
  81. }
  82. }