aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--telegram/utils.go33
-rw-r--r--xmpp/handlers.go13
2 files changed, 26 insertions, 20 deletions
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()