Files
open-im-server/pkg/common/db/cache/redis.go
T

541 lines
21 KiB
Go
Raw Normal View History

2023-01-16 20:14:26 +08:00
package cache
2022-06-06 18:15:32 +08:00
import (
"Open_IM/pkg/common/config"
2022-06-15 14:57:21 +08:00
"Open_IM/pkg/common/constant"
2022-07-20 21:02:25 +08:00
pbChat "Open_IM/pkg/proto/msg"
2022-06-06 18:15:32 +08:00
pbRtc "Open_IM/pkg/proto/rtc"
2023-02-15 15:52:32 +08:00
"Open_IM/pkg/proto/sdkws"
2022-06-06 18:15:32 +08:00
"Open_IM/pkg/utils"
"context"
"errors"
"fmt"
2022-08-18 11:14:38 +08:00
"strconv"
"time"
2023-01-29 11:37:11 +08:00
"github.com/go-redis/redis/v8"
2022-06-13 15:58:14 +08:00
"github.com/golang/protobuf/jsonpb"
2022-06-15 12:57:40 +08:00
"github.com/golang/protobuf/proto"
2022-06-06 18:15:32 +08:00
)
2022-07-20 10:18:43 +08:00
2022-06-23 10:18:44 +08:00
const (
2023-02-09 17:55:59 +08:00
userIncrSeq = "REDIS_USER_INCR_SEQ:" // user incr seq
appleDeviceToken = "DEVICE_TOKEN"
userMinSeq = "REDIS_USER_MIN_SEQ:"
2023-02-09 14:40:49 +08:00
getuiToken = "GETUI_TOKEN"
getuiTaskID = "GETUI_TASK_ID"
messageCache = "MESSAGE_CACHE:"
signalCache = "SIGNAL_CACHE:"
signalListCache = "SIGNAL_LIST_CACHE:"
FcmToken = "FCM_TOKEN:"
groupUserMinSeq = "GROUP_USER_MIN_SEQ:"
groupMaxSeq = "GROUP_MAX_SEQ:"
groupMinSeq = "GROUP_MIN_SEQ:"
sendMsgFailedFlag = "SEND_MSG_FAILED_FLAG:"
userBadgeUnreadCountSum = "USER_BADGE_UNREAD_COUNT_SUM:"
exTypeKeyLocker = "EX_LOCK:"
2022-06-23 10:18:44 +08:00
)
2023-02-09 14:40:49 +08:00
type Cache interface {
2023-02-16 15:20:59 +08:00
IncrUserSeq(ctx context.Context, userID string) (int64, error)
GetUserMaxSeq(ctx context.Context, userID string) (int64, error)
SetUserMaxSeq(ctx context.Context, userID string, maxSeq int64) error
SetUserMinSeq(ctx context.Context, userID string, minSeq int64) (err error)
GetUserMinSeq(ctx context.Context, userID string) (int64, error)
SetGroupUserMinSeq(ctx context.Context, groupID, userID string, minSeq int64) (err error)
GetGroupUserMinSeq(ctx context.Context, groupID, userID string) (int64, error)
GetGroupMaxSeq(ctx context.Context, groupID string) (int64, error)
IncrGroupMaxSeq(ctx context.Context, groupID string) (int64, error)
SetGroupMaxSeq(ctx context.Context, groupID string, maxSeq int64) error
SetGroupMinSeq(ctx context.Context, groupID string, minSeq int64) error
2023-02-15 15:52:32 +08:00
AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error
GetTokenMapByUidPid(ctx context.Context, userID, platformID string) (map[string]int, error)
SetTokenMapByUidPid(ctx context.Context, userID string, platformID int, m map[string]int) error
DeleteTokenByUidPid(ctx context.Context, userID string, platformID int, fields []string) error
2023-02-16 15:20:59 +08:00
GetMessageListBySeq(ctx context.Context, userID string, seqList []int64) (seqMsg []*sdkws.MsgData, failedSeqList []int64, err error)
2023-02-15 15:52:32 +08:00
SetMessageToCache(ctx context.Context, userID string, msgList []*pbChat.MsgDataToMQ) (int, error)
DeleteMessageFromCache(ctx context.Context, userID string, msgList []*pbChat.MsgDataToMQ) error
2023-02-15 17:00:43 +08:00
CleanUpOneUserAllMsg(ctx context.Context, userID string) error
2023-02-15 15:52:32 +08:00
HandleSignalInfo(ctx context.Context, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error)
GetSignalInfoFromCacheByClientMsgID(ctx context.Context, clientMsgID string) (invitationInfo *pbRtc.SignalInviteReq, err error)
GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *pbRtc.SignalInviteReq, err error)
DelUserSignalList(ctx context.Context, userID string) error
2023-02-16 15:20:59 +08:00
DelMsgFromCache(ctx context.Context, userID string, seqList []int64) error
2023-02-15 15:52:32 +08:00
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)
SetSendMsgStatus(ctx context.Context, status int32) error
GetSendMsgStatus(ctx context.Context) (int, error)
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)
JudgeMessageReactionEXISTS(ctx context.Context, clientMsgID string, sessionType int32) (bool, error)
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
2023-02-09 14:40:49 +08:00
}
// native redis operate
2023-02-14 16:33:18 +08:00
//func NewRedis() *RedisClient {
// o := &RedisClient{}
// o.InitRedis()
// return o
//}
2023-01-29 11:37:11 +08:00
2023-02-14 16:33:18 +08:00
func NewRedis() (*RedisClient, error) {
2023-01-29 11:37:11 +08:00
var rdb redis.UniversalClient
2023-01-16 20:14:26 +08:00
if config.Config.Redis.EnableCluster {
2023-01-29 11:37:11 +08:00
rdb = redis.NewClusterClient(&redis.ClusterOptions{
2023-01-16 20:14:26 +08:00
Addrs: config.Config.Redis.DBAddress,
Username: config.Config.Redis.DBUserName,
Password: config.Config.Redis.DBPassWord, // no password set
PoolSize: 50,
})
2023-02-14 16:33:18 +08:00
//if err := rdb.Ping(ctx).Err();err != nil {
// return nil, fmt.Errorf("redis ping %w", err)
//}
//return &RedisClient{rdb: rdb}, nil
2023-01-16 20:14:26 +08:00
} else {
2023-01-29 11:37:11 +08:00
rdb = redis.NewClient(&redis.Options{
2023-01-16 20:14:26 +08:00
Addr: config.Config.Redis.DBAddress[0],
Username: config.Config.Redis.DBUserName,
Password: config.Config.Redis.DBPassWord, // no password set
DB: 0, // use default DB
PoolSize: 100, // 连接池大小
})
2023-02-14 16:33:18 +08:00
//err := rdb.Ping(ctx).Err()
//if err != nil {
// panic(err.Error() + " redis " + config.Config.Redis.DBAddress[0] + config.Config.Redis.DBUserName + config.Config.Redis.DBPassWord)
//}
2023-01-16 20:14:26 +08:00
}
2023-02-14 16:33:18 +08:00
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
err := rdb.Ping(ctx).Err()
if err != nil {
return nil, fmt.Errorf("redis ping %w", err)
2023-01-16 20:14:26 +08:00
}
2023-02-14 16:33:18 +08:00
return &RedisClient{rdb: rdb}, nil
2023-01-16 20:14:26 +08:00
}
2023-02-14 16:33:18 +08:00
type RedisClient struct {
rdb redis.UniversalClient
2023-01-16 20:14:26 +08:00
}
2023-01-29 11:37:11 +08:00
func NewRedisClient(rdb redis.UniversalClient) *RedisClient {
2023-01-17 16:36:34 +08:00
return &RedisClient{rdb: rdb}
}
2023-02-09 17:55:59 +08:00
// Perform seq auto-increment operation of user messages
2023-02-16 15:20:59 +08:00
func (r *RedisClient) IncrUserSeq(ctx context.Context, uid string) (int64, error) {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return seq, err
2022-06-15 16:33:30 +08:00
}
2023-02-09 17:55:59 +08:00
// Get the largest Seq
2023-02-16 15:20:59 +08:00
func (r *RedisClient) GetUserMaxSeq(ctx context.Context, uid string) (int64, error) {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return int64(utils.StringToInt(seq)), err
2022-06-15 16:33:30 +08:00
}
2023-02-09 17:55:59 +08:00
// set the largest Seq
2023-02-16 15:20:59 +08:00
func (r *RedisClient) SetUserMaxSeq(ctx context.Context, uid string, maxSeq int64) error {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, maxSeq, 0).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-09 17:55:59 +08:00
// Set the user's minimum seq
2023-02-16 15:20:59 +08:00
func (r *RedisClient) SetUserMinSeq(ctx context.Context, uid string, minSeq int64) (err error) {
2022-06-15 16:33:30 +08:00
key := userMinSeq + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-09 17:55:59 +08:00
// Get the smallest Seq
2023-02-16 15:20:59 +08:00
func (r *RedisClient) GetUserMinSeq(ctx context.Context, uid string) (int64, error) {
2022-06-15 16:33:30 +08:00
key := userMinSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return int64(utils.StringToInt(seq)), err
2022-06-15 16:33:30 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) SetGroupUserMinSeq(ctx context.Context, groupID, userID string, minSeq int64) (err error) {
2022-07-20 10:18:43 +08:00
key := groupUserMinSeq + "g:" + groupID + "u:" + userID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-07-20 10:18:43 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) GetGroupUserMinSeq(ctx context.Context, groupID, userID string) (int64, error) {
2022-07-20 10:18:43 +08:00
key := groupUserMinSeq + "g:" + groupID + "u:" + userID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return int64(utils.StringToInt(seq)), err
2022-07-20 10:18:43 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) GetGroupMaxSeq(ctx context.Context, groupID string) (int64, error) {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return int64(utils.StringToInt(seq)), err
2022-07-22 16:55:29 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) IncrGroupMaxSeq(ctx context.Context, groupID string) (int64, error) {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2023-02-16 15:20:59 +08:00
return seq, err
2022-07-22 16:55:29 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) SetGroupMaxSeq(ctx context.Context, groupID string, maxSeq int64) error {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, maxSeq, 0).Err()
2022-07-22 16:55:29 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) SetGroupMinSeq(ctx context.Context, groupID string, minSeq int64) error {
2022-08-04 17:20:33 +08:00
key := groupMinSeq + groupID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-08-04 17:20:33 +08:00
}
2023-02-09 17:55:59 +08:00
// Store userid and platform class to redis
2023-02-15 15:52:32 +08:00
func (r *RedisClient) AddTokenFlag(ctx context.Context, userID string, platformID int, token string, flag int) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, token, flag).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetTokenMapByUidPid(ctx context.Context, userID, platformID string) (map[string]int, error) {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + platformID
2023-01-16 20:14:26 +08:00
m, err := r.rdb.HGetAll(context.Background(), key).Result()
2022-06-15 16:33:30 +08:00
mm := make(map[string]int)
for k, v := range m {
mm[k] = utils.StringToInt(v)
}
return mm, err
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetTokenMapByUidPid(ctx context.Context, userID string, platformID int, m map[string]int) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2022-06-21 21:27:00 +08:00
mm := make(map[string]interface{})
for k, v := range m {
mm[k] = v
}
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, mm).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-09 14:40:49 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) DeleteTokenByUidPid(ctx context.Context, userID string, platformID int, fields []string) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.HDel(context.Background(), key, fields...).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-16 15:20:59 +08:00
func (r *RedisClient) GetMessageListBySeq(ctx context.Context, userID string, seqList []int64, operationID string) (seqMsg []*sdkws.MsgData, failedSeqList []int64, err2 error) {
2022-06-06 18:15:32 +08:00
for _, v := range seqList {
//MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
key := messageCache + userID + "_" + strconv.Itoa(int(v))
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), key).Result()
2022-06-15 23:30:33 +08:00
if err != nil {
2023-02-15 17:00:43 +08:00
if err != redis.Nil {
err2 = err
}
2022-06-15 23:30:33 +08:00
failedSeqList = append(failedSeqList, v)
} else {
2023-02-15 15:52:32 +08:00
msg := sdkws.MsgData{}
2022-06-15 23:30:33 +08:00
err = jsonpb.UnmarshalString(result, &msg)
2022-06-06 18:15:32 +08:00
if err != nil {
2023-02-15 17:00:43 +08:00
err2 = err
2022-06-15 23:30:33 +08:00
failedSeqList = append(failedSeqList, v)
2022-06-06 18:15:32 +08:00
} else {
2022-06-13 15:58:14 +08:00
seqMsg = append(seqMsg, &msg)
2022-06-06 18:15:32 +08:00
}
}
}
2023-02-15 17:00:43 +08:00
return seqMsg, failedSeqList, err2
2022-06-06 18:15:32 +08:00
}
2022-08-05 15:16:43 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetMessageToCache(ctx context.Context, userID string, msgList []*pbChat.MsgDataToMQ, uid string) (int, error) {
2023-01-16 20:14:26 +08:00
pipe := r.rdb.Pipeline()
2022-06-06 18:15:32 +08:00
var failedList []pbChat.MsgDataToMQ
for _, msg := range msgList {
key := messageCache + uid + "_" + strconv.Itoa(int(msg.MsgData.Seq))
2022-06-13 15:58:14 +08:00
s, err := utils.Pb2String(msg.MsgData)
2022-06-06 18:15:32 +08:00
if err != nil {
continue
}
2022-06-15 19:17:49 +08:00
err = pipe.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err()
2023-01-16 20:14:26 +08:00
//err = r.rdb.HMSet(context.Background(), "12", map[string]interface{}{"1": 2, "343": false}).Err()
2022-06-06 18:15:32 +08:00
if err != nil {
failedList = append(failedList, *msg)
}
}
if len(failedList) != 0 {
2023-02-15 15:52:32 +08:00
return len(failedList), errors.New(fmt.Sprintf("set msg to cache failed, failed lists: %q,%s", failedList))
2022-06-06 18:15:32 +08:00
}
2022-06-15 19:17:49 +08:00
_, err := pipe.Exec(ctx)
2023-02-15 15:52:32 +08:00
return 0, err
2022-06-06 18:15:32 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) DeleteMessageFromCache(ctx context.Context, userID string, msgList []*pbChat.MsgDataToMQ) error {
2022-07-27 12:15:32 +08:00
for _, msg := range msgList {
2023-02-15 15:52:32 +08:00
key := messageCache + userID + "_" + strconv.Itoa(int(msg.MsgData.Seq))
2023-01-16 20:14:26 +08:00
err := r.rdb.Del(ctx, key).Err()
2022-08-18 11:14:38 +08:00
if err != nil {
}
2022-07-27 12:15:32 +08:00
}
2022-08-18 11:14:38 +08:00
return nil
2022-07-27 12:15:32 +08:00
}
2022-06-06 18:15:32 +08:00
2023-02-15 17:00:43 +08:00
func (r *RedisClient) CleanUpOneUserAllMsg(ctx context.Context, userID string) error {
2022-06-06 18:15:32 +08:00
key := messageCache + userID + "_" + "*"
2023-01-16 20:14:26 +08:00
vals, err := r.rdb.Keys(ctx, key).Result()
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2022-06-06 18:15:32 +08:00
return nil
}
if err != nil {
return utils.Wrap(err, "")
}
2022-08-11 20:25:33 +08:00
for _, v := range vals {
2023-01-16 20:14:26 +08:00
err = r.rdb.Del(ctx, v).Err()
2022-06-06 18:15:32 +08:00
}
return nil
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) HandleSignalInfo(ctx context.Context, operationID string, msg *sdkws.MsgData, pushToUserID string) (isSend bool, err error) {
2022-06-06 18:52:17 +08:00
req := &pbRtc.SignalReq{}
if err := proto.Unmarshal(msg.Content, req); err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-06 18:15:32 +08:00
}
2022-06-06 18:52:17 +08:00
//log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "SignalReq: ", req.String())
2022-06-06 21:04:11 +08:00
var inviteeUserIDList []string
2022-06-10 17:31:30 +08:00
var isInviteSignal bool
switch signalInfo := req.Payload.(type) {
2022-06-06 21:04:11 +08:00
case *pbRtc.SignalReq_Invite:
2022-06-10 17:31:30 +08:00
inviteeUserIDList = signalInfo.Invite.Invitation.InviteeUserIDList
isInviteSignal = true
2022-06-06 21:04:11 +08:00
case *pbRtc.SignalReq_InviteInGroup:
2022-06-10 17:31:30 +08:00
inviteeUserIDList = signalInfo.InviteInGroup.Invitation.InviteeUserIDList
isInviteSignal = true
2022-09-02 17:22:27 +08:00
if !utils.IsContain(pushToUserID, inviteeUserIDList) {
return false, nil
}
2022-06-13 11:53:12 +08:00
case *pbRtc.SignalReq_HungUp, *pbRtc.SignalReq_Cancel, *pbRtc.SignalReq_Reject, *pbRtc.SignalReq_Accept:
2023-02-02 19:40:54 +08:00
return false, nil
2022-06-06 21:04:11 +08:00
default:
2022-09-02 17:22:27 +08:00
return false, nil
2022-06-06 21:04:11 +08:00
}
2022-06-10 17:31:30 +08:00
if isInviteSignal {
for _, userID := range inviteeUserIDList {
timeout, err := strconv.Atoi(config.Config.Rtc.SignalTimeout)
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
err = r.rdb.LPush(context.Background(), keyList, msg.ClientMsgID).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-01-16 20:14:26 +08:00
err = r.rdb.Expire(context.Background(), keyList, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-02-09 14:40:49 +08:00
key := signalCache + msg.ClientMsgID
2023-01-16 20:14:26 +08:00
err = r.rdb.Set(context.Background(), key, msg.Content, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2022-06-06 18:52:17 +08:00
}
2022-06-06 18:15:32 +08:00
}
2022-09-02 17:22:27 +08:00
return true, nil
2022-06-06 18:15:32 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetSignalInfoFromCacheByClientMsgID(ctx context.Context, clientMsgID string) (invitationInfo *pbRtc.SignalInviteReq, err error) {
2023-02-09 14:40:49 +08:00
key := signalCache + clientMsgID
2022-06-06 19:36:25 +08:00
invitationInfo = &pbRtc.SignalInviteReq{}
2023-01-16 20:14:26 +08:00
bytes, err := r.rdb.Get(context.Background(), key).Bytes()
2022-06-06 18:15:32 +08:00
if err != nil {
return nil, err
}
req := &pbRtc.SignalReq{}
if err = proto.Unmarshal(bytes, req); err != nil {
return nil, err
}
2022-06-06 19:36:25 +08:00
switch req2 := req.Payload.(type) {
case *pbRtc.SignalReq_Invite:
invitationInfo.Invitation = req2.Invite.Invitation
2022-06-13 20:11:43 +08:00
invitationInfo.OpUserID = req2.Invite.OpUserID
2022-06-06 19:36:25 +08:00
case *pbRtc.SignalReq_InviteInGroup:
invitationInfo.Invitation = req2.InviteInGroup.Invitation
2022-06-13 20:11:43 +08:00
invitationInfo.OpUserID = req2.InviteInGroup.OpUserID
2022-06-06 19:36:25 +08:00
}
2022-06-06 18:15:32 +08:00
return invitationInfo, err
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetAvailableSignalInvitationInfo(ctx context.Context, userID string) (invitationInfo *pbRtc.SignalInviteReq, err error) {
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
result := r.rdb.LPop(context.Background(), keyList)
2022-06-06 18:15:32 +08:00
if err = result.Err(); err != nil {
2022-06-06 19:20:12 +08:00
return nil, utils.Wrap(err, "GetAvailableSignalInvitationInfo failed")
2022-06-06 18:15:32 +08:00
}
2022-06-06 19:20:12 +08:00
key, err := result.Result()
if err != nil {
return nil, utils.Wrap(err, "GetAvailableSignalInvitationInfo failed")
}
2023-02-15 15:52:32 +08:00
invitationInfo, err = r.GetSignalInfoFromCacheByClientMsgID(ctx, key)
2022-06-06 23:27:16 +08:00
if err != nil {
return nil, utils.Wrap(err, "GetSignalInfoFromCacheByClientMsgID")
}
2023-02-15 15:52:32 +08:00
err = r.DelUserSignalList(ctx, userID)
2022-06-06 23:27:16 +08:00
if err != nil {
return nil, utils.Wrap(err, "GetSignalInfoFromCacheByClientMsgID")
}
return invitationInfo, nil
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) DelUserSignalList(ctx context.Context, userID string) error {
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
err := r.rdb.Del(context.Background(), keyList).Err()
2022-06-06 23:27:16 +08:00
return err
2022-06-06 18:15:32 +08:00
}
2022-06-15 14:57:21 +08:00
2023-02-16 15:20:59 +08:00
func (r *RedisClient) DelMsgFromCache(ctx context.Context, uid string, seqList []int64, operationID string) {
2022-06-15 14:57:21 +08:00
for _, seq := range seqList {
key := messageCache + uid + "_" + strconv.Itoa(int(seq))
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), key).Result()
2022-08-09 19:44:27 +08:00
if err != nil {
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2022-08-09 19:44:27 +08:00
} else {
}
continue
}
2023-02-15 15:52:32 +08:00
var msg sdkws.MsgData
2022-06-15 14:57:21 +08:00
if err := utils.String2Pb(result, &msg); err != nil {
continue
}
msg.Status = constant.MsgDeleted
s, err := utils.Pb2String(&msg)
if err != nil {
continue
}
2023-01-16 20:14:26 +08:00
if err := r.rdb.Set(context.Background(), key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err(); err != nil {
2022-06-15 14:57:21 +08:00
}
}
}
2022-06-15 16:16:35 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetGetuiToken(ctx context.Context, token string, expireTime int64) error {
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), getuiToken, token, time.Duration(expireTime)*time.Second).Err()
2022-06-15 16:16:35 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetGetuiToken(ctx context.Context) (string, error) {
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), getuiToken).Result()
2022-08-08 17:14:59 +08:00
return result, err
2022-06-15 16:16:35 +08:00
}
2022-07-26 15:16:46 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetGetuiTaskID(ctx context.Context, taskID string, expireTime int64) error {
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), getuiTaskID, taskID, time.Duration(expireTime)*time.Second).Err()
2022-12-21 16:46:16 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetGetuiTaskID(ctx context.Context) (string, error) {
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), getuiTaskID).Result()
2022-12-21 16:46:16 +08:00
return result, err
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetSendMsgStatus(ctx context.Context, status int32, operationID string) error {
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), sendMsgFailedFlag+operationID, status, time.Hour*24).Err()
2022-07-26 15:16:46 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetSendMsgStatus(ctx context.Context, operationID string) (int, error) {
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), sendMsgFailedFlag+operationID).Result()
2022-09-06 15:51:18 +08:00
if err != nil {
return 0, err
}
status, err := strconv.Atoi(result)
return status, err
2022-07-26 15:16:46 +08:00
}
2022-07-26 15:20:48 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetFcmToken(ctx context.Context, account string, platformID int, fcmToken string, expireTime int64) (err error) {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, fcmToken, time.Duration(expireTime)*time.Second).Err()
2022-07-25 17:57:58 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetFcmToken(ctx context.Context, account string, platformID int) (string, error) {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Get(context.Background(), key).Result()
2022-07-25 17:57:58 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) DelFcmToken(ctx context.Context, account string, platformID int) error {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Del(context.Background(), key).Err()
2022-10-27 17:15:06 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) IncrUserBadgeUnreadCountSum(ctx context.Context, uid string) (int, error) {
2022-09-01 21:05:16 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2022-09-01 21:05:16 +08:00
return int(seq), err
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetUserBadgeUnreadCountSum(ctx context.Context, uid string, value int) error {
2022-09-01 21:05:16 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, value, 0).Err()
2022-09-01 21:05:16 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetUserBadgeUnreadCountSum(ctx context.Context, uid string) (int, error) {
2022-09-07 16:41:18 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-09-07 16:41:18 +08:00
return utils.StringToInt(seq), err
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) JudgeMessageReactionEXISTS(ctx context.Context, clientMsgID string, sessionType int32) (bool, error) {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
n, err := r.rdb.Exists(context.Background(), key).Result()
2023-02-15 15:52:32 +08:00
return n > 0, err
2022-12-09 20:53:13 +08:00
}
2022-12-12 19:15:31 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetOneMessageAllReactionList(ctx context.Context, clientMsgID string, sessionType int32) (map[string]string, error) {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HGetAll(context.Background(), key).Result()
2022-12-12 19:15:31 +08:00
2022-12-12 20:41:40 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) DeleteOneMessageKey(ctx context.Context, clientMsgID string, sessionType int32, subKey string) error {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HDel(context.Background(), key, subKey).Err()
2022-12-12 20:41:40 +08:00
2022-12-12 19:15:31 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetMessageReactionExpire(ctx context.Context, clientMsgID string, sessionType int32, expiration time.Duration) (bool, error) {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.Expire(context.Background(), key, expiration).Result()
2022-12-12 12:12:53 +08:00
}
2023-02-09 14:40:49 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) GetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey string) (string, error) {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
result, err := r.rdb.HGet(context.Background(), key, typeKey).Result()
2022-12-09 20:53:13 +08:00
return result, err
}
2023-02-09 14:40:49 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) SetMessageTypeKeyValue(ctx context.Context, clientMsgID string, sessionType int32, typeKey, value string) error {
key := r.getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, typeKey, value).Err()
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
2023-02-15 15:52:32 +08:00
func (r *RedisClient) LockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
2022-12-09 20:53:13 +08:00
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-01-16 20:14:26 +08:00
return r.rdb.SetNX(context.Background(), key, 1, time.Minute).Err()
2022-12-09 20:53:13 +08:00
}
2023-02-15 15:52:32 +08:00
func (r *RedisClient) UnLockMessageTypeKey(ctx context.Context, clientMsgID string, TypeKey string) error {
2022-12-09 20:53:13 +08:00
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-01-16 20:14:26 +08:00
return r.rdb.Del(context.Background(), key).Err()
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
func (r *RedisClient) getMessageReactionExPrefix(clientMsgID string, sessionType int32) string {
2022-12-09 20:53:13 +08:00
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 ""
}