@@ -65,11 +65,16 @@ func (c *Conversation) getAdvancedHistoryMessageList(ctx context.Context, req sd
65
65
return nil , err
66
66
}
67
67
startTime = m .SendTime
68
+ err = c .handleEndSeq (ctx , req , isReverse , m )
69
+ if err != nil {
70
+ return nil , err
71
+ }
68
72
} else {
69
73
// Clear both maps when the user enters the conversation
70
74
c .messagePullForwardEndSeqMap .Delete (conversationID , req .ViewType )
71
75
c .messagePullReverseEndSeqMap .Delete (conversationID , req .ViewType )
72
76
}
77
+
73
78
log .ZDebug (ctx , "Assembly conversation parameters" , "cost time" , time .Since (t ), "conversationID" ,
74
79
conversationID , "startTime:" , startTime , "count:" , req .Count , "startTime" , startTime )
75
80
list , err := c .fetchMessagesWithGapCheck (ctx , conversationID , req .Count , startTime , isReverse , req .ViewType , & messageListCallback )
@@ -84,13 +89,50 @@ func (c *Conversation) getAdvancedHistoryMessageList(ctx context.Context, req sd
84
89
t = time .Now ()
85
90
if ! isReverse {
86
91
sort .Sort (messageList )
87
-
88
92
}
89
93
log .ZDebug (ctx , "sort" , "sort cost time" , time .Since (t ))
90
94
messageListCallback .MessageList = messageList
91
95
92
96
return & messageListCallback , nil
93
97
}
98
+ func (c * Conversation ) handleEndSeq (ctx context.Context , req sdk.GetAdvancedHistoryMessageListParams , isReverse bool , startMessage * model_struct.LocalChatLog ) error {
99
+ if isReverse {
100
+ if _ , ok := c .messagePullReverseEndSeqMap .Load (req .ConversationID , req .ViewType ); ! ok {
101
+ if startMessage .Seq != 0 {
102
+ c .messagePullReverseEndSeqMap .Store (req .ConversationID , req .ViewType , startMessage .Seq )
103
+ } else {
104
+ validServerMessage , err := c .db .GetLatestValidServerMessage (ctx , req .ConversationID , startMessage .SendTime , isReverse )
105
+ if err != nil {
106
+ return err
107
+ }
108
+ if validServerMessage != nil {
109
+ c .messagePullReverseEndSeqMap .Store (req .ConversationID , req .ViewType , validServerMessage .Seq )
110
+ } else {
111
+ log .ZDebug (ctx , "no valid server message" , "conversationID" , req .ConversationID , "startTime" , startMessage .SendTime )
112
+ }
113
+ }
114
+ }
115
+
116
+ } else {
117
+ if _ , ok := c .messagePullForwardEndSeqMap .Load (req .ConversationID , req .ViewType ); ! ok {
118
+ if startMessage .Seq != 0 {
119
+ c .messagePullForwardEndSeqMap .Store (req .ConversationID , req .ViewType , startMessage .Seq )
120
+ } else {
121
+ validServerMessage , err := c .db .GetLatestValidServerMessage (ctx , req .ConversationID , startMessage .SendTime , isReverse )
122
+ if err != nil {
123
+ return err
124
+ }
125
+ if validServerMessage != nil {
126
+ c .messagePullForwardEndSeqMap .Store (req .ConversationID , req .ViewType , validServerMessage .Seq )
127
+ } else {
128
+ log .ZDebug (ctx , "no valid server message" , "conversationID" , req .ConversationID , "startTime" , startMessage .SendTime )
129
+ }
130
+ }
131
+
132
+ }
133
+ }
134
+ return nil
135
+ }
94
136
95
137
func (c * Conversation ) fetchMessagesWithGapCheck (ctx context.Context , conversationID string ,
96
138
count int , startTime int64 , isReverse bool , viewType int , messageListCallback * sdk.GetAdvancedHistoryMessageListCallback ) ([]* model_struct.LocalChatLog , error ) {
@@ -127,27 +169,27 @@ func (c *Conversation) fetchMessagesWithGapCheck(ctx context.Context, conversati
127
169
}
128
170
if ! isReverse {
129
171
if thisEndSeq != 0 {
130
- c .messagePullForwardEndSeqMap .StoreWithFunc (conversationID , viewType , thisEndSeq , func (key string , value int64 ) bool {
131
- lastEndSeq , _ := c .messagePullForwardEndSeqMap .Load (key , viewType )
172
+ c .messagePullForwardEndSeqMap .StoreWithFunc (conversationID , viewType , thisEndSeq , func (_ string , value int64 ) bool {
173
+ lastEndSeq , _ := c .messagePullForwardEndSeqMap .Load (conversationID , viewType )
132
174
if value < lastEndSeq || lastEndSeq == 0 {
133
175
log .ZDebug (ctx , "update the end sequence of the message" , "lastEndSeq" , lastEndSeq , "thisEndSeq" , value )
134
176
return true
135
177
}
136
178
log .ZWarn (ctx , "The end sequence number of the message is more than the last end sequence number" ,
137
- nil , "conversationID" , key , "value" , value , "lastEndSeq" , lastEndSeq )
179
+ nil , "conversationID" , conversationID , "value" , value , "lastEndSeq" , lastEndSeq )
138
180
return false
139
181
})
140
182
}
141
183
} else {
142
184
if thisEndSeq != 0 {
143
- c .messagePullReverseEndSeqMap .StoreWithFunc (conversationID , viewType , thisEndSeq , func (key string , value int64 ) bool {
144
- lastEndSeq , _ := c .messagePullReverseEndSeqMap .Load (key , viewType )
185
+ c .messagePullReverseEndSeqMap .StoreWithFunc (conversationID , viewType , thisEndSeq , func (_ string , value int64 ) bool {
186
+ lastEndSeq , _ := c .messagePullReverseEndSeqMap .Load (conversationID , viewType )
145
187
if value > lastEndSeq || lastEndSeq == 0 {
146
188
log .ZDebug (ctx , "update the end sequence of the message" , "lastEndSeq" , lastEndSeq , "thisEndSeq" , value )
147
189
return true
148
190
}
149
191
log .ZWarn (ctx , "The end sequence number of the message is less than the last end sequence number" ,
150
- nil , "conversationID" , key , "value" , value , "lastEndSeq" , lastEndSeq )
192
+ nil , "conversationID" , conversationID , "value" , value , "lastEndSeq" , lastEndSeq )
151
193
return false
152
194
})
153
195
}
0 commit comments