diff --git a/internal/rpc/conversation/conversaion.go b/internal/rpc/conversation/conversaion.go index c6ffb8580..d977ef4f8 100644 --- a/internal/rpc/conversation/conversaion.go +++ b/internal/rpc/conversation/conversaion.go @@ -61,6 +61,17 @@ func (rpc *rpcConversation) ModifyConversationField(c context.Context, req *pbCo resp.CommonResp = &pbConversation.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg} return resp, nil } + if req.Conversation.ConversationType == constant.SuperGroupChatType { + if req.Conversation.RecvMsgOpt == constant.ReceiveNotNotifyMessage { + if err = db.DB.SetSuperGroupUserNotRecvOfflineMsgOpt(req.Conversation.GroupID, v); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), req.Conversation.GroupID, v) + } + } else { + if err = db.DB.ReduceSuperGroupUserNotRecvOfflineMsgOpt(req.Conversation.GroupID, v); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), req.Conversation.GroupID, v) + } + } + } } err = imdb.UpdateColumnsConversations(haveUserID, req.Conversation.ConversationID, map[string]interface{}{"recv_msg_opt": conversation.RecvMsgOpt}) case constant.FieldGroupAtType: diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index b6a55ca0f..d89707c08 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -251,7 +251,7 @@ func (s *userServer) SetConversation(ctx context.Context, req *pbUser.SetConvers if req.NotificationType == 0 { req.NotificationType = constant.ConversationOptChangeNotification } - if req.Conversation.ConversationType == constant.GroupChatType { + if req.Conversation.ConversationType == constant.GroupChatType || req.Conversation.ConversationType == constant.SuperGroupChatType { groupInfo, err := imdb.GetGroupInfoByGroupID(req.Conversation.GroupID) if err != nil { log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.Conversation.GroupID, err.Error()) @@ -264,7 +264,19 @@ func (s *userServer) SetConversation(ctx context.Context, req *pbUser.SetConvers resp.CommonResp = &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: errMsg} return resp, nil } + if req.Conversation.ConversationType == constant.SuperGroupChatType { + if req.Conversation.RecvMsgOpt == constant.ReceiveNotNotifyMessage { + if err = db.DB.SetSuperGroupUserNotRecvOfflineMsgOpt(req.Conversation.GroupID, v); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), req.Conversation.GroupID, v) + } + } else { + if err = db.DB.ReduceSuperGroupUserNotRecvOfflineMsgOpt(req.Conversation.GroupID, v); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), req.Conversation.GroupID, v) + } + } + } } + var conversation db.Conversation if err := utils.CopyStructFields(&conversation, req.Conversation); err != nil { log.NewDebug(req.OperationID, utils.GetSelfFuncName(), "CopyStructFields failed", *req.Conversation, err.Error()) @@ -326,6 +338,17 @@ func (s *userServer) SetRecvMsgOpt(ctx context.Context, req *pbUser.SetRecvMsgOp case "group": conversation.GroupID = stringList[1] conversation.ConversationType = constant.GroupChatType + case "super_group": + conversation.GroupID = stringList[1] + if req.RecvMsgOpt == constant.ReceiveNotNotifyMessage { + if err := db.DB.SetSuperGroupUserNotRecvOfflineMsgOpt(conversation.GroupID, req.OwnerUserID); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), conversation.GroupID, req.OwnerUserID) + } + } else { + if err := db.DB.ReduceSuperGroupUserNotRecvOfflineMsgOpt(conversation.GroupID, req.OwnerUserID); err != nil { + log.NewError(req.OperationID, utils.GetSelfFuncName(), "cache failed, rpc return", err.Error(), conversation.GroupID, req.OwnerUserID) + } + } } } isUpdate, err := imdb.SetRecvMsgOpt(conversation) @@ -334,6 +357,7 @@ func (s *userServer) SetRecvMsgOpt(ctx context.Context, req *pbUser.SetRecvMsgOp resp.CommonResp = &pbUser.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg} return resp, nil } + if isUpdate { err = rocksCache.DelConversationFromCache(conversation.OwnerUserID, conversation.ConversationID) } else { diff --git a/pkg/common/db/RedisModel.go b/pkg/common/db/RedisModel.go index a133b624c..b98533e87 100644 --- a/pkg/common/db/RedisModel.go +++ b/pkg/common/db/RedisModel.go @@ -40,6 +40,9 @@ const ( sendMsgFailedFlag = "SEND_MSG_FAILED_FLAG:" userBadgeUnreadCountSum = "USER_BADGE_UNREAD_COUNT_SUM:" exTypeKeyLocker = "EX_LOCK:" + + //temp + superGroupUserNotRecvOfflineMsgOptTemp = "SG_RECV_MSG_OPT_TEMP:" ) func (d *DataBases) JudgeAccountEXISTS(account string) (bool, error) { @@ -164,6 +167,23 @@ func (d *DataBases) GetSingleConversationRecvMsgOpt(userID, conversationID strin result, err := d.RDB.HGet(context.Background(), key, conversationID).Result() return utils.StringToInt(result), err } + +func (d *DataBases) SetSuperGroupUserNotRecvOfflineMsgOpt(groupID, userID string) error { + key := superGroupUserNotRecvOfflineMsgOptTemp + groupID + return d.RDB.SAdd(context.Background(), key, userID).Err() +} + +func (d *DataBases) ReduceSuperGroupUserNotRecvOfflineMsgOpt(groupID, userID string) error { + key := superGroupUserNotRecvOfflineMsgOptTemp + groupID + return d.RDB.SRem(context.Background(), key, userID).Err() +} + +func (d *DataBases) GetSuperGroupUserNotRecvOfflineMsgIDList(groupID string) ([]string, error) { + key := superGroupUserNotRecvOfflineMsgOptTemp + groupID + userIDs, _ := d.RDB.SMembers(context.Background(), key).Result() + return userIDs, nil +} + func (d *DataBases) SetUserGlobalMsgRecvOpt(userID string, opt int32) error { key := conversationReceiveMessageOpt + userID return d.RDB.HSet(context.Background(), key, GlobalMsgRecvOpt, opt).Err()