message.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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, target 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. msgs := append(s1, s2...)
  83. for _, msg := range msgs {
  84. if msg.To == target || msg.From == target {
  85. ms = append(ms, msg)
  86. }
  87. }
  88. return ms, nil
  89. }
  90. func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
  91. var mess []Message
  92. if page == 1 {
  93. toIndex[uid] = "0"
  94. }
  95. rds := common.Redis
  96. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  97. defer cancel()
  98. key := fmt.Sprintf("*:%d:*", uid)
  99. result, err := rds.Do(ctx, "scan", toIndex[uid], "match", key, "count", pageSize).Result()
  100. if err != nil {
  101. return
  102. }
  103. rs := result.([]interface{})
  104. index := rs[0].(string)
  105. if index != "0" {
  106. toIndex[uid] = index
  107. ms.HNext = true
  108. }
  109. keys := rs[1].([]interface{})
  110. for i := 0; i < len(keys); i++ {
  111. value, err := rds.Get(ctx, keys[i].(string)).Result()
  112. if err != nil {
  113. break
  114. }
  115. err = json.Unmarshal([]byte(value), &m)
  116. if err != nil {
  117. break
  118. }
  119. mess = append(mess, m)
  120. }
  121. ms.Data = mess
  122. ms.PageSize = pageSize
  123. ms.Page = page
  124. return
  125. }
  126. func (m Message) GetLatestMsg(uid, target uint) (msg Message, err error) {
  127. mFrom, err := m.GetFrom(uid, 1, 10000000)
  128. if err != nil {
  129. return Message{}, err
  130. }
  131. mTo, err := m.GetTo(uid, 1, 10000000)
  132. if err != nil {
  133. return Message{}, err
  134. }
  135. s1, s2 := mFrom.Data.([]Message), mTo.Data.([]Message)
  136. ms := append(s1, s2...)
  137. if len(ms) == 0 {
  138. return Message{}, util.NoMessageError
  139. }
  140. last := -1
  141. for i := range ms {
  142. if ms[i].From != target && ms[i].To != target {
  143. continue
  144. }
  145. if last == -1 {
  146. last = i
  147. } else if ms[i].Time > ms[last].Time {
  148. last = i
  149. }
  150. }
  151. if last == -1 {
  152. return Message{}, util.NoMessageError
  153. }
  154. return ms[last], nil
  155. }