diff --git a/internal/conversation_msg/conversation.go b/internal/conversation_msg/conversation.go index 059ff8ad5..be99ba08f 100644 --- a/internal/conversation_msg/conversation.go +++ b/internal/conversation_msg/conversation.go @@ -57,7 +57,7 @@ func (c *Conversation) getAdvancedHistoryMessageList(ctx context.Context, req sd var messageListCallback sdk.GetAdvancedHistoryMessageListCallback var conversationID string var startClientMsgID string - var startTime int64 + var startTime, startSeq int64 var err error var messageList sdk_struct.NewMsgList conversationID = req.ConversationID @@ -68,6 +68,7 @@ func (c *Conversation) getAdvancedHistoryMessageList(ctx context.Context, req sd } startTime = m.SendTime startClientMsgID = req.StartClientMsgID + startSeq = m.Seq err = c.handleEndSeq(ctx, req, isReverse, m) if err != nil { return nil, err @@ -80,7 +81,7 @@ func (c *Conversation) getAdvancedHistoryMessageList(ctx context.Context, req sd log.ZDebug(ctx, "Assembly conversation parameters", "cost time", time.Since(t), "conversationID", conversationID, "startTime:", startTime, "count:", req.Count) - list, err := c.fetchMessagesWithGapCheck(ctx, conversationID, req.Count, startTime, startClientMsgID, isReverse, req.ViewType, &messageListCallback) + list, err := c.fetchMessagesWithGapCheck(ctx, conversationID, req.Count, startTime, startSeq, startClientMsgID, isReverse, req.ViewType, &messageListCallback) if err != nil { return nil, err } @@ -138,7 +139,7 @@ func (c *Conversation) handleEndSeq(ctx context.Context, req sdk.GetAdvancedHist } func (c *Conversation) fetchMessagesWithGapCheck(ctx context.Context, conversationID string, - count int, startTime int64, startClientMsgID string, isReverse bool, viewType int, messageListCallback *sdk.GetAdvancedHistoryMessageListCallback) ([]*model_struct.LocalChatLog, error) { + count int, startTime, startSeq int64, startClientMsgID string, isReverse bool, viewType int, messageListCallback *sdk.GetAdvancedHistoryMessageListCallback) ([]*model_struct.LocalChatLog, error) { var list, validMessages []*model_struct.LocalChatLog @@ -200,16 +201,16 @@ func (c *Conversation) fetchMessagesWithGapCheck(ctx context.Context, conversati return count - validateMessageNum } - getNewStartMessageInfo := func(messages []*model_struct.LocalChatLog) (int64, string) { + getNewStartMessageInfo := func(messages []*model_struct.LocalChatLog) (int64, int64, string) { if len(messages) == 0 { - return 0, "" + return 0, 0, "" } // Returns the SendTime and ClientMsgID of the last element in the message list - return messages[len(messages)-1].SendTime, messages[len(messages)-1].ClientMsgID + return messages[len(messages)-1].SendTime, messages[len(messages)-1].Seq, messages[len(messages)-1].ClientMsgID } t := time.Now() - list, err := c.db.GetMessageList(ctx, conversationID, count, startTime, startClientMsgID, isReverse) + list, err := c.db.GetMessageList(ctx, conversationID, count, startTime, startSeq, startClientMsgID, isReverse) log.ZDebug(ctx, "db get messageList", "cost time", time.Since(t), "len", len(list), "err", err, "conversationID", conversationID) @@ -232,10 +233,10 @@ func (c *Conversation) fetchMessagesWithGapCheck(ctx context.Context, conversati // continue fetching recursively until the valid messages are sufficient or all messages have been fetched. missingCount := shouldFetchMoreMessagesNum(list) if missingCount > 0 && !messageListCallback.IsEnd { - newStartTime, newStartClientMsgID := getNewStartMessageInfo(list) + newStartTime, newStartSeq, newStartClientMsgID := getNewStartMessageInfo(list) log.ZDebug(ctx, "fetch more messages", "missingCount", missingCount, "conversationID", - conversationID, "newStartTime", newStartTime) - missingMessages, err := c.fetchMessagesWithGapCheck(ctx, conversationID, missingCount, newStartTime, newStartClientMsgID, isReverse, viewType, messageListCallback) + conversationID, "newStartTime", newStartTime, "newStartSeq", newStartSeq, "newStartClientMsgID", newStartClientMsgID) + missingMessages, err := c.fetchMessagesWithGapCheck(ctx, conversationID, missingCount, newStartTime, newStartSeq, newStartClientMsgID, isReverse, viewType, messageListCallback) if err != nil { return nil, err } diff --git a/internal/conversation_msg/revoke.go b/internal/conversation_msg/revoke.go index 3c6bb55ef..230d9c224 100644 --- a/internal/conversation_msg/revoke.go +++ b/internal/conversation_msg/revoke.go @@ -108,7 +108,7 @@ func (c *Conversation) revokeMessage(ctx context.Context, tips *sdkws.RevokeMsgT log.ZDebug(ctx, "latestMsg", "latestMsg", &latestMsg, "seq", tips.Seq) if latestMsg.Seq <= tips.Seq { var newLatestMsg sdk_struct.MsgStruct - msgs, err := c.db.GetMessageList(ctx, tips.ConversationID, 1, 0, "", false) + msgs, err := c.db.GetMessageList(ctx, tips.ConversationID, 1, 0, 0, "", false) if err != nil || len(msgs) == 0 { log.ZError(ctx, "GetMessageListNoTime failed", err, "tips", &tips) return errs.Wrap(err) diff --git a/pkg/db/chat_log_model.go b/pkg/db/chat_log_model.go index 454ff967b..7916d99f1 100644 --- a/pkg/db/chat_log_model.go +++ b/pkg/db/chat_log_model.go @@ -154,7 +154,7 @@ func (d *DataBase) UpdateMessageTimeAndStatus(ctx context.Context, conversationI Updates(model_struct.LocalChatLog{Status: status, SendTime: sendTime, ServerMsgID: serverMsgID}).Error, "UpdateMessageStatusBySourceID failed") } -func (d *DataBase) GetMessageList(ctx context.Context, conversationID string, count int, startTime int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) { +func (d *DataBase) GetMessageList(ctx context.Context, conversationID string, count int, startTime, startSeq int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) { if err = d.initChatLog(ctx, conversationID); err != nil { log.ZWarn(ctx, "initChatLog err", err) return nil, err @@ -164,14 +164,16 @@ func (d *DataBase) GetMessageList(ctx context.Context, conversationID string, co var condition, timeOrder, timeSymbol string if isReverse { timeOrder = "send_time ASC,seq ASC" - timeSymbol = ">=" + timeSymbol = ">" } else { timeOrder = "send_time DESC,seq DESC" - timeSymbol = "<=" + timeSymbol = "<" } if startTime > 0 { - condition = "send_time " + timeSymbol + " ? AND client_msg_id != ?" - err = errs.WrapMsg(d.conn.WithContext(ctx).Table(utils.GetTableName(conversationID)).Where(condition, startTime, startClientMsgID). + condition = "send_time " + timeSymbol + " ? " + + "OR (send_time = ? AND (seq " + timeSymbol + " ? OR (seq = 0 AND client_msg_id != ?)))" + err = errs.WrapMsg(d.conn.WithContext(ctx).Table(utils.GetTableName(conversationID)). + Where(condition, startTime, startTime, startSeq, startClientMsgID). Order(timeOrder).Offset(0).Limit(count).Find(&result).Error, "GetMessageList failed") if err != nil { return nil, err diff --git a/pkg/db/db_interface/databse.go b/pkg/db/db_interface/databse.go index 1c93d4d15..0cbd9592c 100644 --- a/pkg/db/db_interface/databse.go +++ b/pkg/db/db_interface/databse.go @@ -67,7 +67,7 @@ type MessageModel interface { UpdateMessage(ctx context.Context, conversationID string, c *model_struct.LocalChatLog) error UpdateMessageBySeq(ctx context.Context, conversationID string, c *model_struct.LocalChatLog) error UpdateMessageTimeAndStatus(ctx context.Context, conversationID, clientMsgID string, serverMsgID string, sendTime int64, status int32) error - GetMessageList(ctx context.Context, conversationID string, count int, startTime int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) + GetMessageList(ctx context.Context, conversationID string, count int, startTime, startSeq int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) MarkConversationMessageAsReadDB(ctx context.Context, conversationID string, msgIDs []string) (rowsAffected int64, err error) MarkConversationMessageAsReadBySeqs(ctx context.Context, conversationID string, seqs []int64) (rowsAffected int64, err error) GetUnreadMessage(ctx context.Context, conversationID string) (result []*model_struct.LocalChatLog, err error) diff --git a/test/conversation_test.go b/test/conversation_test.go index fcef5c138..e0461dce2 100644 --- a/test/conversation_test.go +++ b/test/conversation_test.go @@ -136,7 +136,12 @@ func Test_FindMessageList(t *testing.T) { } func Test_GetAdvancedHistoryMessageList(t *testing.T) { - msgs, err := open_im_sdk.UserForSDK.Conversation().GetAdvancedHistoryMessageList(ctx, sdk_params_callback.GetAdvancedHistoryMessageListParams{}) + msgs, err := open_im_sdk.UserForSDK.Conversation().GetAdvancedHistoryMessageList(ctx, sdk_params_callback.GetAdvancedHistoryMessageListParams{ + ConversationID: "si_5318543822_9511766539", + StartClientMsgID: "", + Count: 40, + ViewType: 0, + }) if err != nil { t.Fatal(err) } diff --git a/wasm/indexdb/chat_log_model.go b/wasm/indexdb/chat_log_model.go index 104b0881a..57255226a 100644 --- a/wasm/indexdb/chat_log_model.go +++ b/wasm/indexdb/chat_log_model.go @@ -126,8 +126,8 @@ func (i *LocalChatLogs) UpdateMessageTimeAndStatus(ctx context.Context, conversa } // GetMessageList retrieves a list of messages from the local chat log. -func (i *LocalChatLogs) GetMessageList(ctx context.Context, conversationID string, count int, startTime int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) { - msgList, err := exec.Exec(conversationID, count, startTime, startClientMsgID, isReverse, i.loginUserID) +func (i *LocalChatLogs) GetMessageList(ctx context.Context, conversationID string, count int, startTime, startSeq int64, startClientMsgID string, isReverse bool) (result []*model_struct.LocalChatLog, err error) { + msgList, err := exec.Exec(conversationID, count, startTime, startSeq, startClientMsgID, isReverse, i.loginUserID) if err != nil { return nil, err } else {