chapter_table.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package db
  2. import (
  3. "errors"
  4. capp "f1-game/internal/cherry_app"
  5. dbFacade "f1-game/internal/component/db/facade"
  6. nameDB "f1-game/internal/name/db"
  7. dbChapter "f1-game/nodes/game/internal/db/data/chapter"
  8. "go.mongodb.org/mongo-driver/v2/bson"
  9. "go.mongodb.org/mongo-driver/v2/mongo"
  10. clog "github.com/cherry-game/cherry/logger"
  11. )
  12. // ChapterTable 探险表
  13. type (
  14. ChapterTable struct {
  15. PlayerID int64 `bson:"PlayerID,omitempty"`
  16. NodeID string `bson:"NodeID,omitempty"`
  17. dbChapter.Data `bson:"Data,omitempty"`
  18. dbFacade.TableBase `bson:",inline"`
  19. }
  20. )
  21. func (*ChapterTable) TableName() string {
  22. return nameDB.Table_Chapter
  23. }
  24. func (p *ChapterTable) PrimaryValue() any {
  25. return p.PlayerID
  26. }
  27. func (p *ChapterTable) CheckField() {
  28. }
  29. func (p *ChapterTable) Save2Queue() {
  30. save2Queue(p)
  31. }
  32. func GetChapterTable(playerID int64) *ChapterTable {
  33. if val, ok := chapterTableCache.GetIfPresent(playerID); ok {
  34. return val.(*ChapterTable)
  35. }
  36. chapterTable, found := GetChapterTableFromDB(playerID)
  37. if found {
  38. chapterTableCache.Put(playerID, chapterTable)
  39. }
  40. return chapterTable
  41. }
  42. func GetChapterTableFromDB(playerID int64) (*ChapterTable, bool) {
  43. chapterTable := newChapterTable(playerID)
  44. filter := bson.M{
  45. nameDB.Field_NodeID: chapterTable.NodeID,
  46. nameDB.Field_PlayerID: chapterTable.PlayerID,
  47. }
  48. err := dbComponent.FindOne(chapterTable, filter)
  49. if err != nil {
  50. if errors.Is(err, mongo.ErrNoDocuments) {
  51. clog.Warnf("[playerID = %d] not found, create new one", playerID)
  52. chapterTable.CheckField()
  53. return chapterTable, true
  54. }
  55. clog.Errorf("[playerID = %d] db error = %v", playerID, err)
  56. return chapterTable, false
  57. }
  58. chapterTable.CheckField()
  59. return chapterTable, true
  60. }
  61. func newChapterTable(playerID int64) *ChapterTable {
  62. return &ChapterTable{
  63. PlayerID: playerID,
  64. NodeID: capp.NodeID(),
  65. Data: dbChapter.NewData(),
  66. }
  67. }