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.
163 lines
4.3 KiB
163 lines
4.3 KiB
3 years ago
|
package message
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"time"
|
||
|
|
||
|
"github.com/go-faster/errors"
|
||
|
|
||
|
"github.com/gotd/td/tg"
|
||
|
)
|
||
|
|
||
|
// PhotoBuilder is a Photo media option.
|
||
|
type PhotoBuilder struct {
|
||
|
photo tg.InputMediaPhoto
|
||
|
caption []StyledTextOption
|
||
|
}
|
||
|
|
||
|
// TTL sets time to live of self-destructing photo.
|
||
|
func (u *PhotoBuilder) TTL(ttl time.Duration) *PhotoBuilder {
|
||
|
return u.TTLSeconds(int(ttl.Seconds()))
|
||
|
}
|
||
|
|
||
|
// TTLSeconds sets time to live in seconds of self-destructing photo.
|
||
|
func (u *PhotoBuilder) TTLSeconds(ttl int) *PhotoBuilder {
|
||
|
u.photo.TTLSeconds = ttl
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
// apply implements MediaOption.
|
||
|
func (u *PhotoBuilder) apply(ctx context.Context, b *multiMediaBuilder) error {
|
||
|
return Media(&u.photo, u.caption...).apply(ctx, b)
|
||
|
}
|
||
|
|
||
|
// applyMulti implements MultiMediaOption.
|
||
|
func (u *PhotoBuilder) applyMulti(ctx context.Context, b *multiMediaBuilder) error {
|
||
|
return u.apply(ctx, b)
|
||
|
}
|
||
|
|
||
|
// Photo adds photo attachment.
|
||
|
func Photo(photo FileLocation, caption ...StyledTextOption) *PhotoBuilder {
|
||
|
v := new(tg.InputPhoto)
|
||
|
v.FillFrom(photo)
|
||
|
|
||
|
return &PhotoBuilder{
|
||
|
photo: tg.InputMediaPhoto{
|
||
|
ID: v,
|
||
|
},
|
||
|
caption: caption,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Photo sends photo.
|
||
|
func (b *Builder) Photo(
|
||
|
ctx context.Context,
|
||
|
photo FileLocation, caption ...StyledTextOption,
|
||
|
) (tg.UpdatesClass, error) {
|
||
|
return b.Media(ctx, Photo(photo, caption...))
|
||
|
}
|
||
|
|
||
|
// PhotoExternalBuilder is a PhotoExternal media option.
|
||
|
type PhotoExternalBuilder struct {
|
||
|
doc tg.InputMediaPhotoExternal
|
||
|
caption []StyledTextOption
|
||
|
}
|
||
|
|
||
|
// TTL sets time to live of self-destructing document.
|
||
|
func (u *PhotoExternalBuilder) TTL(ttl time.Duration) *PhotoExternalBuilder {
|
||
|
return u.TTLSeconds(int(ttl.Seconds()))
|
||
|
}
|
||
|
|
||
|
// TTLSeconds sets time to live in seconds of self-destructing document.
|
||
|
func (u *PhotoExternalBuilder) TTLSeconds(ttl int) *PhotoExternalBuilder {
|
||
|
u.doc.TTLSeconds = ttl
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
// apply implements MediaOption.
|
||
|
func (u *PhotoExternalBuilder) apply(ctx context.Context, b *multiMediaBuilder) error {
|
||
|
return Media(&u.doc, u.caption...).apply(ctx, b)
|
||
|
}
|
||
|
|
||
|
// PhotoExternal adds photo attachment which will be downloaded by the Telegram servers.
|
||
|
func PhotoExternal(url string, caption ...StyledTextOption) *PhotoExternalBuilder {
|
||
|
return &PhotoExternalBuilder{
|
||
|
doc: tg.InputMediaPhotoExternal{
|
||
|
URL: url,
|
||
|
},
|
||
|
caption: caption,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// PhotoExternal sends photo attachment which will be downloaded by the Telegram servers.
|
||
|
func (b *Builder) PhotoExternal(
|
||
|
ctx context.Context,
|
||
|
url string, caption ...StyledTextOption,
|
||
|
) (tg.UpdatesClass, error) {
|
||
|
return b.Media(ctx, PhotoExternal(url, caption...))
|
||
|
}
|
||
|
|
||
|
// UploadedPhotoBuilder is a UploadedPhoto media option.
|
||
|
type UploadedPhotoBuilder struct {
|
||
|
photo tg.InputMediaUploadedPhoto
|
||
|
caption []StyledTextOption
|
||
|
}
|
||
|
|
||
|
// Stickers adds attached mask stickers.
|
||
|
func (u *UploadedPhotoBuilder) Stickers(stickers ...FileLocation) *UploadedPhotoBuilder {
|
||
|
u.photo.Stickers = append(u.photo.Stickers, inputDocuments(stickers...)...)
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
// TTL sets time to live of self-destructing photo.
|
||
|
func (u *UploadedPhotoBuilder) TTL(ttl time.Duration) *UploadedPhotoBuilder {
|
||
|
return u.TTLSeconds(int(ttl.Seconds()))
|
||
|
}
|
||
|
|
||
|
// TTLSeconds sets time to live in seconds of self-destructing photo.
|
||
|
func (u *UploadedPhotoBuilder) TTLSeconds(ttl int) *UploadedPhotoBuilder {
|
||
|
u.photo.TTLSeconds = ttl
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
// apply implements MediaOption.
|
||
|
func (u *UploadedPhotoBuilder) apply(ctx context.Context, b *multiMediaBuilder) error {
|
||
|
return Media(&u.photo, u.caption...).apply(ctx, b)
|
||
|
}
|
||
|
|
||
|
// applyMulti implements MultiMediaOption.
|
||
|
func (u *UploadedPhotoBuilder) applyMulti(ctx context.Context, b *multiMediaBuilder) error {
|
||
|
m, err := b.sender.uploadMedia(ctx, &tg.MessagesUploadMediaRequest{
|
||
|
Peer: b.peer,
|
||
|
Media: &u.photo,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, "upload media")
|
||
|
}
|
||
|
|
||
|
input, err := convertMessageMediaToInput(m)
|
||
|
if err != nil {
|
||
|
return errors.Wrap(err, "convert")
|
||
|
}
|
||
|
|
||
|
return Media(input, u.caption...).apply(ctx, b)
|
||
|
}
|
||
|
|
||
|
// UploadedPhoto adds photo attachment.
|
||
|
func UploadedPhoto(file tg.InputFileClass, caption ...StyledTextOption) *UploadedPhotoBuilder {
|
||
|
return &UploadedPhotoBuilder{
|
||
|
photo: tg.InputMediaUploadedPhoto{
|
||
|
File: file,
|
||
|
},
|
||
|
caption: caption,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// UploadedPhoto sends uploaded file as photo.
|
||
|
func (b *Builder) UploadedPhoto(
|
||
|
ctx context.Context,
|
||
|
file tg.InputFileClass, caption ...StyledTextOption,
|
||
|
) (tg.UpdatesClass, error) {
|
||
|
return b.Media(ctx, UploadedPhoto(file, caption...))
|
||
|
}
|