|
@@ -8,6 +8,35 @@ import (
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
+
|
|
|
+// downloadJsonFromUrl downloadns []byte from body of web response of GET url
|
|
|
+func downloadBytesUrl(url string) (jsonData []byte, err error) {
|
|
|
+ webClient := &http.Client{}
|
|
|
+ // Get response from url
|
|
|
+ webResp, err := webClient.Get(url)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ // Close response body
|
|
|
+ defer webResp.Body.Close()
|
|
|
+ // Convert from Reader to []byte
|
|
|
+ jsonData, err = io.ReadAll(webResp.Body)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return jsonData, nil
|
|
|
+}
|
|
|
+
|
|
|
+func removeNulls(data []byte) []byte{
|
|
|
+ // Convert []byte to string
|
|
|
+ dataStr := fmt.Sprintf("%s", data)
|
|
|
+ dataStr = strings.ReplaceAll(dataStr, "null", "0")
|
|
|
+
|
|
|
+ // Covenrt string ot []byte
|
|
|
+ return []byte(dataStr)
|
|
|
+}
|
|
|
+
|
|
|
// Unmarahals JSON from specified url to v
|
|
|
// Usage example:
|
|
|
// <url> - string with web url to raw json data
|
|
@@ -18,27 +47,17 @@ import (
|
|
|
// err := UnmasrshalFromUrl(<url>, &parseTo)
|
|
|
// -- code --
|
|
|
func UnmasrshalFromUrl(url string, v interface{}) error {
|
|
|
- webClient := &http.Client{}
|
|
|
- // Get response from url
|
|
|
- webResp, err := webClient.Get(url)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- // Close response body
|
|
|
- defer webResp.Body.Close()
|
|
|
- // Convert from Reader to []byte
|
|
|
- jsonData, err := io.ReadAll(webResp.Body)
|
|
|
+ // err := downloadJsonFromUrl(url)
|
|
|
+
|
|
|
+ jsonData, err := downloadBytesUrl(url)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- // Convert []byte to string
|
|
|
- jsonDataStr := fmt.Sprintf("%s", jsonData)
|
|
|
- jsonDataStr = strings.ReplaceAll(jsonDataStr, "null", "0")
|
|
|
- // Covenrt string ot []byte
|
|
|
- jsonData = []byte(jsonDataStr)
|
|
|
+
|
|
|
+ jsonData = removeNulls(jsonData)
|
|
|
|
|
|
// LogDebug.Println(v)
|
|
|
- return json.Unmarshal([]byte(jsonData), &v)
|
|
|
+ return json.Unmarshal([]byte(jsonData), &v)
|
|
|
}
|
|
|
|
|
|
|
|
@@ -46,7 +65,12 @@ func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
|
|
|
var currentStats JsonCurrentStats
|
|
|
|
|
|
url := fmt.Sprintf("%s/miner/%s/currentStats", pool, wallet)
|
|
|
- dataExists, err := IsDataExists(url)
|
|
|
+ jsonData, err := downloadBytesUrl(url)
|
|
|
+ if err != nil {
|
|
|
+ return currentStats, err
|
|
|
+ }
|
|
|
+
|
|
|
+ dataExists, err := IsDataExists(jsonData)
|
|
|
if err != nil {
|
|
|
return currentStats, err
|
|
|
}
|
|
@@ -55,14 +79,20 @@ func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
|
|
|
return currentStats, fmt.Errorf("no data for miner %s", wallet)
|
|
|
}
|
|
|
|
|
|
- return currentStats, UnmasrshalFromUrl(url, ¤tStats)
|
|
|
+ return currentStats, json.Unmarshal(jsonData, ¤tStats)//UnmasrshalFromUrl(url, ¤tStats)
|
|
|
}
|
|
|
|
|
|
func Workers(pool, wallet string) (JsonWorker, error) {
|
|
|
var workers JsonWorker
|
|
|
|
|
|
url := fmt.Sprintf("%s/miner/%s/workers", pool, wallet)
|
|
|
- dataExists, err := IsDataExists(url)
|
|
|
+
|
|
|
+ jsonData, err := downloadBytesUrl(url)
|
|
|
+ if err != nil {
|
|
|
+ return workers, err
|
|
|
+ }
|
|
|
+
|
|
|
+ dataExists, err := IsDataExists(jsonData)
|
|
|
if err != nil {
|
|
|
return workers, err
|
|
|
}
|
|
@@ -71,14 +101,21 @@ func Workers(pool, wallet string) (JsonWorker, error) {
|
|
|
return workers, fmt.Errorf("no data for workers of %s", wallet)
|
|
|
}
|
|
|
|
|
|
- return workers, UnmasrshalFromUrl(url, &workers)
|
|
|
+ return workers, json.Unmarshal(jsonData, &workers)//UnmasrshalFromUrl(url, &workers)
|
|
|
}
|
|
|
|
|
|
func Payouts(pool, wallet string) (JsonPayouts, error) {
|
|
|
var payouts JsonPayouts
|
|
|
|
|
|
url := fmt.Sprintf("%s/miner/%s/payouts", pool, wallet)
|
|
|
- // dataExists, err := IsDataExists(url) Not needed for payouts
|
|
|
+
|
|
|
+ jsonData, err := downloadBytesUrl(url)
|
|
|
+ if err != nil {
|
|
|
+ return payouts, fmt.Errorf("couldn't get payouts from %s\n%v", url, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Not needed for payouts
|
|
|
+ // dataExists, err := IsDataExists(url)
|
|
|
// if err != nil {
|
|
|
// return payouts, err
|
|
|
// }
|
|
@@ -86,25 +123,28 @@ func Payouts(pool, wallet string) (JsonPayouts, error) {
|
|
|
// if !dataExists {
|
|
|
// return workers, fmt.Errorf("no data for workers of %s", wallet)
|
|
|
// }
|
|
|
- err := UnmasrshalFromUrl(url, &payouts)
|
|
|
+
|
|
|
+ err = json.Unmarshal(jsonData, &payouts)
|
|
|
if err != nil {
|
|
|
- return payouts, fmt.Errorf("couldn't get payouts from %s", url)
|
|
|
+ return payouts, fmt.Errorf("couldn't parse payouts from %s\n%v", url, err)
|
|
|
}
|
|
|
|
|
|
- return payouts, err
|
|
|
+ return payouts, nil
|
|
|
}
|
|
|
|
|
|
-func IsDataExists(url string) (bool, error) {
|
|
|
+// IsDataExists checks if Data part of json is not string
|
|
|
+// TODO Redo this using dynamic Json unmarshaling
|
|
|
+func IsDataExists(data [] byte) (bool, error) {
|
|
|
+
|
|
|
var base baseResponce
|
|
|
-
|
|
|
- err := UnmasrshalFromUrl(url, &base)
|
|
|
+ err := json.Unmarshal(data, &base)
|
|
|
if err != nil {
|
|
|
- return false, fmt.Errorf("couldn't get base response from %s", url)
|
|
|
+ return false, fmt.Errorf("couldn't get base response from %s")
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if string(base.Data) == "\"NO DATA\"" {
|
|
|
return false, nil
|
|
|
}
|
|
|
|
|
|
return true, nil
|
|
|
-}
|
|
|
+}
|