You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.5 KiB
62 lines
1.5 KiB
package peer |
|
|
|
import ( |
|
"context" |
|
|
|
"github.com/go-faster/errors" |
|
|
|
"github.com/gotd/td/tg" |
|
) |
|
|
|
// Resolver is an abstraction to resolve domains and Telegram deeplinks. |
|
type Resolver interface { |
|
ResolveDomain(ctx context.Context, domain string) (tg.InputPeerClass, error) |
|
ResolvePhone(ctx context.Context, phone string) (tg.InputPeerClass, error) |
|
} |
|
|
|
// DefaultResolver creates and returns default resolver. |
|
func DefaultResolver(raw *tg.Client) Resolver { |
|
return NewLRUResolver(SingleflightResolver(Plain(raw)), 10) |
|
} |
|
|
|
// Plain creates plain resolver. |
|
func Plain(raw *tg.Client) Resolver { |
|
return plainResolver{raw: raw} |
|
} |
|
|
|
type plainResolver struct { |
|
raw *tg.Client |
|
} |
|
|
|
func (p plainResolver) ResolveDomain(ctx context.Context, domain string) (tg.InputPeerClass, error) { |
|
peer, err := p.raw.ContactsResolveUsername(ctx, domain) |
|
if err != nil { |
|
return nil, errors.Wrap(err, "resolve") |
|
} |
|
|
|
return EntitiesFromResult(peer).ExtractPeer(peer.Peer) |
|
} |
|
|
|
func (p plainResolver) ResolvePhone(ctx context.Context, phone string) (tg.InputPeerClass, error) { |
|
r, err := p.raw.ContactsGetContacts(ctx, 0) |
|
if err != nil { |
|
return nil, errors.Wrap(err, "get contacts") |
|
} |
|
|
|
switch c := r.(type) { |
|
case *tg.ContactsContacts: |
|
for _, u := range c.Users { |
|
user, ok := u.AsNotEmpty() |
|
if !ok { |
|
continue |
|
} |
|
if user.Phone == phone { |
|
return user.AsInputPeer(), nil |
|
} |
|
} |
|
|
|
return nil, errors.Errorf("can't resolve phone %q", phone) |
|
default: |
|
return nil, errors.Errorf("unexpected type %T", r) |
|
} |
|
}
|
|
|