package main import ( "context" "errors" "fmt" "strings" ) var ( errTelegramOtherMedia = errors.New("only text messages are supported") errTelegramPhotoSize = errors.New("no photo size fits 1568 pixels") ) // telegramImageText selects a supplied photo size, or an image document, and // stores it before returning marker text with the unchanged caption. func telegramImageText(ctx context.Context, api *TelegramAPI, store *ImageStore, message *TelegramMessage) (string, error) { var ( id string size int64 ) if len(message.Photo) > 0 { var area int for _, photo := range message.Photo { if photo.Width <= 0 || photo.Height <= 0 || max(photo.Width, photo.Height) > 1568 { continue } if photo.Width*photo.Height > area { id = photo.FileID size = photo.FileSize area = photo.Width * photo.Height } } if id == "" { return "", errTelegramPhotoSize } } else if message.Document != nil { document := message.Document switch document.MimeType { case "image/jpeg", "image/png", "image/webp": id = document.FileID size = document.FileSize default: if strings.HasPrefix(document.MimeType, "image/") { return "", errImageFormat } return "", errTelegramOtherMedia } } if size > imageMaxBytes { return "", errImageSize } data, err := api.GetImage(ctx, id) if err != nil { return "", fmt.Errorf("download image: %w", err) } name, err := store.Save(data) if err != nil { return "", fmt.Errorf("store image: %w", err) } return imageText([]string{name}, message.Caption), nil }