unmasrshal_url.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package ethermineapi
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "strings"
  8. )
  9. // downloadJsonFromUrl downloadns []byte from body of web response of GET url
  10. func downloadBytesUrl(url string) (jsonData []byte, err error) {
  11. webClient := &http.Client{}
  12. // Get response from url
  13. webResp, err := webClient.Get(url)
  14. if err != nil {
  15. return nil, err
  16. }
  17. // Close response body
  18. defer webResp.Body.Close()
  19. // Convert from Reader to []byte
  20. jsonData, err = io.ReadAll(webResp.Body)
  21. if err != nil {
  22. return nil, err
  23. }
  24. return jsonData, nil
  25. }
  26. func removeNulls(data []byte) []byte{
  27. // Convert []byte to string
  28. dataStr := fmt.Sprintf("%s", data)
  29. dataStr = strings.ReplaceAll(dataStr, "null", "0")
  30. // Covenrt string ot []byte
  31. return []byte(dataStr)
  32. }
  33. // Unmarahals JSON from specified url to v
  34. // Usage example:
  35. // <url> - string with web url to raw json data
  36. // <JsonStruct> - struct type that describes json data at <url>
  37. //
  38. // -- code --
  39. // var parseTo <JsonStruct>
  40. // err := UnmasrshalFromUrl(<url>, &parseTo)
  41. // -- code --
  42. func UnmasrshalFromUrl(url string, v interface{}) error {
  43. // err := downloadJsonFromUrl(url)
  44. jsonData, err := downloadBytesUrl(url)
  45. if err != nil {
  46. return err
  47. }
  48. jsonData = removeNulls(jsonData)
  49. // LogDebug.Println(v)
  50. return json.Unmarshal([]byte(jsonData), &v)
  51. }
  52. func MinerStats(pool, wallet string) (JsonCurrentStats, error) {
  53. var currentStats JsonCurrentStats
  54. url := fmt.Sprintf("%s/miner/%s/currentStats", pool, wallet)
  55. jsonData, err := downloadBytesUrl(url)
  56. if err != nil {
  57. return currentStats, err
  58. }
  59. dataExists, err := IsDataExists(jsonData)
  60. if err != nil {
  61. return currentStats, err
  62. }
  63. if !dataExists {
  64. return currentStats, fmt.Errorf("no data for miner %s", wallet)
  65. }
  66. return currentStats, json.Unmarshal(jsonData, &currentStats)//UnmasrshalFromUrl(url, &currentStats)
  67. }
  68. func Workers(pool, wallet string) (JsonWorker, error) {
  69. var workers JsonWorker
  70. url := fmt.Sprintf("%s/miner/%s/workers", pool, wallet)
  71. jsonData, err := downloadBytesUrl(url)
  72. if err != nil {
  73. return workers, err
  74. }
  75. dataExists, err := IsDataExists(jsonData)
  76. if err != nil {
  77. return workers, err
  78. }
  79. if !dataExists {
  80. return workers, fmt.Errorf("no data for workers of %s", wallet)
  81. }
  82. return workers, json.Unmarshal(jsonData, &workers)//UnmasrshalFromUrl(url, &workers)
  83. }
  84. func Payouts(pool, wallet string) (JsonPayouts, error) {
  85. var payouts JsonPayouts
  86. url := fmt.Sprintf("%s/miner/%s/payouts", pool, wallet)
  87. jsonData, err := downloadBytesUrl(url)
  88. if err != nil {
  89. return payouts, fmt.Errorf("couldn't get payouts from %s\n%v", url, err)
  90. }
  91. // Not needed for payouts
  92. // dataExists, err := IsDataExists(url)
  93. // if err != nil {
  94. // return payouts, err
  95. // }
  96. //
  97. // if !dataExists {
  98. // return workers, fmt.Errorf("no data for workers of %s", wallet)
  99. // }
  100. err = json.Unmarshal(jsonData, &payouts)
  101. if err != nil {
  102. return payouts, fmt.Errorf("couldn't parse payouts from %s\n%v", url, err)
  103. }
  104. return payouts, nil
  105. }
  106. // IsDataExists checks if Data part of json is not string
  107. // TODO Redo this using dynamic Json unmarshaling
  108. func IsDataExists(data [] byte) (bool, error) {
  109. var base baseResponce
  110. err := json.Unmarshal(data, &base)
  111. if err != nil {
  112. return false, fmt.Errorf("couldn't get base response from %s", err.Error())
  113. }
  114. if string(base.Data) == "\"NO DATA\"" {
  115. return false, nil
  116. }
  117. return true, nil
  118. }