Browse Source

Current price ++

master
yuriy0803 5 years ago
parent
commit
4ef1724753
  1. 140
      exchange/exchange.go

140
exchange/exchange.go

@ -0,0 +1,140 @@
package exchange
import (
"sync"
"encoding/json"
"time"
"net/http"
"log"
"github.com/yuriy0803/open-etc-pool-friends/util"
"github.com/yuriy0803/open-etc-pool-friends/storage"
"io/ioutil"
)
type ExchangeProcessor struct {
ExchangeConfig *ExchangeConfig
backend *storage.RedisClient
rpc *RestClient
halt bool
}
type ExchangeConfig struct {
Enabled bool `json:"enabled"`
Name string `json:"name"`
Url string `json:"url"`
Timeout string `json:"timeout"`
RefreshInterval string `json:"refreshInterval"`
}
type RestClient struct {
sync.RWMutex
Url string
Name string
sick bool
sickRate int
successRate int
client *http.Client
}
type ExchangeReply []map[string]interface{}
func NewRestClient(name, url, timeout string) *RestClient {
restClient := &RestClient{Name: name, Url: url}
timeoutIntv := util.MustParseDuration(timeout)
restClient.client = &http.Client{
Timeout: timeoutIntv,
}
return restClient
}
func (r *RestClient) GetData() (ExchangeReply, error) {
Resp, err := r.doPost(r.Url, "ticker")
if err != nil {
return nil, err
}
//var reply map[string][]interface{}
var data ExchangeReply
err = json.Unmarshal(Resp, &data)
return data, err
}
func StartExchangeProcessor(cfg *ExchangeConfig, backend *storage.RedisClient)*ExchangeProcessor{
u := &ExchangeProcessor{ExchangeConfig: cfg, backend: backend}
u.rpc = NewRestClient("ExchangeProcessor", cfg.Url, cfg.Timeout)
return u
}
func (u *ExchangeProcessor) Start(){
refreshIntv := util.MustParseDuration(u.ExchangeConfig.RefreshInterval)
refreshTimer := time.NewTimer(refreshIntv)
log.Printf("Set Exchange data refresh every %v", refreshIntv)
u.fetchData()
refreshTimer.Reset(refreshIntv)
go func() {
for {
select {
case <-refreshTimer.C:
u.fetchData()
refreshTimer.Reset(refreshIntv)
}
}
}()
}
func (u *ExchangeProcessor) fetchData() {
reply, err := u.rpc.GetData()
if err != nil {
log.Printf("Failed to fetch data from exchange %v", err)
return
}
//log.Printf("Reply %v", reply)
//Store the data into the Redis Store
u.backend.StoreExchangeData(reply)
if err != nil {
log.Printf("Failed to Store the data to echange %v", err)
return
}
return
}
func (r *RestClient) doPost(url string, method string) ([]byte, error) {
req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
log.Println(req)
resp, err := r.client.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode == 200 { // OK
bodyBytes, err2 := ioutil.ReadAll(resp.Body)
return bodyBytes, err2
}
return nil, err
}
Loading…
Cancel
Save