Files
gocryptotrader/okcoinwebsocket.go

104 lines
2.0 KiB
Go

package main
import (
"log"
"net/http"
"time"
"fmt"
"github.com/gorilla/websocket"
)
type OKCoinWebsocketEvent struct {
Event string `json:"event"`
Channel string `json:"channel"`
}
type OKCoinWebsocketResponse struct {
Channel string `json:"channel"`
Data interface{} `json:"data"`
}
var okConn websocket.Conn
func (o *OKCoin) PingHandler(message string) (error) {
err := okConn.WriteControl(websocket.PingMessage, []byte("{'event':'ping'}"), time.Now().Add(time.Second))
if err != nil {
log.Println(err)
return err
}
return nil
}
func (o *OKCoin) AddChannel(conn *websocket.Conn, channel string) {
event := OKCoinWebsocketEvent{"addChannel", channel}
json, err := JSONEncode(event)
if err != nil {
log.Println(err)
return
}
err = conn.WriteMessage(websocket.TextMessage, json)
if err != nil {
log.Println(err)
return
}
}
func (o* OKCoin) RemoveChannel(conn *websocket.Conn, channel string) {
event := OKCoinWebsocketEvent{"removeChannel", channel}
json, err := JSONEncode(event)
if err != nil {
log.Println(err)
return
}
err = conn.WriteMessage(websocket.TextMessage, json)
if err != nil {
log.Println(err)
return
}
}
func (o *OKCoin) WebsocketClient(currencies []string) {
if len(currencies) == 0 {
log.Println("No currencies for Websocket client specified.")
return
}
var Dialer websocket.Dialer
okConn, resp, err := Dialer.Dial(o.WebsocketURL, http.Header{})
if err != nil {
log.Println(err)
return
}
if o.Verbose {
log.Printf("%s Connected to Websocket.", o.GetName())
log.Println(resp)
}
okConn.SetPingHandler(o.PingHandler)
for _, x := range currencies {
o.AddChannel(okConn, fmt.Sprintf("ok_%s_ticker", x))
o.AddChannel(okConn, fmt.Sprintf("ok_%s_depth", x))
o.AddChannel(okConn, fmt.Sprintf("ok_%s_trades", x))
}
for {
msgType, resp, err := okConn.ReadMessage()
if err != nil {
log.Println(err)
break
}
switch msgType {
case websocket.TextMessage:
log.Println("\n" + string(resp))
}
}
okConn.Close()
log.Printf("%s Websocket client disconnected.", o.GetName())
}