mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-14 07:26:47 +00:00
* Attempts to update orderbook so it doesn't need to sort * Reverts the ws ob stuff. Gets rid of sorting because it happens later. Adds some exchange features * update existing feature lists. Expands list definition to match my emotions * Adds bithumb bitmex and bitstamp. adds a couple more types * Features for you, features for me, features for bittrex, btcmarkets, btse, coinbasepro, coinut, exmo, gateio and gemini * Features for hitbtc, huobi, itbit, kraken, lakebtc, lbank, localbitcoins, okcoin, okex, poloniex, yobit, zb * Who can forget good old alphapoint? * Adds btcmarksets websocket :glitch_crab: fixes alphapoint features * Adds extra data not in the documentation :/ * Replaces websocket features by using protocol features. However, it breaks it due to import cycles. I'm not sure what I'll do just yet * Removes import cycle via duplicate structs. * Increases coverage of config with `TestCheckCurrencyConfigValues`. Moves all currency pair package types into their own files or places it at the bottom of files if necessary * Increase coverage in code.go * One way of determining a test has failed, is when to it fails. Removed redundant explanation * Increases code coverage of conversion * Lint fixes * Fixes orderbook tests * Re-adds sorting because its important to still have the internal pre-processed orderbook to be representative of a real orderbook * Secret lints that did not show up via Windows linting * Adds protocol package to contain exchange features * Fixes protocol implementation * Fixes ws tests * Addresses the following: Removes st-st-stutters in config types, changes GetAvailableForexProviders -> GetSupportedForexProviders, removes errors from tests where error is nil, removes orderbook setup when not necessary, removes import newlines, removes false bools from declaration, changes should of to should have * imports and casing * Fixes two more nil error checks
194 lines
4.4 KiB
Go
194 lines
4.4 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/websocket"
|
|
"github.com/thrasher-corp/gocryptotrader/common"
|
|
"github.com/thrasher-corp/gocryptotrader/common/crypto"
|
|
"github.com/thrasher-corp/gocryptotrader/config"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
|
)
|
|
|
|
// Vars for the websocket client
|
|
var (
|
|
WSConn *websocket.Conn
|
|
)
|
|
|
|
// WebsocketEvent is the struct used for websocket events
|
|
type WebsocketEvent struct {
|
|
Exchange string `json:"exchange,omitempty"`
|
|
AssetType string `json:"assetType,omitempty"`
|
|
Event string
|
|
Data interface{}
|
|
}
|
|
|
|
// WebsocketAuth is the struct used for a websocket auth request
|
|
type WebsocketAuth struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// WebsocketEventResponse is the struct used for websocket event responses
|
|
type WebsocketEventResponse struct {
|
|
Event string `json:"event"`
|
|
Data interface{} `json:"data"`
|
|
Error string `json:"error"`
|
|
}
|
|
|
|
// WebsocketOrderbookTickerRequest is a struct used for ticker and orderbook
|
|
// requests
|
|
type WebsocketOrderbookTickerRequest struct {
|
|
Exchange string `json:"exchangeName"`
|
|
Currency string `json:"currency"`
|
|
AssetType asset.Item `json:"assetType"`
|
|
}
|
|
|
|
// SendWebsocketEvent sends a websocket event message
|
|
func SendWebsocketEvent(event string, reqData interface{}, result *WebsocketEventResponse) error {
|
|
req := WebsocketEvent{
|
|
Event: event,
|
|
}
|
|
|
|
if reqData != nil {
|
|
req.Data = reqData
|
|
}
|
|
|
|
err := WSConn.WriteJSON(req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = WSConn.ReadJSON(&result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if result.Error != "" {
|
|
return errors.New(result.Error)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func main() {
|
|
cfg := config.GetConfig()
|
|
err := cfg.LoadConfig(config.File, true)
|
|
if err != nil {
|
|
log.Fatalf("Failed to load config file: %s", err)
|
|
}
|
|
|
|
listenAddr := cfg.RemoteControl.WebsocketRPC.ListenAddress
|
|
wsHost := fmt.Sprintf("ws://%s:%d/ws", common.ExtractHost(listenAddr),
|
|
common.ExtractPort(listenAddr))
|
|
log.Printf("Connecting to websocket host: %s", wsHost)
|
|
|
|
var dialer websocket.Dialer
|
|
WSConn, _, err = dialer.Dial(wsHost, http.Header{})
|
|
if err != nil {
|
|
log.Println("Unable to connect to websocket server")
|
|
return
|
|
}
|
|
log.Println("Connected to websocket!")
|
|
|
|
log.Println("Authenticating..")
|
|
var wsResp WebsocketEventResponse
|
|
reqData := WebsocketAuth{
|
|
Username: cfg.RemoteControl.Username,
|
|
Password: crypto.HexEncodeToString(crypto.GetSHA256([]byte(cfg.RemoteControl.Password))),
|
|
}
|
|
err = SendWebsocketEvent("auth", reqData, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Authenticated successfully")
|
|
|
|
log.Println("Getting config..")
|
|
err = SendWebsocketEvent("GetConfig", nil, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Printf("Fetched config.")
|
|
|
|
dataJSON, err := common.JSONEncode(&wsResp.Data)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
var resultCfg config.Config
|
|
err = common.JSONDecode(dataJSON, &resultCfg)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
log.Println("Saving config..")
|
|
origBotName := resultCfg.Name
|
|
resultCfg.Name = "TEST"
|
|
err = SendWebsocketEvent("SaveConfig", resultCfg, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Saved config!")
|
|
resultCfg.Name = origBotName
|
|
err = SendWebsocketEvent("SaveConfig", resultCfg, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Saved config (restored original bot name)!")
|
|
|
|
log.Println("Getting account info..")
|
|
err = SendWebsocketEvent("GetAccountInfo", nil, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Got account info!")
|
|
|
|
log.Println("Getting tickers..")
|
|
err = SendWebsocketEvent("GetTickers", nil, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Got tickers!")
|
|
|
|
log.Println("Getting specific ticker..")
|
|
dataReq := WebsocketOrderbookTickerRequest{
|
|
Exchange: "Bitfinex",
|
|
Currency: "BTCUSD",
|
|
AssetType: asset.Spot,
|
|
}
|
|
|
|
err = SendWebsocketEvent("GetTicker", dataReq, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Got ticker!")
|
|
|
|
log.Println("Getting orderbooks..")
|
|
err = SendWebsocketEvent("GetOrderbooks", nil, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Got orderbooks!")
|
|
|
|
log.Println("Getting specific orderbook..")
|
|
err = SendWebsocketEvent("GetOrderbook", dataReq, &wsResp)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Got orderbook!")
|
|
|
|
for {
|
|
var wsEvent WebsocketEvent
|
|
err = WSConn.ReadJSON(&wsEvent)
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
log.Printf("Recv'd: %s", wsEvent.Event)
|
|
}
|
|
WSConn.Close()
|
|
}
|