quest_table.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. dbQuest "f1-game/nodes/game/internal/db/data/quest"
  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. "go.mongodb.org/mongo-driver/v2/mongo/options"
  12. )
  13. // QuestTable 任务表
  14. type QuestTable struct {
  15. PlayerID int64 `bson:"PlayerID,omitempty"`
  16. NodeID string `bson:"NodeID,omitempty"`
  17. dbQuest.Data `bson:"Data,omitempty"`
  18. dbFacade.TableBase `bson:",inline"`
  19. }
  20. func (*QuestTable) TableName() string {
  21. return nameDB.Table_Quest
  22. }
  23. func (p *QuestTable) PrimaryValue() any {
  24. return p.PlayerID
  25. }
  26. func (p *QuestTable) CheckField() {
  27. }
  28. func (p *QuestTable) Indexes() []mongo.IndexModel {
  29. var list []mongo.IndexModel
  30. list = append(list, mongo.IndexModel{
  31. Keys: bson.D{
  32. {
  33. Key: nameDB.Field_PlayerID,
  34. Value: 1, // 升序
  35. },
  36. {
  37. Key: nameDB.Field_NodeID,
  38. Value: 1, // 升序
  39. },
  40. },
  41. Options: options.Index().SetUnique(true),
  42. })
  43. return list
  44. }
  45. func (p *QuestTable) Save2Queue() {
  46. save2Queue(p)
  47. }
  48. func GetQuestTable(playerID int64) *QuestTable {
  49. if val, ok := questTableCache.GetIfPresent(playerID); ok {
  50. return val.(*QuestTable)
  51. }
  52. questTable := GetQuestTableFromDB(playerID)
  53. questTableCache.Put(playerID, questTable)
  54. return questTable
  55. }
  56. func GetQuestTableFromDB(playerID int64) *QuestTable {
  57. table := newQuestTable(playerID)
  58. filter := bson.M{
  59. nameDB.Field_NodeID: table.NodeID,
  60. nameDB.Field_PlayerID: table.PlayerID,
  61. }
  62. err := dbComponent.FindOne(table, filter)
  63. if err != nil {
  64. if errors.Is(err, mongo.ErrNoDocuments) {
  65. clog.Warnf("[playerID = %d] not found, create new one", playerID)
  66. return table
  67. }
  68. clog.Errorf("[playerID = %d] db error = %v", playerID, err)
  69. return table
  70. }
  71. table.CheckField()
  72. return table
  73. }
  74. func newQuestTable(playerID int64) *QuestTable {
  75. return &QuestTable{
  76. PlayerID: playerID,
  77. NodeID: cherryApp.NodeID(),
  78. Data: dbQuest.NewData(),
  79. }
  80. }