package bawssclient import ( "encoding/json" "fmt" "github.com/shopspring/decimal" "strings" "wss-pool/logging/applogger" "wss-pool/pkg/client/bawebsocketclientbase" "wss-pool/pkg/model/market" ) type BaTickerResponse struct { E string `json:"e"` Es int64 `json:"e"` S string `json:"s"` P string `json:"p"` Ps string `json:"P"` W string `json:"w"` X string `json:"x"` C string `json:"c"` Qs string `json:"Q"` B string `json:"b"` Bs string `json:"B"` A string `json:"a"` As string `json:"A"` O string `json:"o"` H string `json:"h"` L string `json:"l"` V string `json:"v"` Q string `json:"q"` Os int64 `json:"O"` Cs int64 `json:"c"` F int64 `json:"f"` Ls int64 `json:"L"` N int `json:"n"` } // Responsible to handle Ticker data from WebSocket type TickerWebSocketClient struct { bawebsocketclientbase.WebSocketClientBase } // Initializer func (p *TickerWebSocketClient) Init(host string) *TickerWebSocketClient { p.WebSocketClientBase.Init(host) return p } // Set callback handler func (p *TickerWebSocketClient) SetHandler( connectedHandler bawebsocketclientbase.ConnectedHandler, responseHandler bawebsocketclientbase.ResponseHandler) { p.WebSocketClientBase.SetHandler(connectedHandler, p.handleMessage, responseHandler) } // Request the full Ticker data according to specified criteria // Subscribe Ticker data func (p *TickerWebSocketClient) Subscribe(symbol string) { topis := make([]string, 0) sub := BaKLineParam{ Method: "SUBSCRIBE", Params: append(topis, fmt.Sprintf("%susdt@ticker", symbol)), ID: bawebsocketclientbase.Randomnumber(), } data, _ := json.Marshal(sub) p.Send(data) applogger.Info("WebSocket subscribed, clientId=%s", sub.ID) } // Unsubscribe Ticker data func (p *TickerWebSocketClient) UnSubscribe(symbol string) { topis := make([]string, 0) sub := BaKLineParam{ Method: "UNSUBSCRIBE", Params: append(topis, fmt.Sprintf("%susdt@ticker", symbol)), ID: bawebsocketclientbase.Randomnumber(), } data, _ := json.Marshal(sub) p.Send(data) applogger.Info("WebSocket unsubscribed, clientId=%s", sub.ID) } func (p *TickerWebSocketClient) handleMessage(msg string) (interface{}, error) { baRes := BaTickerResponse{} err := json.Unmarshal([]byte(msg), &baRes) //转火币数据结构 amount, _ := decimal.NewFromString(baRes.V) open, _ := decimal.NewFromString(baRes.X) // 整整24小时之前,向前数的最后一次成交价格 close, _ := decimal.NewFromString(baRes.C) low, _ := decimal.NewFromString(baRes.L) high, _ := decimal.NewFromString(baRes.H) Bid, _ := decimal.NewFromString(baRes.B) BidSize, _ := decimal.NewFromString(baRes.Bs) Ask, _ := decimal.NewFromString(baRes.A) AskSize, _ := decimal.NewFromString(baRes.As) LastPrice, _ := decimal.NewFromString(baRes.C) LastSize, _ := decimal.NewFromString(baRes.Qs) result := market.TickerWebsocketResponse{ Channel: fmt.Sprintf("market.%s.ticker", strings.ToLower(baRes.S)), Timestamp: baRes.Es, Tick: &market.TickR{ Open: open, High: high, Low: low, Close: close, Amount: amount, Count: baRes.N, Bid: Bid, BidSize: BidSize, Ask: Ask, AskSize: AskSize, LastPrice: LastPrice, LastSize: LastSize, IsBa: bawebsocketclientbase.BinAnce, }, } return result, err }