123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- package ethermineapi
- import (
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "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
- // <JsonStruct> - struct type that describes json data at <url>
- //
- // -- code --
- // var parseTo <JsonStruct>
- // err := UnmasrshalFromUrl(<url>, &parseTo)
- // -- code --
- func UnmasrshalFromUrl(url string, v interface{}) error {
- // err := downloadJsonFromUrl(url)
- jsonData, err := downloadBytesUrl(url)
- if err != nil {
- return err
- }
- jsonData = removeNulls(jsonData)
- // LogDebug.Println(v)
- return json.Unmarshal([]byte(jsonData), &v)
- }
- func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
- var currentStats JsonCurrentStats
- url := fmt.Sprintf("%s/miner/%s/currentStats", pool, wallet)
- jsonData, err := downloadBytesUrl(url)
- if err != nil {
- return currentStats, err
- }
- dataExists, err := IsDataExists(jsonData)
- if err != nil {
- return currentStats, err
- }
- if !dataExists {
- return currentStats, fmt.Errorf("no data for miner %s", wallet)
- }
- 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)
- jsonData, err := downloadBytesUrl(url)
- if err != nil {
- return workers, err
- }
- dataExists, err := IsDataExists(jsonData)
- if err != nil {
- return workers, err
- }
- if !dataExists {
- return workers, fmt.Errorf("no data for workers of %s", wallet)
- }
- 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)
- 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
- // }
- //
- // if !dataExists {
- // return workers, fmt.Errorf("no data for workers of %s", wallet)
- // }
- err = json.Unmarshal(jsonData, &payouts)
- if err != nil {
- return payouts, fmt.Errorf("couldn't parse payouts from %s\n%v", url, err)
- }
- return payouts, nil
- }
- // 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 := json.Unmarshal(data, &base)
- if err != nil {
- return false, fmt.Errorf("couldn't get base response from %s", err.Error())
- }
- if string(base.Data) == "\"NO DATA\"" {
- return false, nil
- }
- return true, nil
- }
|