github.com/status-im/status-go@v1.1.0/services/gif/gif.go (about) 1 package gif 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "time" 9 10 "github.com/ethereum/go-ethereum/log" 11 "github.com/status-im/status-go/multiaccounts/accounts" 12 "github.com/status-im/status-go/multiaccounts/settings" 13 ) 14 15 type Gif struct { 16 ID string `json:"id"` 17 Title string `json:"title"` 18 URL string `json:"url"` 19 TinyURL string `json:"tinyUrl"` 20 Height int `json:"height"` 21 IsFavorite bool `json:"isFavorite"` 22 } 23 24 type Container struct { 25 Items []Gif `json:"items"` 26 } 27 28 var tenorAPIKey = "" 29 var defaultParams = "&media_filter=minimal&limit=50&key=" 30 31 const maxRetry = 3 32 const baseURL = "https://g.tenor.com/v1/" 33 34 func NewGifAPI(db *accounts.Database) *API { 35 return &API{db} 36 } 37 38 // API is class with methods available over RPC. 39 type API struct { 40 db *accounts.Database 41 } 42 43 func (api *API) SetTenorAPIKey(key string) (err error) { 44 log.Info("[GifAPI::SetTenorAPIKey]") 45 err = api.db.SaveSettingField(settings.GifAPIKey, key) 46 if err != nil { 47 return err 48 } 49 tenorAPIKey = key 50 return nil 51 } 52 53 func (api *API) GetContentWithRetry(path string) (value string, err error) { 54 var currentRetry = 0 55 var response *http.Response 56 for currentRetry < maxRetry { 57 transport := &http.Transport{ 58 Proxy: http.ProxyFromEnvironment, 59 ResponseHeaderTimeout: time.Second * 1, 60 } 61 62 client := http.Client{ 63 Timeout: 1 * time.Second, 64 Transport: transport, 65 } 66 67 response, err = client.Get(baseURL + path + defaultParams + tenorAPIKey) 68 69 if err != nil { 70 log.Error("can't get content from path %s with %s", path, err.Error()) 71 currentRetry++ 72 time.Sleep(100 * time.Millisecond) 73 } else { 74 break 75 } 76 } 77 78 if response == nil { 79 return "", fmt.Errorf("Could not reach Tenor API") 80 } 81 defer response.Body.Close() 82 83 if response.StatusCode != http.StatusOK { 84 return "", fmt.Errorf("Status error: %v", response.StatusCode) 85 } 86 87 data, err := ioutil.ReadAll(response.Body) 88 if err != nil { 89 return "", fmt.Errorf("Read body: %v", err) 90 } 91 92 return string(data), nil 93 } 94 95 func (api *API) FetchGifs(path string) (value string, err error) { 96 log.Info("[GifAPI::fetchGifs]") 97 return api.GetContentWithRetry(path) 98 } 99 100 func (api *API) UpdateRecentGifs(updatedGifs json.RawMessage) (err error) { 101 log.Info("[GifAPI::updateRecentGifs]") 102 recentGifsContainer := Container{} 103 err = json.Unmarshal(updatedGifs, &recentGifsContainer) 104 if err != nil { 105 return err 106 } 107 err = api.db.SaveSettingField(settings.GifRecents, recentGifsContainer.Items) 108 if err != nil { 109 return err 110 } 111 return nil 112 } 113 114 func (api *API) UpdateFavoriteGifs(updatedGifs json.RawMessage) (err error) { 115 log.Info("[GifAPI::updateFavoriteGifs]", updatedGifs) 116 favsGifsContainer := Container{} 117 err = json.Unmarshal(updatedGifs, &favsGifsContainer) 118 if err != nil { 119 return err 120 } 121 err = api.db.SaveSettingField(settings.GifFavourites, favsGifsContainer.Items) 122 if err != nil { 123 return err 124 } 125 return nil 126 } 127 128 func (api *API) GetRecentGifs() (recentGifs []Gif, err error) { 129 log.Info("[GifAPI::getRecentGifs]") 130 gifs, err := api.db.GifRecents() 131 if err != nil { 132 return nil, err 133 } 134 recentGifs = make([]Gif, 0) 135 savedRecentGifs := []Gif{} 136 if len(gifs) > 0 { 137 err = json.Unmarshal(gifs, &savedRecentGifs) 138 if err != nil { 139 return nil, err 140 } 141 recentGifs = savedRecentGifs 142 } 143 return recentGifs, nil 144 } 145 146 func (api *API) GetFavoriteGifs() (favoriteGifs []Gif, err error) { 147 log.Info("[GifAPI::getFavoriteGifs]") 148 gifs, err := api.db.GifFavorites() 149 if err != nil { 150 return nil, err 151 } 152 favoriteGifs = make([]Gif, 0) 153 savedFavGifs := []Gif{} 154 if len(gifs) > 0 { 155 err = json.Unmarshal(gifs, &savedFavGifs) 156 if err != nil { 157 return nil, err 158 } 159 favoriteGifs = savedFavGifs 160 } 161 return favoriteGifs, nil 162 }