You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.5 KiB
127 lines
4.5 KiB
package msg
|
|
|
|
import (
|
|
"Open_IM/pkg/utils"
|
|
"context"
|
|
go_redis "github.com/go-redis/redis/v8"
|
|
|
|
commonDB "Open_IM/pkg/common/db"
|
|
"Open_IM/pkg/common/log"
|
|
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
|
|
|
|
promePkg "Open_IM/pkg/common/prometheus"
|
|
)
|
|
|
|
func (rpc *rpcChat) GetMaxAndMinSeq(_ context.Context, in *open_im_sdk.GetMaxAndMinSeqReq) (*open_im_sdk.GetMaxAndMinSeqResp, error) {
|
|
log.NewInfo(in.OperationID, "rpc getMaxAndMinSeq is arriving", in.String())
|
|
resp := new(open_im_sdk.GetMaxAndMinSeqResp)
|
|
m := make(map[string]*open_im_sdk.MaxAndMinSeq)
|
|
var maxSeq, minSeq uint64
|
|
var err1, err2 error
|
|
maxSeq, err1 = commonDB.DB.GetUserMaxSeq(in.UserID)
|
|
minSeq, err2 = commonDB.DB.GetUserMinSeq(in.UserID)
|
|
if (err1 != nil && err1 != go_redis.Nil) || (err2 != nil && err2 != go_redis.Nil) {
|
|
log.NewError(in.OperationID, "getMaxSeq from redis error", in.String())
|
|
if err1 != nil {
|
|
log.NewError(in.OperationID, utils.GetSelfFuncName(), err1.Error())
|
|
}
|
|
if err2 != nil {
|
|
log.NewError(in.OperationID, utils.GetSelfFuncName(), err2.Error())
|
|
}
|
|
resp.ErrCode = 200
|
|
resp.ErrMsg = "redis get err"
|
|
return resp, nil
|
|
}
|
|
resp.MaxSeq = uint32(maxSeq)
|
|
resp.MinSeq = uint32(minSeq)
|
|
for _, groupID := range in.GroupIDList {
|
|
x := new(open_im_sdk.MaxAndMinSeq)
|
|
maxSeq, _ := commonDB.DB.GetGroupMaxSeq(groupID)
|
|
minSeq, _ := commonDB.DB.GetGroupUserMinSeq(groupID, in.UserID)
|
|
x.MaxSeq = uint32(maxSeq)
|
|
x.MinSeq = uint32(minSeq)
|
|
m[groupID] = x
|
|
}
|
|
resp.GroupMaxAndMinSeq = m
|
|
return resp, nil
|
|
}
|
|
|
|
func (rpc *rpcChat) PullMessageBySeqList(_ context.Context, in *open_im_sdk.PullMessageBySeqListReq) (*open_im_sdk.PullMessageBySeqListResp, error) {
|
|
log.NewInfo(in.OperationID, "rpc PullMessageBySeqList is arriving", in.String())
|
|
resp := new(open_im_sdk.PullMessageBySeqListResp)
|
|
m := make(map[string]*open_im_sdk.MsgDataList)
|
|
redisMsgList, failedSeqList, err := commonDB.DB.GetMessageListBySeq(in.UserID, in.SeqList, in.OperationID)
|
|
if err != nil {
|
|
if err != go_redis.Nil {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromRedisFailedCounter, len(failedSeqList))
|
|
log.Error(in.OperationID, "get message from redis exception", err.Error(), failedSeqList)
|
|
} else {
|
|
log.Debug(in.OperationID, "get message from redis is nil", failedSeqList)
|
|
}
|
|
msgList, err1 := commonDB.DB.GetMsgBySeqListMongo2(in.UserID, failedSeqList, in.OperationID)
|
|
if err1 != nil {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromMongoFailedCounter, len(failedSeqList))
|
|
log.Error(in.OperationID, "PullMessageBySeqList data error", in.String(), err.Error())
|
|
resp.ErrCode = 201
|
|
resp.ErrMsg = err.Error()
|
|
return resp, nil
|
|
} else {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromMongoSuccessCounter, len(msgList))
|
|
redisMsgList = append(redisMsgList, msgList...)
|
|
resp.List = redisMsgList
|
|
}
|
|
} else {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromRedisSuccessCounter, len(redisMsgList))
|
|
resp.List = redisMsgList
|
|
}
|
|
|
|
for k, v := range in.GroupSeqList {
|
|
x := new(open_im_sdk.MsgDataList)
|
|
redisMsgList, failedSeqList, err := commonDB.DB.GetMessageListBySeq(k, v.SeqList, in.OperationID)
|
|
if err != nil {
|
|
if err != go_redis.Nil {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromRedisFailedCounter, len(failedSeqList))
|
|
log.Error(in.OperationID, "get message from redis exception", err.Error(), failedSeqList)
|
|
} else {
|
|
log.Debug(in.OperationID, "get message from redis is nil", failedSeqList)
|
|
}
|
|
msgList, err1 := commonDB.DB.GetSuperGroupMsgBySeqListMongo(k, failedSeqList, in.OperationID)
|
|
if err1 != nil {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromMongoFailedCounter, len(failedSeqList))
|
|
log.Error(in.OperationID, "PullMessageBySeqList data error", in.String(), err.Error())
|
|
resp.ErrCode = 201
|
|
resp.ErrMsg = err.Error()
|
|
return resp, nil
|
|
} else {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromMongoSuccessCounter, len(msgList))
|
|
redisMsgList = append(redisMsgList, msgList...)
|
|
x.MsgDataList = redisMsgList
|
|
m[k] = x
|
|
}
|
|
} else {
|
|
promePkg.PromeAdd(promePkg.MsgPullFromRedisSuccessCounter, len(redisMsgList))
|
|
x.MsgDataList = redisMsgList
|
|
m[k] = x
|
|
}
|
|
}
|
|
resp.GroupMsgDataList = m
|
|
return resp, nil
|
|
}
|
|
|
|
type MsgFormats []*open_im_sdk.MsgData
|
|
|
|
// Implement the sort.Interface interface to get the number of elements method
|
|
func (s MsgFormats) Len() int {
|
|
return len(s)
|
|
}
|
|
|
|
//Implement the sort.Interface interface comparison element method
|
|
func (s MsgFormats) Less(i, j int) bool {
|
|
return s[i].SendTime < s[j].SendTime
|
|
}
|
|
|
|
//Implement the sort.Interface interface exchange element method
|
|
func (s MsgFormats) Swap(i, j int) {
|
|
s[i], s[j] = s[j], s[i]
|
|
}
|