Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions cmd/tg/peers.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,22 @@ func builderFor(ctx context.Context, m *peerManager, sender *message.Sender, pee
return sender.Resolve(peer), nil
}

// resolveManagedPeer resolves any <peer> argument — me/self, id:<n>,
// @username, phone or link — to a typed peer.
func resolveManagedPeer(ctx context.Context, m *peerManager, arg string) (peers.Peer, error) {
if isSelf(arg) {
self, err := m.Self(ctx)
if err != nil {
return nil, errors.Wrap(err, "resolve self")
}
return self, nil
}
if isIDArg(arg) {
return m.resolveID(ctx, arg)
}
return m.Resolve(ctx, arg)
}

// resolvePeer turns a peer string into an InputPeer using the cached manager.
// The empty string, "me" and "self" resolve to the current account; an "id:<n>"
// argument resolves a cached peer by numeric id.
Expand Down
26 changes: 26 additions & 0 deletions cmd/tg/peers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import (
"path/filepath"
"testing"

"github.com/go-faster/errors"

"github.com/gotd/td/bin"
"github.com/gotd/td/telegram/message"
"github.com/gotd/td/telegram/peers"
"github.com/gotd/td/tg"
Expand Down Expand Up @@ -139,3 +142,26 @@ func TestBuilderForSelf(t *testing.T) {
}
}
}

func TestResolveManagedPeerSelf(t *testing.T) {
// Regression: watch/wait passed "me" to the username resolver, which
// failed with USERNAME_INVALID.
store, err := peercache.Open(filepath.Join(t.TempDir(), "peers.json"))
if err != nil {
t.Fatal(err)
}
api := newFuncAPI(t, func(req bin.Encoder) (bin.Encoder, error) {
if _, ok := req.(*tg.UsersGetUsersRequest); !ok {
return nil, errors.Errorf("unexpected request %T", req)
}
return &tg.UserClassVector{Elems: []tg.UserClass{&tg.User{ID: 42, Self: true, AccessHash: 1}}}, nil
})
m := &peerManager{Manager: peers.Options{Storage: store}.Build(api), store: store}

for _, arg := range []string{"Me", "SELF", ""} {
p, err := resolveManagedPeer(context.Background(), m, arg)
if err != nil || p.ID() != 42 {
t.Errorf("resolveManagedPeer(%q) = %v, %v; want self (42)", arg, p, err)
}
}
}
2 changes: 1 addition & 1 deletion cmd/tg/watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func (a *app) resolveFilterFor(ctx context.Context, api *tg.Client, st *accountS
if err != nil {
return 0, err
}
p, err := m.Resolve(ctx, args[0])
p, err := resolveManagedPeer(ctx, m, args[0])
if err != nil {
return 0, errors.Wrapf(err, "resolve %q", args[0])
}
Expand Down