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.
99 lines
2.4 KiB
99 lines
2.4 KiB
package message |
|
|
|
import ( |
|
"context" |
|
|
|
"github.com/go-faster/errors" |
|
|
|
"github.com/gotd/td/telegram/internal/deeplink" |
|
"github.com/gotd/td/telegram/message/peer" |
|
"github.com/gotd/td/tg" |
|
"github.com/gotd/td/tgerr" |
|
) |
|
|
|
// JoinLink joins to private chat using given link or hash. |
|
// Input examples: |
|
// |
|
// t.me/+AAAAAAAAAAAAAAAA |
|
// https://t.me/+AAAAAAAAAAAAAAAA |
|
// t.me/joinchat/AAAAAAAAAAAAAAAA |
|
// https://t.me/joinchat/AAAAAAAAAAAAAAAA |
|
// tg:join?invite=AAAAAAAAAAAAAAAA |
|
// tg://join?invite=AAAAAAAAAAAAAAAA |
|
// |
|
func (s *Sender) JoinLink(ctx context.Context, link string) (tg.UpdatesClass, error) { |
|
hash := link |
|
if deeplink.IsDeeplinkLike(link) { |
|
l, err := deeplink.Expect(link, deeplink.Join) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
hash = l.Args.Get("invite") |
|
} |
|
|
|
return s.JoinHash(ctx, hash) |
|
} |
|
|
|
// JoinHash joins to private chat using given hash. |
|
func (s *Sender) JoinHash(ctx context.Context, hash string) (tg.UpdatesClass, error) { |
|
return s.importChatInvite(ctx, hash) |
|
} |
|
|
|
// Join joins resolved channel. |
|
// NB: if resolved peer is not a channel, error will be returned. |
|
func (b *RequestBuilder) Join(ctx context.Context) (tg.UpdatesClass, error) { |
|
p, err := b.peer(ctx) |
|
if err != nil { |
|
return nil, errors.Wrap(err, "peer") |
|
} |
|
|
|
input, ok := peer.ToInputChannel(p) |
|
if !ok { |
|
return nil, errors.Errorf("unexpected type %T", p) |
|
} |
|
|
|
return b.sender.joinChannel(ctx, input) |
|
} |
|
|
|
func (b *RequestBuilder) leave(ctx context.Context, revoke bool) (tg.UpdatesClass, error) { |
|
p, err := b.peer(ctx) |
|
if err != nil { |
|
return nil, errors.Wrap(err, "peer") |
|
} |
|
|
|
input, ok := peer.ToInputChannel(p) |
|
if ok { |
|
r, err := b.sender.leaveChannel(ctx, input) |
|
if err != nil { |
|
return nil, errors.Wrap(err, "leave channel") |
|
} |
|
return r, nil |
|
} |
|
|
|
chat, ok := p.(*tg.InputPeerChat) |
|
if !ok { |
|
return &tg.Updates{}, nil |
|
} |
|
|
|
r, err := b.sender.deleteChatUser(ctx, &tg.MessagesDeleteChatUserRequest{ |
|
RevokeHistory: revoke, |
|
ChatID: chat.ChatID, |
|
UserID: &tg.InputUserSelf{}, |
|
}) |
|
if err != nil { |
|
// Happens if chat was deactivated. |
|
if tgerr.Is(err, tg.ErrPeerIDInvalid) { |
|
return &tg.Updates{}, nil |
|
} |
|
return nil, errors.Wrap(err, "leave chat") |
|
} |
|
return r, nil |
|
} |
|
|
|
// Leave leaves resolved peer. |
|
// |
|
// NB: if resolved peer is not a channel or chat, or chat is deactivated, empty *tg.Updates will be returned. |
|
func (b *RequestBuilder) Leave(ctx context.Context) (tg.UpdatesClass, error) { |
|
return b.leave(ctx, false) |
|
}
|
|
|