message.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package model
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "time"
  7. "trading-go/common"
  8. "trading-go/response"
  9. "trading-go/util"
  10. )
  11. type Message struct {
  12. MsgType int `json:"msgType"`
  13. From uint `json:"from,string"`
  14. To uint `json:"to,string"`
  15. Time uint `json:"time,string"`
  16. Content any `json:"content"`
  17. }
  18. var fromIndex map[uint]string
  19. var toIndex map[uint]string
  20. func init() {
  21. fromIndex = make(map[uint]string)
  22. toIndex = make(map[uint]string)
  23. }
  24. func (m Message) Save() error {
  25. rds := common.Redis
  26. jsonData, err := json.Marshal(m)
  27. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  28. defer cancel()
  29. key := fmt.Sprintf("%d:%d:%d", m.From, m.To, m.Time)
  30. _, err = rds.Set(ctx, key, jsonData, time.Second*60*60*24*30).Result()
  31. if err != nil {
  32. return err
  33. }
  34. return err
  35. }
  36. func (m Message) GetFrom(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
  37. var mess []Message
  38. if page == 1 {
  39. fromIndex[uid] = "0"
  40. }
  41. rds := common.Redis
  42. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  43. defer cancel()
  44. key := fmt.Sprintf("%d:*", uid)
  45. result, err := rds.Do(ctx, "scan", fromIndex[uid], "match", key, "count", pageSize).Result()
  46. if err != nil {
  47. return
  48. }
  49. rs := result.([]interface{})
  50. index := rs[0].(string)
  51. if index != "0" {
  52. fromIndex[uid] = index
  53. ms.HNext = true
  54. }
  55. keys := rs[1].([]interface{})
  56. for i := 0; i < len(keys); i++ {
  57. value, err := rds.Get(ctx, keys[i].(string)).Result()
  58. if err != nil {
  59. break
  60. }
  61. err = json.Unmarshal([]byte(value), &m)
  62. if err != nil {
  63. break
  64. }
  65. mess = append(mess, m)
  66. }
  67. ms.Data = mess
  68. ms.PageSize = pageSize
  69. ms.Page = page
  70. return
  71. }
  72. func (m Message) GetMsg(uid uint) (ms []Message, err error) {
  73. mFrom, err := m.GetFrom(uid, 1, 10000000)
  74. if err != nil {
  75. return nil, err
  76. }
  77. mTo, err := m.GetTo(uid, 1, 10000000)
  78. if err != nil {
  79. return nil, err
  80. }
  81. s1, s2 := mFrom.Data.([]Message), mTo.Data.([]Message)
  82. ms = append(s1, s2...)
  83. return ms, nil
  84. }
  85. func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
  86. var mess []Message
  87. if page == 1 {
  88. toIndex[uid] = "0"
  89. }
  90. rds := common.Redis
  91. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  92. defer cancel()
  93. key := fmt.Sprintf("*:%d:*", uid)
  94. result, err := rds.Do(ctx, "scan", toIndex[uid], "match", key, "count", pageSize).Result()
  95. if err != nil {
  96. return
  97. }
  98. rs := result.([]interface{})
  99. index := rs[0].(string)
  100. if index != "0" {
  101. toIndex[uid] = index
  102. ms.HNext = true
  103. }
  104. keys := rs[1].([]interface{})
  105. for i := 0; i < len(keys); i++ {
  106. value, err := rds.Get(ctx, keys[i].(string)).Result()
  107. if err != nil {
  108. break
  109. }
  110. err = json.Unmarshal([]byte(value), &m)
  111. if err != nil {
  112. break
  113. }
  114. mess = append(mess, m)
  115. }
  116. ms.Data = mess
  117. ms.PageSize = pageSize
  118. ms.Page = page
  119. return
  120. }
  121. func (m Message) GetLatestMsg(uid, target uint) (msg Message, err error) {
  122. mFrom, err := m.GetFrom(uid, 1, 10000000)
  123. if err != nil {
  124. return Message{}, err
  125. }
  126. mTo, err := m.GetTo(uid, 1, 10000000)
  127. if err != nil {
  128. return Message{}, err
  129. }
  130. s1, s2 := mFrom.Data.([]Message), mTo.Data.([]Message)
  131. ms := append(s1, s2...)
  132. if len(ms) == 0 {
  133. return Message{}, util.NoMessageError
  134. }
  135. last := -1
  136. for i := range ms {
  137. if ms[i].From != target && ms[i].To != target {
  138. continue
  139. }
  140. if last == -1 {
  141. last = i
  142. } else if ms[i].Time > ms[last].Time {
  143. last = i
  144. }
  145. }
  146. if last == -1 {
  147. return Message{}, util.NoMessageError
  148. }
  149. return ms[last], nil
  150. }