item_table.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. dbItem "f1-game/nodes/game/internal/db/data/item"
  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. // ItemTable 道具表
  13. type ItemTable struct {
  14. PlayerID int64 `bson:"PlayerID,omitempty"`
  15. NodeID string `bson:"NodeID,omitempty"`
  16. dbItem.Data `bson:"Data,omitempty"`
  17. dbFacade.TableBase `bson:",inline"`
  18. }
  19. func (*ItemTable) TableName() string {
  20. return nameDB.Table_Item
  21. }
  22. func (p *ItemTable) PrimaryValue() any {
  23. return p.PlayerID
  24. }
  25. // func (p *ItemTable) Filter() bson.M {
  26. // return bson.M{
  27. // nameDB.Field_NodeID: p.NodeID,
  28. // nameDB.Field_PlayerID: p.PlayerID,
  29. // }
  30. // }
  31. func (p *ItemTable) CheckField() {
  32. p.Data.CheckField()
  33. }
  34. func (p *ItemTable) Save2Queue() {
  35. // TODO 后面去除
  36. for _, item := range p.ItemMap {
  37. if item.Num < 1 {
  38. p.ItemMap.Remove(item.ItemID)
  39. }
  40. }
  41. save2Queue(p)
  42. }
  43. func GetItemTable(playerID int64) *ItemTable {
  44. if val, ok := itemTableCache.GetIfPresent(playerID); ok {
  45. return val.(*ItemTable)
  46. }
  47. itemTable := GetItemTableFromDB(playerID)
  48. itemTableCache.Put(playerID, itemTable)
  49. return itemTable
  50. }
  51. func GetItemTableFromDB(playerID int64) *ItemTable {
  52. table := newItemTable(playerID)
  53. filter := bson.M{
  54. nameDB.Field_NodeID: table.NodeID,
  55. nameDB.Field_PlayerID: table.PlayerID,
  56. }
  57. err := dbComponent.FindOne(table, filter)
  58. if err != nil {
  59. if errors.Is(err, mongo.ErrNoDocuments) {
  60. clog.Warnf("[playerID = %d] not found, create new one", playerID)
  61. return table
  62. }
  63. clog.Errorf("[playerID = %d] db error = %v", playerID, err)
  64. return table
  65. }
  66. table.CheckField()
  67. return table
  68. }
  69. func newItemTable(playerID int64) *ItemTable {
  70. return &ItemTable{
  71. PlayerID: playerID,
  72. NodeID: cherryApp.NodeID(),
  73. Data: dbItem.NewData(),
  74. }
  75. }