Files
open-im-server/internal/rpc/msg/pull_message.go
T

160 lines
4.9 KiB
Go
Raw Normal View History

2021-12-23 17:34:32 +08:00
package msg
2021-05-26 19:40:38 +08:00
import (
"context"
2021-09-13 15:48:19 +08:00
"github.com/garyburd/redigo/redis"
2021-05-26 19:40:38 +08:00
commonDB "Open_IM/pkg/common/db"
"Open_IM/pkg/common/log"
2021-12-23 17:34:32 +08:00
"Open_IM/pkg/proto/sdk_ws"
2021-05-26 19:40:38 +08:00
"sort"
"strings"
2021-10-11 22:00:38 +08:00
pbMsg "Open_IM/pkg/proto/chat"
2021-05-26 19:40:38 +08:00
)
func (rpc *rpcChat) GetMaxAndMinSeq(_ context.Context, in *pbMsg.GetMaxAndMinSeqReq) (*pbMsg.GetMaxAndMinSeqResp, error) {
log.InfoByKv("rpc getMaxAndMinSeq is arriving", in.OperationID, in.String())
2021-05-26 19:40:38 +08:00
//seq, err := model.GetBiggestSeqFromReceive(in.UserID)
maxSeq, err1 := commonDB.DB.GetUserMaxSeq(in.UserID)
minSeq, err2 := commonDB.DB.GetUserMinSeq(in.UserID)
resp := new(pbMsg.GetMaxAndMinSeqResp)
if err1 == nil {
resp.MaxSeq = maxSeq
} else if err1 == redis.ErrNil {
resp.MaxSeq = 0
2021-05-26 19:40:38 +08:00
} else {
log.NewError(in.OperationID, "getMaxSeq from redis error", in.String(), err1.Error())
resp.MaxSeq = -1
resp.ErrCode = 200
resp.ErrMsg = "redis get err"
2021-05-26 19:40:38 +08:00
}
if err2 == nil {
resp.MinSeq = minSeq
} else if err2 == redis.ErrNil {
resp.MinSeq = 0
} else {
log.NewError(in.OperationID, "getMaxSeq from redis error", in.String(), err2.Error())
resp.MinSeq = -1
resp.ErrCode = 201
resp.ErrMsg = "redis get err"
}
return resp, nil
2021-05-26 19:40:38 +08:00
}
2021-12-23 17:48:06 +08:00
func (rpc *rpcChat) PullMessage(_ context.Context, in *open_im_sdk.PullMessageReq) (*open_im_sdk.PullMessageResp, error) {
2021-05-26 19:40:38 +08:00
log.InfoByKv("rpc pullMessage is arriving", in.OperationID, "args", in.String())
2021-12-23 17:48:06 +08:00
resp := new(open_im_sdk.PullMessageResp)
2021-12-23 17:34:32 +08:00
var respSingleMsgFormat []*open_im_sdk.GatherFormat
var respGroupMsgFormat []*open_im_sdk.GatherFormat
SingleMsgFormat, GroupMsgFormat, MaxSeq, MinSeq, err := commonDB.DB.GetMsgBySeqRange(in.UserID, in.SeqBegin, in.SeqEnd)
2021-05-26 19:40:38 +08:00
if err != nil {
log.ErrorByKv("pullMsg data error", in.OperationID, in.String())
resp.ErrCode = 1
resp.ErrMsg = err.Error()
return resp, nil
}
respSingleMsgFormat = singleMsgHandleByUser(SingleMsgFormat, in.UserID)
respGroupMsgFormat = groupMsgHandleByUser(GroupMsgFormat)
2021-12-23 17:48:06 +08:00
return &open_im_sdk.PullMessageResp{
ErrCode: 0,
ErrMsg: "",
MaxSeq: MaxSeq,
MinSeq: MinSeq,
2021-12-23 17:48:06 +08:00
SingleUserMsg: respSingleMsgFormat,
GroupUserMsg: respGroupMsgFormat,
}, nil
}
2021-12-23 17:34:32 +08:00
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())
2021-12-23 17:34:32 +08:00
resp := new(open_im_sdk.PullMessageBySeqListResp)
var respSingleMsgFormat []*open_im_sdk.GatherFormat
var respGroupMsgFormat []*open_im_sdk.GatherFormat
SingleMsgFormat, GroupMsgFormat, MaxSeq, MinSeq, err := commonDB.DB.GetMsgBySeqList(in.UserID, in.SeqList)
if err != nil {
log.ErrorByKv("PullMessageBySeqList data error", in.OperationID, in.String())
resp.ErrCode = 1
resp.ErrMsg = err.Error()
return resp, nil
}
respSingleMsgFormat = singleMsgHandleByUser(SingleMsgFormat, in.UserID)
respGroupMsgFormat = groupMsgHandleByUser(GroupMsgFormat)
2021-12-23 17:34:32 +08:00
return &open_im_sdk.PullMessageBySeqListResp{
2021-05-26 19:40:38 +08:00
ErrCode: 0,
ErrMsg: "",
MaxSeq: MaxSeq,
MinSeq: MinSeq,
SingleUserMsg: respSingleMsgFormat,
GroupUserMsg: respGroupMsgFormat,
}, nil
}
2021-12-23 17:34:32 +08:00
func singleMsgHandleByUser(allMsg []*open_im_sdk.MsgData, ownerId string) []*open_im_sdk.GatherFormat {
2021-05-26 19:40:38 +08:00
var userid string
2021-12-23 17:34:32 +08:00
var respMsgFormat []*open_im_sdk.GatherFormat
2021-05-26 19:40:38 +08:00
m := make(map[string]MsgFormats)
2021-05-31 10:03:57 +08:00
//Gather messages in the dimension of users
2021-05-26 19:40:38 +08:00
for _, v := range allMsg {
if v.RecvID != ownerId {
userid = v.RecvID
} else {
userid = v.SendID
}
if value, ok := m[userid]; !ok {
var t MsgFormats
m[userid] = append(t, v)
} else {
m[userid] = append(value, v)
}
}
2021-05-31 10:03:57 +08:00
//Return in pb format
2021-05-26 19:40:38 +08:00
for user, msg := range m {
2021-12-23 17:34:32 +08:00
tempUserMsg := new(open_im_sdk.GatherFormat)
2021-12-23 17:48:06 +08:00
tempUserMsg.Id = user
2021-05-26 19:40:38 +08:00
tempUserMsg.List = msg
sort.Sort(msg)
respMsgFormat = append(respMsgFormat, tempUserMsg)
}
return respMsgFormat
}
2021-12-23 17:34:32 +08:00
func groupMsgHandleByUser(allMsg []*open_im_sdk.MsgData) []*open_im_sdk.GatherFormat {
var respMsgFormat []*open_im_sdk.GatherFormat
2021-05-26 19:40:38 +08:00
m := make(map[string]MsgFormats)
2021-05-31 10:03:57 +08:00
//Gather messages in the dimension of users
2021-05-26 19:40:38 +08:00
for _, v := range allMsg {
2021-05-31 10:03:57 +08:00
//Get group ID
2021-05-26 19:40:38 +08:00
groupID := strings.Split(v.RecvID, " ")[1]
if value, ok := m[groupID]; !ok {
var t MsgFormats
m[groupID] = append(t, v)
} else {
m[groupID] = append(value, v)
}
}
2021-05-31 10:03:57 +08:00
//Return in pb format
2021-05-26 19:40:38 +08:00
for groupID, msg := range m {
2021-12-23 17:34:32 +08:00
tempUserMsg := new(open_im_sdk.GatherFormat)
2021-12-23 17:48:06 +08:00
tempUserMsg.Id = groupID
2021-05-26 19:40:38 +08:00
tempUserMsg.List = msg
sort.Sort(msg)
respMsgFormat = append(respMsgFormat, tempUserMsg)
}
return respMsgFormat
}
2021-12-23 17:34:32 +08:00
type MsgFormats []*open_im_sdk.MsgData
2021-05-26 19:40:38 +08:00
2021-05-31 10:03:57 +08:00
// Implement the sort.Interface interface to get the number of elements method
2021-05-26 19:40:38 +08:00
func (s MsgFormats) Len() int {
return len(s)
}
2021-05-31 10:03:57 +08:00
//Implement the sort.Interface interface comparison element method
2021-05-26 19:40:38 +08:00
func (s MsgFormats) Less(i, j int) bool {
return s[i].SendTime < s[j].SendTime
}
2021-05-31 10:03:57 +08:00
//Implement the sort.Interface interface exchange element method
2021-05-26 19:40:38 +08:00
func (s MsgFormats) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}