message.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package model
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "time"
  7. "trading-go/common"
  8. "trading-go/response"
  9. )
  10. type Message struct {
  11. MsgType int `json:"msgType"`
  12. From uint `json:"from"`
  13. To uint `json:"to"`
  14. Time uint `json:"time"`
  15. Content any `json:"content"`
  16. }
  17. var fromIndex map[uint]string
  18. var toIndex map[uint]string
  19. func init() {
  20. fromIndex = make(map[uint]string)
  21. toIndex = make(map[uint]string)
  22. }
  23. func (m Message) Save() error {
  24. rds := common.Redis
  25. jsonData, err := json.Marshal(m)
  26. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  27. defer cancel()
  28. key := fmt.Sprintf("%d:%d:%d", m.From, m.To, m.Time)
  29. _, err = rds.Set(ctx, key, jsonData, time.Second*60*60*24*30).Result()
  30. if err != nil {
  31. return err
  32. }
  33. return err
  34. }
  35. func (m Message) GetFrom(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
  36. var mess []Message
  37. if page == 1 {
  38. fromIndex[uid] = "0"
  39. }
  40. rds := common.Redis
  41. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  42. defer cancel()
  43. key := fmt.Sprintf("%d:*", uid)
  44. result, err := rds.Do(ctx, "scan", fromIndex[uid], "match", key, "count", pageSize).Result()
  45. if err != nil {
  46. return
  47. }
  48. rs := result.([]interface{})
  49. index := rs[0].(string)
  50. if index != "0" {
  51. fromIndex[uid] = index
  52. ms.HNext = true
  53. }
  54. keys := rs[1].([]interface{})
  55. for i := 0; i < len(keys); i++ {
  56. value, err := rds.Get(ctx, keys[i].(string)).Result()
  57. if err != nil {
  58. break
  59. }
  60. err = json.Unmarshal([]byte(value), &m)
  61. if err != nil {
  62. break
  63. }
  64. mess = append(mess, m)
  65. }
  66. ms.Data = mess
  67. ms.PageSize = pageSize
  68. ms.Page = page
  69. return
  70. }
  71. func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
  72. var mess []Message
  73. if page == 1 {
  74. toIndex[uid] = "0"
  75. }
  76. rds := common.Redis
  77. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  78. defer cancel()
  79. key := fmt.Sprintf("*:%d:*", uid)
  80. result, err := rds.Do(ctx, "scan", toIndex[uid], "match", key, "count", pageSize).Result()
  81. if err != nil {
  82. return
  83. }
  84. rs := result.([]interface{})
  85. index := rs[0].(string)
  86. if index != "0" {
  87. toIndex[uid] = index
  88. ms.HNext = true
  89. }
  90. keys := rs[1].([]interface{})
  91. for i := 0; i < len(keys); i++ {
  92. value, err := rds.Get(ctx, keys[i].(string)).Result()
  93. if err != nil {
  94. break
  95. }
  96. err = json.Unmarshal([]byte(value), &m)
  97. if err != nil {
  98. break
  99. }
  100. mess = append(mess, m)
  101. }
  102. ms.Data = mess
  103. ms.PageSize = pageSize
  104. ms.Page = page
  105. return
  106. }