From b4c8506c79de9b6c62a953d218e1d14347764118 Mon Sep 17 00:00:00 2001 From: JJTech0130 Date: Wed, 24 Jul 2024 11:30:03 -0400 Subject: [PATCH] implement search properly; untested waiting for Tulir to implement --- pkg/connector/client.go | 105 +++++++++++++++++++++++---------------- pkg/connector/ids/ids.go | 8 +++ 2 files changed, 71 insertions(+), 42 deletions(-) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index ef80690..74a6619 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -566,12 +566,62 @@ func (m *MetaClient) LogoutRemote(ctx context.Context) { panic("unimplemented") } -func (m *MetaClient) ResolveIdentifier(ctx context.Context, number string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error) { +func (m *MetaClient) ResolveIdentifier(ctx context.Context, identifier string, createChat bool) (*bridgev2.ResolveIdentifierResponse, error) { log := zerolog.Ctx(ctx) - log.Debug().Str("number", number).Bool("create_chat", createChat).Msg("Resolving identifier") + log.Debug().Str("identifier", identifier).Bool("create_chat", createChat).Msg("Resolving identifier") + + // Make sure we can parse identifier as an int + id, err := ids.ParseIDFromString(identifier) + if err != nil { + return nil, fmt.Errorf("failed to parse identifier: %w", err) + } + + var chat *bridgev2.CreateChatResponse + if createChat { + // Create the chat on the Meta side, not sure if this is necessary for DMs? + resp, err := m.client.ExecuteTasks( + &socket.CreateThreadTask{ + ThreadFBID: id, + ForceUpsert: 0, + UseOpenMessengerTransport: 0, + SyncGroup: 1, + MetadataOnly: 0, + PreviewOnly: 0, + }, + ) + + log.Debug().Any("response_data", resp).Err(err).Msg("Create chat response") + + portalKey := networkid.PortalKey{ID: ids.MakePortalID(id)} + + portal, err := m.Main.Bridge.GetPortalByID(ctx, portalKey) + if err != nil { + log.Err(err).Any("portal_key", portalKey).Msg("Failed to get portal") + } + + chatInfo, err := m.GetChatInfo(ctx, portal) + if err != nil { + log.Err(err).Any("portal_key", portalKey).Msg("Failed to get chat info") + } + + chat = &bridgev2.CreateChatResponse{ + Portal: portal, + PortalID: portalKey, + PortalInfo: chatInfo, + } + } + return &bridgev2.ResolveIdentifierResponse{ + UserID: ids.MakeUserID(id), + Chat: chat, + }, nil +} + +func (m *MetaClient) SearchUsers(ctx context.Context, search string) ([]*bridgev2.ResolveIdentifierResponse, error) { + log := zerolog.Ctx(ctx) + log.Debug().Str("search", search).Msg("Searching users") task := &socket.SearchUserTask{ - Query: number, + Query: search, SupportedTypes: []table.SearchType{ table.SearchTypeContact, table.SearchTypeGroup, table.SearchTypePage, table.SearchTypeNonContact, table.SearchTypeIGContactFollowing, table.SearchTypeIGContactNonFollowing, @@ -601,54 +651,25 @@ func (m *MetaClient) ResolveIdentifier(ctx context.Context, number string, creat return nil, fmt.Errorf("failed to search for user: %w", err) } + users := make([]*bridgev2.ResolveIdentifierResponse, 0) + for _, result := range resp.LSInsertSearchResult { if result.ThreadType == table.ONE_TO_ONE && result.CanViewerMessage && result.GetFBID() != 0 { - var chat *bridgev2.CreateChatResponse - if createChat { - // Create the chat on the Meta side, not sure if this is necessary for DMs? - resp, err := m.client.ExecuteTasks( - &socket.CreateThreadTask{ - ThreadFBID: result.GetFBID(), - ForceUpsert: 0, - UseOpenMessengerTransport: 0, - SyncGroup: 1, - MetadataOnly: 0, - PreviewOnly: 0, - }, - ) - - log.Debug().Any("response_data", resp).Err(err).Msg("Create chat response") - - portalKey := networkid.PortalKey{ID: ids.MakePortalID(result.GetFBID())} - - portal, err := m.Main.Bridge.GetPortalByID(ctx, portalKey) - if err != nil { - log.Err(err).Any("portal_key", portalKey).Msg("Failed to get portal") - } - - chatInfo, err := m.GetChatInfo(ctx, portal) - if err != nil { - log.Err(err).Any("portal_key", portalKey).Msg("Failed to get chat info") - } - - chat = &bridgev2.CreateChatResponse{ - Portal: portal, - PortalID: portalKey, - PortalInfo: chatInfo, - } - } - return &bridgev2.ResolveIdentifierResponse{ + users = append(users, &bridgev2.ResolveIdentifierResponse{ UserID: ids.MakeUserID(result.GetFBID()), - Chat: chat, - }, nil + UserInfo: &bridgev2.UserInfo{ + Name: &result.DisplayName, + }, + }) } } - return nil, nil + return users, nil } var ( - _ bridgev2.NetworkAPI = (*MetaClient)(nil) + _ bridgev2.NetworkAPI = (*MetaClient)(nil) + _ bridgev2.UserSearchingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.EditHandlingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.ReactionHandlingNetworkAPI = (*MetaClient)(nil) // _ bridgev2.RedactionHandlingNetworkAPI = (*MetaClient)(nil) diff --git a/pkg/connector/ids/ids.go b/pkg/connector/ids/ids.go index 82a4202..18124f2 100644 --- a/pkg/connector/ids/ids.go +++ b/pkg/connector/ids/ids.go @@ -10,6 +10,14 @@ func MakeUserID(user int64) networkid.UserID { return networkid.UserID(strconv.Itoa(int(user))) } +func ParseIDFromString(id string) (int64, error) { + i, err := strconv.Atoi(id) + if err != nil { + return 0, err + } + return int64(i), nil +} + func MakeUserLoginID(user int64) networkid.UserLoginID { return networkid.UserLoginID(MakeUserID(user)) }