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.
Open-IM-Server/pkg/common/db/cache/msg.go

553 lines
21 KiB

2 years ago
package cache
import (
"context"
"errors"
2 years ago
"strconv"
"time"
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
2 years ago
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/config"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/log"
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
"github.com/gogo/protobuf/jsonpb"
"google.golang.org/protobuf/proto"
2 years ago
2 years ago
"github.com/go-redis/redis/v8"
)
const (
2 years ago
maxSeq = "MAX_SEQ:"
minSeq = "MIN_SEQ:"
conversationUserMinSeq = "CON_USER_MIN_SEQ:"
appleDeviceToken = "DEVICE_TOKEN"
getuiToken = "GETUI_TOKEN"
getuiTaskID = "GETUI_TASK_ID"
messageCache = "MESSAGE_CACHE:"
signalCache = "SIGNAL_CACHE:"
signalListCache = "SIGNAL_LIST_CACHE:"
fcmToken = "FCM_TOKEN:"
2 years ago
sendMsgFailedFlag = "SEND_MSG_FAILED_FLAG:"
userBadgeUnreadCountSum = "USER_BADGE_UNREAD_COUNT_SUM:"
exTypeKeyLocker = "EX_LOCK:"
2 years ago
uidPidToken = "UID_PID_TOKEN_STATUS:"
)
2 years ago
type MsgModel interface {
2 years ago
SetMaxSeq(ctx context.Context, conversationID string, maxSeq int64) error
GetMaxSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error)
GetMaxSeq(ctx context.Context, conversationID string) (int64, error)
SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error
GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error)
GetMinSeq(ctx context.Context, conversationID string) (int64, error)
GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error)
GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (map[string]int64, error)
SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error
SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error)
2 years ago
AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error
GetTokensWithoutError(ctx context.Context, userID, platformID string) (map[string]int, error)
2 years ago
SetTokenMapByUidPid(ctx context.Context, userID string, platform string, m map[string]int) error
DeleteTokenByUidPid(ctx context.Context, userID string, platform string, fields []string) error
2 years ago
GetMessagesBySeq(ctx context.Context, conversationID string, seqList []int64) (seqMsg []*sdkws.MsgData, failedSeqList []int64, err error)
SetMessageToCache(ctx context.Context, conversationID string, msgList []*sdkws.MsgData) (int, error)
DeleteMessageFromCache(ctx context.Context, conversationID string, msgList []*sdkws.MsgData) error
2 years ago
CleanUpOneConversationAllMsg(ctx context.Context, conversationID string) error
2 years ago
HandleSignalInvite(ctx context.Context, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error)
2 years ago
GetSignalInvitationInfoByClientMsgID(ctx context.Context, clientMsgID string) (invitationInfo *sdkws.SignalInviteReq, err error)
GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *sdkws.SignalInviteReq, err error)
2 years ago
DelUserSignalList(ctx context.Context, userID string) error
2 years ago
DelMsgFromCache(ctx context.Context, userID string, seqList []int64) error
2 years ago
SetGetuiToken(ctx context.Context, token string, expireTime int64) error
GetGetuiToken(ctx context.Context) (string, error)
SetGetuiTaskID(ctx context.Context, taskID string, expireTime int64) error
GetGetuiTaskID(ctx context.Context) (string, error)
2 years ago
SetSendMsgStatus(ctx context.Context, id string, status int32) error
GetSendMsgStatus(ctx context.Context, id string) (int32, error)
2 years ago
SetFcmToken(ctx context.Context, account string, platformID int, fcmToken string, expireTime int64) (err error)
GetFcmToken(ctx context.Context, account string, platformID int) (string, error)
DelFcmToken(ctx context.Context, account string, platformID int) error
IncrUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error)
SetUserBadgeUnreadCountSum(ctx context.Context, userID string, value int) error
GetUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error)
2 years ago
JudgeMessageReactionExist(ctx context.Context, clientMsgID string, sessionType int32) (bool, error)
2 years ago
GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error)
DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error
SetMessageReactionExpire(ctx context.Context, clientMsgID string, sessionType int32, expiration time.Duration) (bool, error)
GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error)
SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error
LockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error
UnLockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error
2 years ago
}
2 years ago
func NewMsgCacheModel(client redis.UniversalClient) MsgModel {
return &msgCache{rdb: client}
2 years ago
}
2 years ago
type msgCache struct {
2 years ago
rdb redis.UniversalClient
2 years ago
}
2 years ago
// 兼容老版本调用
2 years ago
func (c *msgCache) DelKeys() {
2 years ago
for _, key := range []string{"GROUP_CACHE:", "FRIEND_RELATION_CACHE:", "BLACK_LIST_CACHE:", "USER_INFO_CACHE:", "GROUP_INFO_CACHE:", "JOINED_GROUP_LIST_CACHE:",
"GROUP_MEMBER_INFO_CACHE:", "GROUP_ALL_MEMBER_INFO_CACHE:", "ALL_FRIEND_INFO_CACHE:"} {
fName := utils.GetSelfFuncName()
var cursor uint64
var n int
for {
var keys []string
var err error
keys, cursor, err = c.rdb.Scan(context.Background(), cursor, key+"*", scanCount).Result()
if err != nil {
panic(err.Error())
}
n += len(keys)
// for each for redis cluster
for _, key := range keys {
if err = c.rdb.Del(context.Background(), key).Err(); err != nil {
log.NewError("", fName, key, err.Error())
err = c.rdb.Del(context.Background(), key).Err()
if err != nil {
panic(err.Error())
}
}
}
if cursor == 0 {
break
}
}
}
}
2 years ago
func (c *msgCache) getMaxSeqKey(conversationID string) string {
return maxSeq + conversationID
2 years ago
}
2 years ago
func (c *msgCache) getMinSeqKey(conversationID string) string {
return minSeq + conversationID
2 years ago
}
2 years ago
func (c *msgCache) setSeq(ctx context.Context, conversationID string, seq int64, getkey func(conversationID string) string) error {
return utils.Wrap1(c.rdb.Set(ctx, getkey(conversationID), seq, 0).Err())
}
2 years ago
func (c *msgCache) getSeq(ctx context.Context, conversationID string, getkey func(conversationID string) string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, getkey(conversationID)).Int64())
}
2 years ago
func (c *msgCache) getSeqs(ctx context.Context, items []string, getkey func(s string) string) (m map[string]int64, err error) {
pipe := c.rdb.Pipeline()
for _, v := range items {
2 years ago
log.ZDebug(ctx, "getSeqs", "getkey", getkey(v))
2 years ago
if err := pipe.Get(ctx, getkey(v)).Err(); err != nil && err != redis.Nil {
2 years ago
return nil, errs.Wrap(err)
2 years ago
}
}
result, err := pipe.Exec(ctx)
2 years ago
if err != nil && err != redis.Nil {
2 years ago
return nil, errs.Wrap(err)
}
m = make(map[string]int64, len(items))
for i, v := range result {
2 years ago
seq := v.(*redis.StringCmd)
2 years ago
if seq.Err() != nil && seq.Err() != redis.Nil {
2 years ago
return nil, errs.Wrap(v.Err())
}
2 years ago
m[items[i]] = utils.StringToInt64(seq.Val())
2 years ago
}
return m, nil
}
2 years ago
func (c *msgCache) SetMaxSeq(ctx context.Context, conversationID string, maxSeq int64) error {
return c.setSeq(ctx, conversationID, maxSeq, c.getMaxSeqKey)
}
2 years ago
func (c *msgCache) GetMaxSeqs(ctx context.Context, conversationIDs []string) (m map[string]int64, err error) {
return c.getSeqs(ctx, conversationIDs, c.getMaxSeqKey)
}
2 years ago
func (c *msgCache) GetMaxSeq(ctx context.Context, conversationID string) (int64, error) {
return c.getSeq(ctx, conversationID, c.getMaxSeqKey)
}
func (c *msgCache) SetMinSeq(ctx context.Context, conversationID string, minSeq int64) error {
return c.setSeq(ctx, conversationID, minSeq, c.getMinSeqKey)
}
func (c *msgCache) GetMinSeqs(ctx context.Context, conversationIDs []string) (map[string]int64, error) {
return c.getSeqs(ctx, conversationIDs, c.getMinSeqKey)
}
func (c *msgCache) GetMinSeq(ctx context.Context, conversationID string) (int64, error) {
return c.getSeq(ctx, conversationID, c.getMinSeqKey)
}
2 years ago
func (c *msgCache) getConversationUserMinSeqKey(conversationID, userID string) string {
return conversationUserMinSeq + "g:" + conversationID + "u:" + userID
2 years ago
}
2 years ago
func (c *msgCache) GetConversationUserMinSeq(ctx context.Context, conversationID string, userID string) (int64, error) {
return utils.Wrap2(c.rdb.Get(ctx, c.getConversationUserMinSeqKey(conversationID, userID)).Int64())
2 years ago
}
2 years ago
func (c *msgCache) GetConversationUserMinSeqs(ctx context.Context, conversationID string, userIDs []string) (m map[string]int64, err error) {
return c.getSeqs(ctx, userIDs, func(userID string) string {
return c.getConversationUserMinSeqKey(conversationID, userID)
})
}
func (c *msgCache) SetConversationUserMinSeq(ctx context.Context, conversationID string, userID string, minSeq int64) error {
return utils.Wrap1(c.rdb.Set(ctx, c.getConversationUserMinSeqKey(conversationID, userID), minSeq, 0).Err())
2 years ago
}
2 years ago
func (c *msgCache) SetConversationUserMinSeqs(ctx context.Context, conversationID string, seqs map[string]int64) (err error) {
pipe := c.rdb.Pipeline()
for userID, minSeq := range seqs {
err = pipe.Set(ctx, c.getConversationUserMinSeqKey(conversationID, userID), minSeq, 0).Err()
if err != nil {
return errs.Wrap(err)
}
}
_, err = pipe.Exec(ctx)
return err
2 years ago
}
2 years ago
func (c *msgCache) AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error {
2 years ago
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2 years ago
return errs.Wrap(c.rdb.HSet(ctx, key, token, flag).Err())
}
2 years ago
func (c *msgCache) GetTokensWithoutError(ctx context.Context, userID, platformID string) (map[string]int, error) {
key := uidPidToken + userID + ":" + platformID
2 years ago
m, err := c.rdb.HGetAll(ctx, key).Result()
2 years ago
if err != nil {
2 years ago
return nil, errs.Wrap(err)
}
mm := make(map[string]int)
for k, v := range m {
mm[k] = utils.StringToInt(v)
}
2 years ago
return mm, nil
}
2 years ago
func (c *msgCache) SetTokenMapByUidPid(ctx context.Context, userID string, platform string, m map[string]int) error {
2 years ago
key := uidPidToken + userID + ":" + platform
2 years ago
mm := make(map[string]interface{})
for k, v := range m {
mm[k] = v
}
2 years ago
return errs.Wrap(c.rdb.HSet(ctx, key, mm).Err())
}
2 years ago
2 years ago
func (c *msgCache) DeleteTokenByUidPid(ctx context.Context, userID string, platform string, fields []string) error {
2 years ago
key := uidPidToken + userID + ":" + platform
2 years ago
return errs.Wrap(c.rdb.HDel(ctx, key, fields...).Err())
}
2 years ago
func (c *msgCache) getMessageCacheKey(conversationID string, seq int64) string {
return messageCache + conversationID + "_" + strconv.Itoa(int(seq))
}
2 years ago
func (c *msgCache) allMessageCacheKey(conversationID string) string {
return messageCache + conversationID + "_*"
}
2 years ago
func (c *msgCache) GetMessagesBySeq(ctx context.Context, conversationID string, seqs []int64) (seqMsgs []*sdkws.MsgData, failedSeqs []int64, err error) {
pipe := c.rdb.Pipeline()
for _, v := range seqs {
//MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
2 years ago
key := c.getMessageCacheKey(conversationID, v)
if err := pipe.Get(ctx, key).Err(); err != nil && err != redis.Nil {
return nil, nil, err
}
}
result, err := pipe.Exec(ctx)
for i, v := range result {
2 years ago
cmd := v.(*redis.StringCmd)
if cmd.Err() != nil {
failedSeqs = append(failedSeqs, seqs[i])
2 years ago
} else {
2 years ago
msg := sdkws.MsgData{}
2 years ago
err = jsonpb.UnmarshalString(cmd.Val(), &msg)
2 years ago
if err == nil {
2 years ago
if msg.Status != constant.MsgDeleted {
seqMsgs = append(seqMsgs, &msg)
2 years ago
continue
2 years ago
}
2 years ago
} else {
log.ZWarn(ctx, "UnmarshalString failed", err, "conversationID", conversationID, "seq", seqs[i])
}
2 years ago
failedSeqs = append(failedSeqs, seqs[i])
}
}
return seqMsgs, failedSeqs, err
}
2 years ago
func (c *msgCache) SetMessageToCache(ctx context.Context, conversationID string, msgs []*sdkws.MsgData) (int, error) {
2 years ago
pipe := c.rdb.Pipeline()
2 years ago
var failedMsgs []*sdkws.MsgData
2 years ago
for _, msg := range msgs {
key := c.getMessageCacheKey(conversationID, msg.Seq)
2 years ago
s, err := utils.Pb2String(msg)
if err != nil {
2 years ago
return 0, errs.Wrap(err)
}
err = pipe.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err()
if err != nil {
2 years ago
failedMsgs = append(failedMsgs, msg)
log.ZWarn(ctx, "set msg 2 cache failed", err, "msg", failedMsgs)
}
}
_, err := pipe.Exec(ctx)
2 years ago
return len(failedMsgs), err
}
2 years ago
2 years ago
func (c *msgCache) DeleteMessageFromCache(ctx context.Context, userID string, msgList []*sdkws.MsgData) error {
pipe := c.rdb.Pipeline()
2 years ago
for _, v := range msgList {
2 years ago
if err := pipe.Del(ctx, c.getMessageCacheKey(userID, v.Seq)).Err(); err != nil {
return errs.Wrap(err)
2 years ago
}
}
_, err := pipe.Exec(ctx)
2 years ago
return errs.Wrap(err)
}
2 years ago
func (c *msgCache) CleanUpOneConversationAllMsg(ctx context.Context, conversationID string) error {
vals, err := c.rdb.Keys(ctx, c.allMessageCacheKey(conversationID)).Result()
2 years ago
if err == redis.Nil {
return nil
}
if err != nil {
2 years ago
return errs.Wrap(err)
}
pipe := c.rdb.Pipeline()
2 years ago
for _, v := range vals {
if err := pipe.Del(ctx, v).Err(); err != nil {
2 years ago
return errs.Wrap(err)
2 years ago
}
}
_, err = pipe.Exec(ctx)
2 years ago
return errs.Wrap(err)
}
2 years ago
func (c *msgCache) HandleSignalInvite(ctx context.Context, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error) {
2 years ago
req := &sdkws.SignalReq{}
if err := proto.Unmarshal(msg.Content, req); err != nil {
2 years ago
return false, errs.Wrap(err)
}
2 years ago
var inviteeUserIDs []string
2 years ago
var isInviteSignal bool
switch signalInfo := req.Payload.(type) {
2 years ago
case *sdkws.SignalReq_Invite:
inviteeUserIDs = signalInfo.Invite.Invitation.InviteeUserIDList
2 years ago
isInviteSignal = true
2 years ago
case *sdkws.SignalReq_InviteInGroup:
inviteeUserIDs = signalInfo.InviteInGroup.Invitation.InviteeUserIDList
2 years ago
isInviteSignal = true
2 years ago
if !utils.Contain(pushToUserID, inviteeUserIDs...) {
2 years ago
return false, nil
}
2 years ago
case *sdkws.SignalReq_HungUp, *sdkws.SignalReq_Cancel, *sdkws.SignalReq_Reject, *sdkws.SignalReq_Accept:
2 years ago
return false, errs.Wrap(errors.New("signalInfo do not need offlinePush"))
default:
2 years ago
return false, nil
}
2 years ago
if isInviteSignal {
pipe := c.rdb.Pipeline()
2 years ago
for _, userID := range inviteeUserIDs {
2 years ago
timeout, err := strconv.Atoi(config.Config.Rtc.SignalTimeout)
if err != nil {
2 years ago
return false, errs.Wrap(err)
2 years ago
}
keys := signalListCache + userID
err = pipe.LPush(ctx, keys, msg.ClientMsgID).Err()
2 years ago
if err != nil {
2 years ago
return false, errs.Wrap(err)
2 years ago
}
err = pipe.Expire(ctx, keys, time.Duration(timeout)*time.Second).Err()
2 years ago
if err != nil {
2 years ago
return false, errs.Wrap(err)
2 years ago
}
2 years ago
key := signalCache + msg.ClientMsgID
err = pipe.Set(ctx, key, msg.Content, time.Duration(timeout)*time.Second).Err()
2 years ago
if err != nil {
2 years ago
return false, errs.Wrap(err)
2 years ago
}
}
_, err := pipe.Exec(ctx)
if err != nil {
2 years ago
return false, errs.Wrap(err)
}
}
2 years ago
return true, nil
}
2 years ago
func (c *msgCache) GetSignalInvitationInfoByClientMsgID(ctx context.Context, clientMsgID string) (signalInviteReq *sdkws.SignalInviteReq, err error) {
2 years ago
bytes, err := c.rdb.Get(ctx, signalCache+clientMsgID).Bytes()
if err != nil {
2 years ago
return nil, errs.Wrap(err)
}
2 years ago
signalReq := &sdkws.SignalReq{}
if err = proto.Unmarshal(bytes, signalReq); err != nil {
2 years ago
return nil, errs.Wrap(err)
}
2 years ago
signalInviteReq = &sdkws.SignalInviteReq{}
switch req := signalReq.Payload.(type) {
case *sdkws.SignalReq_Invite:
signalInviteReq.Invitation = req.Invite.Invitation
signalInviteReq.OpUserID = req.Invite.OpUserID
case *sdkws.SignalReq_InviteInGroup:
signalInviteReq.Invitation = req.InviteInGroup.Invitation
signalInviteReq.OpUserID = req.InviteInGroup.OpUserID
}
2 years ago
return signalInviteReq, nil
}
2 years ago
func (c *msgCache) GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *sdkws.SignalInviteReq, err error) {
2 years ago
key, err := c.rdb.LPop(ctx, signalListCache+userID).Result()
if err != nil {
2 years ago
return nil, errs.Wrap(err)
}
2 years ago
invitationInfo, err = c.GetSignalInvitationInfoByClientMsgID(ctx, key)
2 years ago
if err != nil {
2 years ago
return nil, err
2 years ago
}
2 years ago
return invitationInfo, errs.Wrap(c.DelUserSignalList(ctx, userID))
2 years ago
}
2 years ago
func (c *msgCache) DelUserSignalList(ctx context.Context, userID string) error {
2 years ago
return errs.Wrap(c.rdb.Del(ctx, signalListCache+userID).Err())
}
2 years ago
func (c *msgCache) DelMsgFromCache(ctx context.Context, userID string, seqs []int64) error {
for _, seq := range seqs {
key := c.getMessageCacheKey(userID, seq)
2 years ago
result, err := c.rdb.Get(ctx, key).Result()
2 years ago
if err != nil {
2 years ago
if err == redis.Nil {
2 years ago
continue
2 years ago
}
2 years ago
return errs.Wrap(err)
2 years ago
}
2 years ago
var msg sdkws.MsgData
2 years ago
if err := jsonpb.UnmarshalString(result, &msg); err != nil {
return err
}
msg.Status = constant.MsgDeleted
s, err := utils.Pb2String(&msg)
if err != nil {
2 years ago
return errs.Wrap(err)
}
2 years ago
if err := c.rdb.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err(); err != nil {
2 years ago
return errs.Wrap(err)
}
}
2 years ago
return nil
}
2 years ago
2 years ago
func (c *msgCache) SetGetuiToken(ctx context.Context, token string, expireTime int64) error {
2 years ago
return errs.Wrap(c.rdb.Set(ctx, getuiToken, token, time.Duration(expireTime)*time.Second).Err())
2 years ago
}
2 years ago
func (c *msgCache) GetGetuiToken(ctx context.Context) (string, error) {
2 years ago
return utils.Wrap2(c.rdb.Get(ctx, getuiToken).Result())
2 years ago
}
2 years ago
2 years ago
func (c *msgCache) SetGetuiTaskID(ctx context.Context, taskID string, expireTime int64) error {
2 years ago
return errs.Wrap(c.rdb.Set(ctx, getuiTaskID, taskID, time.Duration(expireTime)*time.Second).Err())
2 years ago
}
2 years ago
func (c *msgCache) GetGetuiTaskID(ctx context.Context) (string, error) {
2 years ago
return utils.Wrap2(c.rdb.Get(ctx, getuiTaskID).Result())
2 years ago
}
2 years ago
func (c *msgCache) SetSendMsgStatus(ctx context.Context, id string, status int32) error {
2 years ago
return errs.Wrap(c.rdb.Set(ctx, sendMsgFailedFlag+id, status, time.Hour*24).Err())
2 years ago
}
2 years ago
func (c *msgCache) GetSendMsgStatus(ctx context.Context, id string) (int32, error) {
2 years ago
result, err := c.rdb.Get(ctx, sendMsgFailedFlag+id).Int()
2 years ago
return int32(result), errs.Wrap(err)
2 years ago
}
2 years ago
2 years ago
func (c *msgCache) SetFcmToken(ctx context.Context, account string, platformID int, fcmToken string, expireTime int64) (err error) {
2 years ago
return errs.Wrap(c.rdb.Set(ctx, fcmToken+account+":"+strconv.Itoa(platformID), fcmToken, time.Duration(expireTime)*time.Second).Err())
2 years ago
}
2 years ago
func (c *msgCache) GetFcmToken(ctx context.Context, account string, platformID int) (string, error) {
2 years ago
return utils.Wrap2(c.rdb.Get(ctx, fcmToken+account+":"+strconv.Itoa(platformID)).Result())
2 years ago
}
2 years ago
func (c *msgCache) DelFcmToken(ctx context.Context, account string, platformID int) error {
2 years ago
return errs.Wrap(c.rdb.Del(ctx, fcmToken+account+":"+strconv.Itoa(platformID)).Err())
}
2 years ago
func (c *msgCache) IncrUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error) {
2 years ago
seq, err := c.rdb.Incr(ctx, userBadgeUnreadCountSum+userID).Result()
2 years ago
return int(seq), errs.Wrap(err)
}
2 years ago
2 years ago
func (c *msgCache) SetUserBadgeUnreadCountSum(ctx context.Context, userID string, value int) error {
2 years ago
return errs.Wrap(c.rdb.Set(ctx, userBadgeUnreadCountSum+userID, value, 0).Err())
2 years ago
}
2 years ago
2 years ago
func (c *msgCache) GetUserBadgeUnreadCountSum(ctx context.Context, userID string) (int, error) {
2 years ago
return utils.Wrap2(c.rdb.Get(ctx, userBadgeUnreadCountSum+userID).Int())
2 years ago
}
2 years ago
2 years ago
func (c *msgCache) LockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
2 years ago
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2 years ago
return errs.Wrap(c.rdb.SetNX(ctx, key, 1, time.Minute).Err())
2 years ago
}
2 years ago
func (c *msgCache) UnLockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
2 years ago
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2 years ago
return errs.Wrap(c.rdb.Del(ctx, key).Err())
2 years ago
}
2 years ago
func (c *msgCache) getMessageReactionExPrefix(clientMsgID string, sessionType int32) string {
2 years ago
switch sessionType {
case constant.SingleChatType:
return "EX_SINGLE_" + clientMsgID
case constant.GroupChatType:
return "EX_GROUP_" + clientMsgID
case constant.SuperGroupChatType:
return "EX_SUPER_GROUP_" + clientMsgID
case constant.NotificationChatType:
return "EX_NOTIFICATION" + clientMsgID
}
return ""
}
2 years ago
2 years ago
func (c *msgCache) JudgeMessageReactionExist(ctx context.Context, clientMsgID string, sessionType int32) (bool, error) {
2 years ago
n, err := c.rdb.Exists(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType)).Result()
2 years ago
if err != nil {
return false, utils.Wrap(err, "")
}
return n > 0, nil
}
2 years ago
func (c *msgCache) SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error {
2 years ago
return errs.Wrap(c.rdb.HSet(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), typeKey, value).Err())
2 years ago
}
2 years ago
func (c *msgCache) SetMessageReactionExpire(ctx context.Context, clientMsgID string, sessionType int32, expiration time.Duration) (bool, error) {
2 years ago
return utils.Wrap2(c.rdb.Expire(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), expiration).Result())
2 years ago
}
2 years ago
func (c *msgCache) GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error) {
2 years ago
return utils.Wrap2(c.rdb.HGet(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), typeKey).Result())
2 years ago
}
2 years ago
func (c *msgCache) GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error) {
2 years ago
return utils.Wrap2(c.rdb.HGetAll(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType)).Result())
2 years ago
}
2 years ago
func (c *msgCache) DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error {
2 years ago
return errs.Wrap(c.rdb.HDel(ctx, c.getMessageReactionExPrefix(clientMsgID, sessionType), subKey).Err())
2 years ago
}