@ -16,6 +16,7 @@ package conversation
import (
"context"
"github.com/openimsdk/open-im-server/v3/pkg/rpcli"
"sort"
"time"
@ -26,9 +27,6 @@ import (
dbModel "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
"github.com/openimsdk/open-im-server/v3/pkg/localcache"
"github.com/openimsdk/open-im-server/v3/pkg/msgprocessor"
pbgroup "github.com/openimsdk/protocol/group"
pbmsg "github.com/openimsdk/protocol/msg"
"github.com/openimsdk/protocol/rpccall"
"github.com/openimsdk/tools/db/redisutil"
"github.com/openimsdk/open-im-server/v3/pkg/common/convert"
@ -52,6 +50,9 @@ type conversationServer struct {
conversationNotificationSender * ConversationNotificationSender
config * Config
// todo
msgClient * rpcli . MsgClient
groupClient * rpcli . GroupClient
}
type Config struct {
@ -118,19 +119,12 @@ func (c *conversationServer) GetSortedConversationList(ctx context.Context, req
if len ( conversations ) == 0 {
return nil , errs . ErrRecordNotFound . Wrap ( )
}
maxSeqs , err := rpccall . ExtractField ( ctx , pbmsg . GetMaxSeqsCaller . Invoke ,
& pbmsg . GetMaxSeqsReq { ConversationIDs : conversationIDs } ,
( * pbmsg . SeqsInfoResp ) . GetMaxSeqs )
maxSeqs , err := c . msgClient . GetMaxSeqs ( ctx , conversationIDs )
if err != nil {
return nil , err
}
chatLogs , err := rpccall . ExtractField ( ctx , pbmsg . GetMsgByConversationIDsCaller . Invoke ,
& pbmsg . GetMsgByConversationIDsReq {
ConversationIDs : conversationIDs ,
MaxSeqs : maxSeqs ,
} , ( * pbmsg . GetMsgByConversationIDsResp ) . GetMsgDatas )
chatLogs , err := c . msgClient . GetMsgByConversationIDs ( ctx , conversationIDs , maxSeqs )
if err != nil {
return nil , err
}
@ -140,9 +134,7 @@ func (c *conversationServer) GetSortedConversationList(ctx context.Context, req
return nil , err
}
hasReadSeqs , err := rpccall . ExtractField ( ctx , pbmsg . GetHasReadSeqsCaller . Invoke ,
& pbmsg . GetHasReadSeqsReq { ConversationIDs : conversationIDs } ,
( * pbmsg . SeqsInfoResp ) . GetMaxSeqs )
hasReadSeqs , err := c . msgClient . GetHasReadSeqs ( ctx , conversationIDs , req . UserID )
if err != nil {
return nil , err
}
@ -230,14 +222,7 @@ func (c *conversationServer) SetConversations(ctx context.Context, req *pbconver
return nil , errs . ErrArgs . WrapMsg ( "conversation must not be nil" )
}
if req . Conversation . ConversationType == constant . WriteGroupChatType {
groupInfo , err := rpccall . ExtractField ( ctx , pbgroup . GetGroupsInfoCaller . Invoke ,
& pbgroup . GetGroupsInfoReq { GroupIDs : [ ] string { req . Conversation . GroupID } } ,
func ( r * pbgroup . GetGroupsInfoResp ) * sdkws . GroupInfo {
if len ( r . GroupInfos ) > 0 {
return r . GroupInfos [ 0 ]
}
return nil
} )
groupInfo , err := c . groupClient . GetGroupInfo ( ctx , req . Conversation . GroupID )
if err != nil {
return nil , err
}
@ -444,14 +429,14 @@ func (c *conversationServer) CreateGroupChatConversations(ctx context.Context, r
return nil , err
}
conversationID := msgprocessor . GetConversationIDBySessionType ( constant . ReadGroupChatType , req . GroupID )
if _, err := pbmsg . SetUserConversationMaxSeqCaller . Invoke ( ctx , & pbmsg . SetUserConversationMaxSeqReq { ConversationID : conversationID , OwnerUserID : req . UserIDs , MaxSeq : 0 } ) ; err != nil {
if err := c . msgClient . SetUserConversationMaxSeq ( ctx , conversationID , req . UserIDs , 0 ) ; err != nil {
return nil , err
}
return & pbconversation . CreateGroupChatConversationsResp { } , nil
}
func ( c * conversationServer ) SetConversationMaxSeq ( ctx context . Context , req * pbconversation . SetConversationMaxSeqReq ) ( * pbconversation . SetConversationMaxSeqResp , error ) {
if _, err := pbmsg . SetUserConversationMaxSeqCaller . Invoke ( ctx , & pbmsg . SetUserConversationMaxSeqReq { ConversationID : req . ConversationID , OwnerUserID: req. OwnerUserID , MaxSeq: req. MaxSeq } ) ; err != nil {
if err := c . msgClient . SetUserConversationMaxSeq ( ctx , req . ConversationID , req. OwnerUserID , req. MaxSeq ) ; err != nil {
return nil , err
}
if err := c . conversationDatabase . UpdateUsersConversationField ( ctx , req . OwnerUserID , req . ConversationID ,
@ -465,7 +450,7 @@ func (c *conversationServer) SetConversationMaxSeq(ctx context.Context, req *pbc
}
func ( c * conversationServer ) SetConversationMinSeq ( ctx context . Context , req * pbconversation . SetConversationMinSeqReq ) ( * pbconversation . SetConversationMinSeqResp , error ) {
if _, err := pbmsg . SetUserConversationMinSeqCaller . Invoke ( ctx , & pbmsg . SetUserConversationMinSeqReq { ConversationID : req . ConversationID , OwnerUserID: req. OwnerUserID , MinSeq: req. MinSeq } ) ; err != nil {
if err := c . msgClient . SetUserConversationMin ( ctx , req . ConversationID , req. OwnerUserID , req. MinSeq ) ; err != nil {
return nil , err
}
if err := c . conversationDatabase . UpdateUsersConversationField ( ctx , req . OwnerUserID , req . ConversationID ,
@ -584,9 +569,7 @@ func (c *conversationServer) getConversationInfo(
}
}
if len ( groupIDs ) != 0 {
groupInfos , err := rpccall . ExtractField ( ctx , pbgroup . GetGroupsInfoCaller . Invoke ,
& pbgroup . GetGroupsInfoReq { GroupIDs : groupIDs } ,
( * pbgroup . GetGroupsInfoResp ) . GetGroupInfos )
groupInfos , err := c . groupClient . GetGroupsInfo ( ctx , groupIDs )
if err != nil {
return nil , err
}
@ -774,23 +757,22 @@ func (c *conversationServer) ClearUserConversationMsg(ctx context.Context, req *
if conversation . IsMsgDestruct == false || conversation . MsgDestructTime == 0 {
continue
}
rcpReq := & pbmsg . GetLastMessageSeqByTimeReq { ConversationID : conversation . ConversationID , Time : req . Timestamp - conversation . MsgDestructTime }
resp , err := pbmsg . GetLastMessageSeqByTime . Invoke ( ctx , rcpReq )
seq , err := c . msgClient . GetLastMessageSeqByTime ( ctx , conversation . ConversationID , req . Timestamp - conversation . MsgDestructTime )
if err != nil {
return nil , err
}
if re sp. S eq <= 0 {
log . ZDebug ( ctx , "ClearUserConversationMsg GetLastMessageSeqByTime seq <= 0" , "index" , i , "conversationID" , conversation . ConversationID , "ownerUserID" , conversation . OwnerUserID , "msgDestructTime" , conversation . MsgDestructTime , "seq" , re sp. S eq)
if seq <= 0 {
log . ZDebug ( ctx , "ClearUserConversationMsg GetLastMessageSeqByTime seq <= 0" , "index" , i , "conversationID" , conversation . ConversationID , "ownerUserID" , conversation . OwnerUserID , "msgDestructTime" , conversation . MsgDestructTime , "seq" , seq)
if err := c . setConversationMinSeqAndLatestMsgDestructTime ( ctx , conversation . ConversationID , conversation . OwnerUserID , - 1 , latestMsgDestructTime ) ; err != nil {
return nil , err
}
continue
}
re sp. S eq++
if err := c . setConversationMinSeqAndLatestMsgDestructTime ( ctx , conversation . ConversationID , conversation . OwnerUserID , re sp. S eq, latestMsgDestructTime ) ; err != nil {
seq++
if err := c . setConversationMinSeqAndLatestMsgDestructTime ( ctx , conversation . ConversationID , conversation . OwnerUserID , seq, latestMsgDestructTime ) ; err != nil {
return nil , err
}
log . ZDebug ( ctx , "ClearUserConversationMsg set min seq" , "index" , i , "conversationID" , conversation . ConversationID , "ownerUserID" , conversation . OwnerUserID , "seq" , re sp. S eq, "msgDestructTime" , conversation . MsgDestructTime )
log . ZDebug ( ctx , "ClearUserConversationMsg set min seq" , "index" , i , "conversationID" , conversation . ConversationID , "ownerUserID" , conversation . OwnerUserID , "seq" , seq, "msgDestructTime" , conversation . MsgDestructTime )
}
return & pbconversation . ClearUserConversationMsgResp { Count : int32 ( len ( conversations ) ) } , nil
}
@ -800,8 +782,7 @@ func (c *conversationServer) setConversationMinSeqAndLatestMsgDestructTime(ctx c
"latest_msg_destruct_time" : latestMsgDestructTime ,
}
if minSeq >= 0 {
req := & pbmsg . SetUserConversationMinSeqReq { ConversationID : conversationID , OwnerUserID : [ ] string { ownerUserID } , MinSeq : minSeq }
if _ , err := pbmsg . SetUserConversationMinSeqCaller . Invoke ( ctx , req ) ; err != nil {
if err := c . msgClient . SetUserConversationMin ( ctx , conversationID , [ ] string { ownerUserID } , minSeq ) ; err != nil {
return err
}
update [ "min_seq" ] = minSeq