From e121cf0fd937b5b935938c9c50ebd0efad48c048 Mon Sep 17 00:00:00 2001 From: hawklin2017 <32898629+hawklin2017@users.noreply.github.com> Date: Wed, 20 May 2026 20:44:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=BE=A4=E6=88=90=E5=91=98?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=8C=89=E7=85=A7remark=E3=80=81fn/ln?= =?UTF-8?q?=E3=80=81nickname=E5=85=88=E5=90=8E=E9=A1=BA=E5=BA=8F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/group/fill.go | 42 +++++++++++++++++++++++++++++++++++++ internal/rpc/group/group.go | 8 +++++-- pkg/common/convert/user.go | 11 ++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/internal/rpc/group/fill.go b/internal/rpc/group/fill.go index 1c86481df..500dfc29a 100644 --- a/internal/rpc/group/fill.go +++ b/internal/rpc/group/fill.go @@ -16,9 +16,51 @@ package group import ( "context" + + "github.com/openimsdk/open-im-server/v3/pkg/common/convert" relationtb "github.com/openimsdk/open-im-server/v3/pkg/common/storage/model" + "github.com/openimsdk/protocol/sdkws" + "github.com/openimsdk/tools/mcontext" + "github.com/openimsdk/tools/utils/datautil" ) func (s *groupServer) PopulateGroupMember(ctx context.Context, members ...*relationtb.GroupMember) error { return s.notification.PopulateGroupMember(ctx, members...) } + +// applyMemberDisplayNicknames 按当前用户视角重设群成员 Nickname: +// 好友用 remark;非好友用 firstName+lastName,为空则 fallback 到 nickname。 +func (s *groupServer) applyMemberDisplayNicknames(ctx context.Context, members []*sdkws.GroupMemberFullInfo) error { + if len(members) == 0 { + return nil + } + viewerID := mcontext.GetOpUserID(ctx) + if viewerID == "" { + return nil + } + userIDs := datautil.Slice(members, func(m *sdkws.GroupMemberFullInfo) string { return m.UserID }) + users, err := s.userClient.GetUsersInfoMap(ctx, userIDs) + if err != nil { + return err + } + friendInfos, err := s.relationClient.GetFriendsInfo(ctx, viewerID, userIDs) + if err != nil { + return err + } + remarkMap := make(map[string]string, len(friendInfos)) + for _, f := range friendInfos { + if f != nil { + remarkMap[f.FriendUserID] = f.Remark + } + } + for _, m := range members { + if remark, ok := remarkMap[m.UserID]; ok && remark != "" { + m.Nickname = remark + continue + } + if name := convert.MemberDisplayNickname(users[m.UserID]); name != "" { + m.Nickname = name + } + } + return nil +} diff --git a/internal/rpc/group/group.go b/internal/rpc/group/group.go index 6bb386977..94de70abf 100644 --- a/internal/rpc/group/group.go +++ b/internal/rpc/group/group.go @@ -793,9 +793,13 @@ func (s *groupServer) getGroupMembersInfo(ctx context.Context, groupID string, u if err := s.PopulateGroupMember(ctx, members...); err != nil { return nil, err } - return datautil.Slice(members, func(e *model.GroupMember) *sdkws.GroupMemberFullInfo { + pbMembers := datautil.Slice(members, func(e *model.GroupMember) *sdkws.GroupMemberFullInfo { return convert.Db2PbGroupMember(e) - }), nil + }) + if err := s.applyMemberDisplayNicknames(ctx, pbMembers); err != nil { + return nil, err + } + return pbMembers, nil } // GetGroupApplicationList handles functions that get a list of group requests. diff --git a/pkg/common/convert/user.go b/pkg/common/convert/user.go index 8098b416d..9e6ce5590 100644 --- a/pkg/common/convert/user.go +++ b/pkg/common/convert/user.go @@ -34,6 +34,17 @@ func BuildFullName(firstName, lastName string) string { return strings.TrimSpace(firstName + " " + lastName) } +// MemberDisplayNickname 非好友场景下的群成员展示名:优先 firstName+lastName,否则 nickname。 +func MemberDisplayNickname(u *sdkws.UserInfo) string { + if u == nil { + return "" + } + if name := BuildFullName(u.FirstName, u.LastName); name != "" { + return name + } + return u.Nickname +} + func UserDB2Pb(user *relationtb.User) *sdkws.UserInfo { return &sdkws.UserInfo{ UserID: user.UserID,