package rpcclient import ( "context" "fmt" relationTb "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation" "github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" sdkws "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "google.golang.org/grpc" ) type MetaClient struct { // contains filtered or unexported fields client discoveryregistry.SvcDiscoveryRegistry rpcRegisterName string getUsersInfo func(ctx context.Context, userIDs []string) ([]CommonUser, error) } func NewMetaClient(client discoveryregistry.SvcDiscoveryRegistry, rpcRegisterName string, opts ...MetaClientOptions) *MetaClient { c := &MetaClient{ client: client, rpcRegisterName: rpcRegisterName, } for _, opt := range opts { opt(c) } return c } type MetaClientOptions func(*MetaClient) func WithDBFunc(fn func(ctx context.Context, userIDs []string) (users []*relationTb.UserModel, err error)) MetaClientOptions { return func(s *MetaClient) { f := func(ctx context.Context, userIDs []string) (result []CommonUser, err error) { users, err := fn(ctx, userIDs) if err != nil { return nil, err } for _, user := range users { result = append(result, user) } return result, nil } s.getUsersInfo = f } } func WithRpcFunc(fn func(ctx context.Context, userIDs []string) ([]*sdkws.UserInfo, error)) MetaClientOptions { return func(s *MetaClient) { f := func(ctx context.Context, userIDs []string) (result []CommonUser, err error) { users, err := fn(ctx, userIDs) if err != nil { return nil, err } for _, user := range users { result = append(result, user) } return result, err } s.getUsersInfo = f } } func (m *MetaClient) getFaceURLAndName(userID string) (faceURL, nickname string, err error) { users, err := m.getUsersInfo(context.Background(), []string{userID}) if err != nil { return "", "", err } if len(users) == 0 { return "", "", errs.ErrRecordNotFound.Wrap(fmt.Sprintf("notification user %s not found", userID)) } return users[0].GetFaceURL(), users[0].GetNickname(), nil } func (m *MetaClient) getConn() (*grpc.ClientConn, error) { return m.client.GetConn(m.rpcRegisterName) } type CommonUser interface { GetNickname() string GetFaceURL() string GetUserID() string GetEx() string } type CommonGroup interface { GetNickname() string GetFaceURL() string GetGroupID() string GetEx() string }