mail_table.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package db
  2. import (
  3. "errors"
  4. cherryApp "f1-game/internal/cherry_app"
  5. dbFacade "f1-game/internal/component/db/facade"
  6. "f1-game/internal/data"
  7. nameDB "f1-game/internal/name/db"
  8. "f1-game/internal/types"
  9. dbMail "f1-game/nodes/game/internal/db/data/mail"
  10. "slices"
  11. ctime "github.com/cherry-game/cherry/extend/time"
  12. clog "github.com/cherry-game/cherry/logger"
  13. "go.mongodb.org/mongo-driver/v2/bson"
  14. "go.mongodb.org/mongo-driver/v2/mongo"
  15. )
  16. // MailTable 邮件表
  17. type MailTable struct {
  18. PlayerID int64 `bson:"PlayerID,omitempty"`
  19. NodeID string `bson:"NodeID,omitempty"`
  20. AutoID int64 `bson:"AutoID,omitempty"` // 邮件自增ID
  21. BulkIDList types.List[int64] `bson:"BulkIDList,omitempty"` // 已发放群发邮件Id列表 群发邮件表ID
  22. dbMail.Data `bson:"Data,omitempty"`
  23. dbFacade.TableBase `bson:",inline"`
  24. }
  25. func (p *MailTable) TableName() string {
  26. return nameDB.Table_Mail
  27. }
  28. func (p *MailTable) PrimaryValue() any {
  29. return p.PlayerID
  30. }
  31. func (p *MailTable) CheckField() {
  32. }
  33. func (p *MailTable) Save2Queue() {
  34. save2Queue(p)
  35. }
  36. func (p *MailTable) Add(mail *dbMail.Mail, autoSave bool) ([]*dbMail.Mail, bool) {
  37. var (
  38. isChange bool // 是否修改数据
  39. delMailList []*dbMail.Mail // 已删除的邮件id列表
  40. mailCount = int32(len(p.Data)) //当前邮件数量
  41. )
  42. remain := mailCount - data.Const.MailLimitNum + 1
  43. for remain > 0 {
  44. delMail := p.Data[0]
  45. delMailList = append(delMailList, delMail)
  46. p.Data.RemoveIndex(0)
  47. remain--
  48. }
  49. isChange = p.Data.Add(mail)
  50. if isChange && autoSave {
  51. p.Save2Queue()
  52. }
  53. return delMailList, isChange
  54. }
  55. // CheckExpire 清理过期邮件
  56. func (p *MailTable) CheckExpire(now *ctime.CherryTime) []*dbMail.Mail {
  57. var (
  58. curTime = ctime.Now().ToSecond()
  59. delMailList = []*dbMail.Mail{}
  60. )
  61. for _, mailEntity := range p.Data {
  62. if mailEntity.ExpireTime <= curTime {
  63. delMailList = append(delMailList, mailEntity)
  64. }
  65. }
  66. if len(delMailList) > 0 {
  67. for _, mailEntity := range delMailList {
  68. p.Data.Remove(mailEntity.MailID)
  69. }
  70. p.Save2Queue()
  71. }
  72. return delMailList
  73. }
  74. func (p *MailTable) InBulk(bulkID int64) bool {
  75. return slices.Contains(p.BulkIDList, bulkID)
  76. }
  77. func (p *MailTable) AddBulkID(bulkID int64) {
  78. p.BulkIDList.Add(bulkID)
  79. p.Save2Queue()
  80. }
  81. func (p *MailTable) NewMailID() int64 {
  82. p.AutoID++
  83. p.Save2Queue()
  84. return p.AutoID
  85. }
  86. func GetMailTable(playerID int64) *MailTable {
  87. if val, ok := mailTableCache.GetIfPresent(playerID); ok {
  88. return val.(*MailTable)
  89. }
  90. mailTable := GetMailTableFromDB(playerID)
  91. mailTableCache.Put(playerID, mailTable)
  92. return mailTable
  93. }
  94. func GetMailTableFromDB(playerID int64) *MailTable {
  95. table := newMailTable(playerID)
  96. filter := bson.M{
  97. nameDB.Field_NodeID: table.NodeID,
  98. nameDB.Field_PlayerID: table.PlayerID,
  99. }
  100. err := dbComponent.FindOne(table, filter)
  101. if err != nil {
  102. if errors.Is(err, mongo.ErrNoDocuments) {
  103. clog.Warnf("[playerID = %d] not found, create new one", playerID)
  104. return table
  105. }
  106. clog.Errorf("[playerID = %d] db error = %v", playerID, err)
  107. return table
  108. }
  109. table.CheckField()
  110. return table
  111. }
  112. func newMailTable(playerID int64) *MailTable {
  113. return &MailTable{
  114. PlayerID: playerID,
  115. NodeID: cherryApp.NodeID(),
  116. AutoID: 0,
  117. BulkIDList: types.NewList[int64](),
  118. Data: []*dbMail.Mail{},
  119. }
  120. }