search: implement searching by username
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
@@ -13,9 +13,22 @@ import (
|
|||||||
"go.mau.fi/mautrix-telegram/pkg/connector/ids"
|
"go.mau.fi/mautrix-telegram/pkg/connector/ids"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (t *TelegramClient) SearchUsers(ctx context.Context, query string) ([]*bridgev2.ResolveIdentifierResponse, error) {
|
func (t *TelegramClient) getResolveIdentifierResponseForUserID(ctx context.Context, user tg.UserClass) (*bridgev2.ResolveIdentifierResponse, error) {
|
||||||
// t.client.API().ContactsSearch()
|
networkUserID := ids.MakeUserID(user.GetID())
|
||||||
panic("unimplemented")
|
if userInfo, err := t.getUserInfoFromTelegramUser(ctx, user); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get user info: %w", err)
|
||||||
|
} else if ghost, err := t.main.Bridge.GetGhostByID(ctx, networkUserID); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get ghost: %w", err)
|
||||||
|
} else {
|
||||||
|
return &bridgev2.ResolveIdentifierResponse{
|
||||||
|
Ghost: ghost,
|
||||||
|
UserID: networkUserID,
|
||||||
|
UserInfo: userInfo,
|
||||||
|
Chat: &bridgev2.CreateChatResponse{
|
||||||
|
PortalKey: ids.PeerTypeUser.AsPortalKey(user.GetID(), t.loginID),
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses usernames with or without the @ sign in front of the username.
|
// Parses usernames with or without the @ sign in front of the username.
|
||||||
@@ -76,20 +89,44 @@ func (t *TelegramClient) ResolveIdentifier(ctx context.Context, identifier strin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TelegramClient) getResolveIdentifierResponseForUserID(ctx context.Context, user tg.UserClass) (*bridgev2.ResolveIdentifierResponse, error) {
|
func (t *TelegramClient) SearchUsers(ctx context.Context, query string) (resp []*bridgev2.ResolveIdentifierResponse, err error) {
|
||||||
networkUserID := ids.MakeUserID(user.GetID())
|
contactsFound, err := APICallWithUpdates(ctx, t, func() (*tg.ContactsFound, error) {
|
||||||
if userInfo, err := t.getUserInfoFromTelegramUser(ctx, user); err != nil {
|
return t.client.API().ContactsSearch(ctx, &tg.ContactsSearchRequest{Q: query})
|
||||||
return nil, fmt.Errorf("failed to get user info: %w", err)
|
})
|
||||||
} else if ghost, err := t.main.Bridge.GetGhostByID(ctx, networkUserID); err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to get ghost: %w", err)
|
return nil, err
|
||||||
} else {
|
|
||||||
return &bridgev2.ResolveIdentifierResponse{
|
|
||||||
Ghost: ghost,
|
|
||||||
UserID: networkUserID,
|
|
||||||
UserInfo: userInfo,
|
|
||||||
Chat: &bridgev2.CreateChatResponse{
|
|
||||||
PortalKey: ids.PeerTypeUser.AsPortalKey(user.GetID(), t.loginID),
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
users := map[int64]tg.UserClass{}
|
||||||
|
for _, user := range contactsFound.GetUsers() {
|
||||||
|
users[user.GetID()] = user
|
||||||
|
}
|
||||||
|
|
||||||
|
addResult := func(p tg.PeerClass) error {
|
||||||
|
peer, ok := p.(*tg.PeerUser)
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if user, ok := users[peer.GetUserID()]; ok {
|
||||||
|
if r, err := t.getResolveIdentifierResponseForUserID(ctx, user); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
resp = append(resp, r)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return fmt.Errorf("peer user not found in contact search response")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range contactsFound.MyResults {
|
||||||
|
if err := addResult(p); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, p := range contactsFound.Results {
|
||||||
|
if err := addResult(p); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user