diff --git a/internal/rpc/relation/friend.go b/internal/rpc/relation/friend.go index a0e5c63e9..38aa23d51 100644 --- a/internal/rpc/relation/friend.go +++ b/internal/rpc/relation/friend.go @@ -39,6 +39,7 @@ import ( conversationpb "github.com/openimsdk/protocol/conversation" "github.com/openimsdk/protocol/relation" "github.com/openimsdk/protocol/sdkws" + "github.com/openimsdk/protocol/wrapperspb" "github.com/openimsdk/tools/db/mongoutil" "github.com/openimsdk/tools/discovery" "github.com/openimsdk/tools/errs" @@ -531,6 +532,9 @@ func (s *friendServer) GetSpecifiedFriendsInfo(ctx context.Context, req *relatio OperatorUserID: friend.OperatorUserID, Ex: friend.Ex, IsPinned: friend.IsPinned, + IsMute: friend.IsMuted, + MuteDuration: friend.MuteDuration, + MuteEndTime: friend.MuteEndTime, } } @@ -586,6 +590,15 @@ func (s *friendServer) UpdateFriends( if req.Ex != nil { val["ex"] = req.Ex.Value } + if req.IsMute != nil { + val["is_muted"] = req.IsMute.Value + } + if req.MuteDuration != nil { + val["mute_duration"] = req.MuteDuration.Value + } + if req.MuteEndTime != nil { + val["mute_end_time"] = req.MuteEndTime.Value + } if err = s.db.UpdateFriends(ctx, req.OwnerUserID, req.FriendUserIDs, val); err != nil { return nil, err } @@ -606,6 +619,26 @@ func (s *friendServer) UpdateFriends( } } + if req.IsMute != nil { + recvMsgOpt := int32(constant.ReceiveNotNotifyMessage) + if !req.IsMute.Value { + recvMsgOpt = constant.ReceiveMessage + } + for _, friendUserID := range req.FriendUserIDs { + convID := conversationutil.GenConversationIDForSingle(req.OwnerUserID, friendUserID) + if err := s.conversationClient.SetConversations(ctx, []string{req.OwnerUserID}, + &conversationpb.ConversationReq{ + ConversationID: convID, + ConversationType: constant.SingleChatType, + UserID: friendUserID, + RecvMsgOpt: &wrapperspb.Int32Value{Value: recvMsgOpt}, + }); err != nil { + log.ZWarn(ctx, "sync conversation recvMsgOpt failed", err, + "ownerUserID", req.OwnerUserID, "friendUserID", friendUserID) + } + } + } + resp := &relation.UpdateFriendsResp{} s.notificationSender.FriendsInfoUpdateNotification(ctx, req.OwnerUserID, req.FriendUserIDs) diff --git a/pkg/common/convert/friend.go b/pkg/common/convert/friend.go index e783ecb24..994c6d7d5 100644 --- a/pkg/common/convert/friend.go +++ b/pkg/common/convert/friend.go @@ -80,6 +80,9 @@ func FriendsDB2Pb(ctx context.Context, friendsDB []*model.Friend, getUsers func( friendPb.FriendUser.Ex = users[friend.FriendUserID].Ex friendPb.CreateTime = friend.CreateTime.Unix() friendPb.IsPinned = friend.IsPinned + friendPb.IsMute = friend.IsMuted + friendPb.MuteDuration = friend.MuteDuration + friendPb.MuteEndTime = friend.MuteEndTime friendsPb = append(friendsPb, friendPb) } return friendsPb, nil @@ -96,6 +99,9 @@ func FriendOnlyDB2PbOnly(friendsDB []*model.Friend) []*relation.FriendInfoOnly { OperatorUserID: f.OperatorUserID, Ex: f.Ex, IsPinned: f.IsPinned, + IsMute: f.IsMuted, + MuteDuration: f.MuteDuration, + MuteEndTime: f.MuteEndTime, } }) } diff --git a/pkg/common/storage/model/friend.go b/pkg/common/storage/model/friend.go index abcca2f2b..7ba5dcb61 100644 --- a/pkg/common/storage/model/friend.go +++ b/pkg/common/storage/model/friend.go @@ -30,4 +30,7 @@ type Friend struct { OperatorUserID string `bson:"operator_user_id"` Ex string `bson:"ex"` IsPinned bool `bson:"is_pinned"` + IsMuted bool `bson:"is_muted"` + MuteDuration int64 `bson:"mute_duration"` // 单位:秒 + MuteEndTime int64 `bson:"mute_end_time"` // Unix 毫秒时间戳,0 表示永久 }