diff --git a/telegram/utils.go b/telegram/utils.go index 61fefa7..a4f3899 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -179,14 +179,7 @@ func (c *Client) ProcessStatusUpdate(chatID int64, status string, show string, o var photo string if chat != nil && chat.Photo != nil { - path := chat.Photo.Small.Local.Path - if path == "" { - tgFile, err := c.DownloadFile(chat.Photo.Small.Id, 1, true) - if err == nil { - path = tgFile.Local.Path - } - } - file, err := os.Open(path) + file, path, err := c.OpenPhotoFile(chat.Photo.Small, 1) if err == nil { defer file.Close() @@ -1006,6 +999,30 @@ func (c *Client) DownloadFile(id int32, priority int32, synchronous bool) (*clie }) } +// OpenPhotoFile reliably obtains a photo if possible +func (c *Client) OpenPhotoFile(photoFile *client.File, priority int32) (*os.File, string, error) { + if photoFile == nil { + return nil, "", errors.New("Photo file not found") + } + + path := photoFile.Local.Path + file, err := os.Open(path) + if err == nil { + return file, path, nil + // obtain the photo right now if still not downloaded + } else if !photoFile.Local.IsDownloadingCompleted { + tdFile, tdErr := c.DownloadFile(photoFile.Id, priority, true) + if tdErr == nil { + path = tdFile.Local.Path + file, err = os.Open(path) + return file, path, err + } + } + + // give up + return nil, path, err +} + // subscribe to a Telegram ID func (c *Client) subscribeToID(id int64, chat *client.Chat) { var args []args.V diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 4f048fb..ee1db21 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -5,7 +5,6 @@ import ( "encoding/base64" "github.com/pkg/errors" "io" - "os" "strconv" "strings" @@ -252,17 +251,7 @@ func handleGetVcardTempIq(s xmpp.Sender, iq *stanza.IQ) { vcard.Fn.Text = chat.Title if chat.Photo != nil { - path := chat.Photo.Small.Local.Path - file, err := os.Open(path) - // obtain the photo right now if still not downloaded - if err != nil && !chat.Photo.Small.Local.IsDownloadingCompleted { - tdFile, tdErr := session.DownloadFile(chat.Photo.Small.Id, 32, true) - if tdErr == nil { - path = tdFile.Local.Path - file, err = os.Open(path) - } - } - + file, path, err := session.OpenPhotoFile(chat.Photo.Small, 32) if err == nil { defer file.Close()