You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.3 KiB

2 months ago
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
}