From 6c1fe8fcca7bc2e61f5ca3b16e603c9325a6092b Mon Sep 17 00:00:00 2001 From: hawklin2017 <32898629+hawklin2017@users.noreply.github.com> Date: Thu, 7 May 2026 23:09:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=97=E6=B6=88=E6=81=AF=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/user/user.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/internal/rpc/user/user.go b/internal/rpc/user/user.go index b76cdb365..1d4099ec5 100644 --- a/internal/rpc/user/user.go +++ b/internal/rpc/user/user.go @@ -399,6 +399,7 @@ func (s *userServer) SetMsgReceiveSetting(ctx context.Context, req *pbuser.SetMs // 无论目标用户将手机号设置为何种可见性,只要手机号匹配就能找到该用户。 // 返回的 UserInfo 中 phone 字段仍按 applyPhoneVisibility 规则处理。 // +// 当目标用户 MsgReceiveSetting=2(不接受任何人消息)时,对非本人搜索者不可见。 // 返回空 userInfo 并不代表错误,调用方应以 nil userInfo 判断"未找到"。 func (s *userServer) GetUserByPhone(ctx context.Context, req *pbuser.GetUserByPhoneReq) (*pbuser.GetUserByPhoneResp, error) { if req.Phone == "" { @@ -419,9 +420,14 @@ func (s *userServer) GetUserByPhone(ctx context.Context, req *pbuser.GetUserByPh return nil, err } + viewerID := mcontext.GetOpUserID(ctx) + // MsgReceiveSetting=2 表示不接受任何人消息,对非本人搜索者隐藏该用户 + if dbUser.MsgReceiveSetting == tablerelation.MsgReceiveSettingNobody && viewerID != dbUser.UserID { + return &pbuser.GetUserByPhoneResp{}, nil + } + pbUser := convert.UserDB2Pb(dbUser) // 搜索者已知手机号(主动输入),仍对返回的资料字段应用可见性规则 - viewerID := mcontext.GetOpUserID(ctx) if err := s.applyPhoneVisibility(ctx, viewerID, []*sdkws.UserInfo{pbUser}, []*tablerelation.User{dbUser}); err != nil { log.ZError(ctx, "GetUserByPhone: applyPhoneVisibility failed", err, "opUserID", viewerID, "targetUserID", dbUser.UserID) @@ -432,6 +438,7 @@ func (s *userServer) GetUserByPhone(ctx context.Context, req *pbuser.GetUserByPh // GetUsersByNickname 按昵称精确匹配查询普通用户(app_manger_level 与分页拉取用户一致)。 // 全局黑名单用户会被过滤;手机号字段按 phone_visibility 与 getDesignateUsers 相同规则处理。 +// MsgReceiveSetting=2 的用户对非本人搜索者不可见。 func (s *userServer) GetUsersByNickname(ctx context.Context, req *pbuser.GetUsersByNicknameReq) (*pbuser.GetUsersByNicknameResp, error) { nickname := strings.TrimSpace(req.Nickname) if nickname == "" { @@ -475,8 +482,23 @@ func (s *userServer) GetUsersByNickname(ctx context.Context, req *pbuser.GetUser return &pbuser.GetUsersByNicknameResp{}, nil } - pbUsers := convert.UsersDB2Pb(users) + // 过滤掉 MsgReceiveSetting=2(不接受任何人消息)的用户,本人除外 viewerID := mcontext.GetOpUserID(ctx) + { + visible := make([]*tablerelation.User, 0, len(users)) + for _, u := range users { + if u.MsgReceiveSetting == tablerelation.MsgReceiveSettingNobody && viewerID != u.UserID { + continue + } + visible = append(visible, u) + } + users = visible + } + if len(users) == 0 { + return &pbuser.GetUsersByNicknameResp{}, nil + } + + pbUsers := convert.UsersDB2Pb(users) if err := s.applyPhoneVisibility(ctx, viewerID, pbUsers, users); err != nil { log.ZError(ctx, "GetUsersByNickname: applyPhoneVisibility failed", err, "opUserID", viewerID, "count", len(users))