mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-21 15:10:12 +00:00
Link up websocket handler to routes after refactor and various improvements
This commit is contained in:
@@ -1,116 +1,114 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"github.com/thrasher-/gocryptotrader/common"
|
||||
"github.com/thrasher-/gocryptotrader/config"
|
||||
)
|
||||
|
||||
// Vars for the websocket client
|
||||
var (
|
||||
WSConn *websocket.Conn
|
||||
)
|
||||
|
||||
// WebsocketEvent is the struct used for websocket events
|
||||
type WebsocketEvent struct {
|
||||
Event string `json:"event"`
|
||||
Data interface{} `json:"data"`
|
||||
Exchange string `json:"exchange,omitempty"`
|
||||
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"`
|
||||
}
|
||||
|
||||
type WebsocketTickerRequest struct {
|
||||
Exchange string `json:"exchangeName"`
|
||||
Currency string `json:"currency"`
|
||||
// WebsocketOrderbookTickerRequest is a struct used for ticker and orderbook
|
||||
// requests
|
||||
type WebsocketOrderbookTickerRequest struct {
|
||||
Exchange string `json:"exchangeName"`
|
||||
Currency string `json:"currency"`
|
||||
AssetType string `json:"assetType"`
|
||||
}
|
||||
|
||||
func SendWebsocketAuth(username, password string) error {
|
||||
pwHash := common.HexEncodeToString(common.GetSHA256([]byte(password)))
|
||||
// SendWebsocketEvent sends a websocket event message
|
||||
func SendWebsocketEvent(event string, reqData interface{}, result *WebsocketEventResponse) error {
|
||||
req := WebsocketEvent{
|
||||
Event: "auth",
|
||||
Data: WebsocketAuth{
|
||||
Username: username,
|
||||
Password: pwHash,
|
||||
},
|
||||
Event: event,
|
||||
}
|
||||
|
||||
return SendWebsocketMsg(req)
|
||||
}
|
||||
|
||||
func SendWebsocketMsg(data interface{}) error {
|
||||
return WSConn.WriteJSON(data)
|
||||
}
|
||||
|
||||
func GetWebsocketTicker(currency string) error {
|
||||
wsevt := WebsocketEvent{
|
||||
Event: "ticker",
|
||||
Data: currency,
|
||||
if reqData != nil {
|
||||
req.Data = reqData
|
||||
}
|
||||
|
||||
return SendWebsocketMsg(wsevt)
|
||||
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.ConfigFile)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to load config file: %s", err)
|
||||
}
|
||||
|
||||
listenAddr := cfg.Webserver.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
|
||||
var err error
|
||||
|
||||
WSConn, _, err = Dialer.Dial("ws://localhost:9050/ws", http.Header{})
|
||||
|
||||
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..")
|
||||
SendWebsocketAuth("blah", "blah")
|
||||
|
||||
var wsResp WebsocketEventResponse
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
reqData := WebsocketAuth{
|
||||
Username: cfg.Webserver.AdminUsername,
|
||||
Password: common.HexEncodeToString(common.GetSHA256([]byte(cfg.Webserver.AdminPassword))),
|
||||
}
|
||||
err = SendWebsocketEvent("auth", reqData, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
}
|
||||
|
||||
log.Println("Authenticated successfully")
|
||||
|
||||
log.Println("Getting config..")
|
||||
|
||||
req := WebsocketEvent{
|
||||
Event: "GetConfig",
|
||||
}
|
||||
|
||||
err = WSConn.WriteJSON(req)
|
||||
err = SendWebsocketEvent("GetConfig", nil, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
}
|
||||
|
||||
log.Printf("Fetched config.")
|
||||
|
||||
dataJSON, err := common.JSONEncode(&wsResp.Data)
|
||||
@@ -124,112 +122,70 @@ func main() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
resultCfg.Name = "TEST"
|
||||
|
||||
req = WebsocketEvent{
|
||||
Event: "SaveConfig",
|
||||
Data: resultCfg,
|
||||
}
|
||||
|
||||
log.Println("Saving config..")
|
||||
err = WSConn.WriteJSON(req)
|
||||
origBotName := resultCfg.Name
|
||||
resultCfg.Name = "TEST"
|
||||
err = SendWebsocketEvent("SaveConfig", resultCfg, &wsResp)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
}
|
||||
|
||||
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..")
|
||||
|
||||
req = WebsocketEvent{
|
||||
Event: "GetAccountInfo",
|
||||
}
|
||||
|
||||
err = WSConn.WriteJSON(req)
|
||||
err = SendWebsocketEvent("GetAccountInfo", nil, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Got account info!")
|
||||
|
||||
log.Println("Getting tickers..")
|
||||
|
||||
req = WebsocketEvent{
|
||||
Event: "GetTickers",
|
||||
}
|
||||
|
||||
err = WSConn.WriteJSON(req)
|
||||
err = SendWebsocketEvent("GetTickers", nil, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Got tickers!")
|
||||
|
||||
log.Println("Getting specific ticker..")
|
||||
|
||||
var tickReq WebsocketTickerRequest
|
||||
tickReq.Currency = "LTCUSD"
|
||||
tickReq.Exchange = "Bitfinex"
|
||||
|
||||
req = WebsocketEvent{
|
||||
Event: "GetTicker",
|
||||
Data: tickReq,
|
||||
dataReq := WebsocketOrderbookTickerRequest{
|
||||
Exchange: "Bitfinex",
|
||||
Currency: "BTCUSD",
|
||||
AssetType: "SPOT",
|
||||
}
|
||||
|
||||
err = WSConn.WriteJSON(req)
|
||||
err = SendWebsocketEvent("GetTicker", dataReq, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Got ticker!")
|
||||
|
||||
err = WSConn.ReadJSON(&wsResp)
|
||||
log.Println("Getting orderbooks..")
|
||||
err = SendWebsocketEvent("GetOrderbooks", nil, &wsResp)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
log.Fatal(err)
|
||||
}
|
||||
log.Println("Got orderbooks!")
|
||||
|
||||
if wsResp.Error != "" {
|
||||
log.Fatal(wsResp.Error)
|
||||
log.Println("Getting specific orderbook..")
|
||||
err = SendWebsocketEvent("GetOrderbook", dataReq, &wsResp)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Println(wsResp)
|
||||
log.Println("Got orderbook!")
|
||||
|
||||
for {
|
||||
msgType, resp, err := WSConn.ReadMessage()
|
||||
var wsEvent WebsocketEventResponse
|
||||
err = WSConn.ReadJSON(&wsEvent)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
break
|
||||
}
|
||||
|
||||
log.Println(msgType)
|
||||
log.Println(string(resp))
|
||||
log.Printf("Recv'd: %s", wsEvent.Event)
|
||||
}
|
||||
time.Sleep(time.Second * 10)
|
||||
WSConn.Close()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user