Files
gocryptotrader/tools/websocket_client/main.go
2017-09-14 15:08:19 +10:00

236 lines
3.8 KiB
Go

package main
import (
"log"
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/thrasher-/gocryptotrader/common"
"github.com/thrasher-/gocryptotrader/config"
)
var (
WSConn *websocket.Conn
)
type WebsocketEvent struct {
Event string `json:"event"`
Data interface{} `json:"data"`
Exchange string `json:"exchange,omitempty"`
}
type WebsocketAuth struct {
Username string `json:"username"`
Password string `json:"password"`
}
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"`
}
func SendWebsocketAuth(username, password string) error {
pwHash := common.HexEncodeToString(common.GetSHA256([]byte(password)))
req := WebsocketEvent{
Event: "auth",
Data: WebsocketAuth{
Username: username,
Password: pwHash,
},
}
return SendWebsocketMsg(req)
}
func SendWebsocketMsg(data interface{}) error {
return WSConn.WriteJSON(data)
}
func GetWebsocketTicker(currency string) error {
wsevt := WebsocketEvent{
Event: "ticker",
Data: currency,
}
return SendWebsocketMsg(wsevt)
}
func main() {
var Dialer websocket.Dialer
var err error
WSConn, _, err = Dialer.Dial("ws://localhost:9050/ws", 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)
if err != nil {
log.Println(err)
return
}
if wsResp.Error != "" {
log.Fatal(wsResp.Error)
}
log.Println("Authenticated successfully")
log.Println("Getting config..")
req := WebsocketEvent{
Event: "GetConfig",
}
err = WSConn.WriteJSON(req)
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.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)
}
resultCfg.Name = "TEST"
req = WebsocketEvent{
Event: "SaveConfig",
Data: resultCfg,
}
log.Println("Saving config..")
err = WSConn.WriteJSON(req)
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!")
log.Println("Getting account info..")
req = WebsocketEvent{
Event: "GetAccountInfo",
}
err = WSConn.WriteJSON(req)
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.Println("Getting tickers..")
req = WebsocketEvent{
Event: "GetTickers",
}
err = WSConn.WriteJSON(req)
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.Println("Getting specific ticker..")
var tickReq WebsocketTickerRequest
tickReq.Currency = "LTCUSD"
tickReq.Exchange = "Bitfinex"
req = WebsocketEvent{
Event: "GetTicker",
Data: tickReq,
}
err = WSConn.WriteJSON(req)
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.Println(wsResp)
for {
msgType, resp, err := WSConn.ReadMessage()
if err != nil {
log.Fatal(err)
}
log.Println(msgType)
log.Println(string(resp))
}
time.Sleep(time.Second * 10)
WSConn.Close()
}