mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-20 15:10:10 +00:00
* Bybit: Subscription configuration for spot * Bybit: Enable candles ws sub by default * Orderbook: Use a RW mutex for depth * Orderbook: Fix race on depth.VerifyOrderbook Despite being protected by an ob level mutex, this needed to privatise and protect the option var.
90 lines
2.9 KiB
Go
90 lines
2.9 KiB
Go
package bybit
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/gorilla/websocket"
|
|
"github.com/thrasher-corp/gocryptotrader/currency"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/request"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/stream"
|
|
"github.com/thrasher-corp/gocryptotrader/exchanges/subscription"
|
|
)
|
|
|
|
// WsOptionsConnect connects to options a websocket feed
|
|
func (by *Bybit) WsOptionsConnect() error {
|
|
if !by.Websocket.IsEnabled() || !by.IsEnabled() || !by.IsAssetWebsocketSupported(asset.Options) {
|
|
return stream.ErrWebsocketNotEnabled
|
|
}
|
|
by.Websocket.Conn.SetURL(optionPublic)
|
|
var dialer websocket.Dialer
|
|
err := by.Websocket.Conn.Dial(&dialer, http.Header{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pingMessage := PingMessage{Operation: "ping", RequestID: strconv.FormatInt(by.Websocket.Conn.GenerateMessageID(false), 10)}
|
|
pingData, err := json.Marshal(pingMessage)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
by.Websocket.Conn.SetupPingHandler(request.Unset, stream.PingHandler{
|
|
MessageType: websocket.TextMessage,
|
|
Message: pingData,
|
|
Delay: bybitWebsocketTimer,
|
|
})
|
|
|
|
by.Websocket.Wg.Add(1)
|
|
go by.wsReadData(asset.Options, by.Websocket.Conn)
|
|
return nil
|
|
}
|
|
|
|
// GenerateOptionsDefaultSubscriptions generates default subscription
|
|
func (by *Bybit) GenerateOptionsDefaultSubscriptions() (subscription.List, error) {
|
|
var subscriptions subscription.List
|
|
var channels = []string{chanOrderbook, chanPublicTrade, chanPublicTicker}
|
|
pairs, err := by.GetEnabledPairs(asset.Options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for z := range pairs {
|
|
for x := range channels {
|
|
subscriptions = append(subscriptions,
|
|
&subscription.Subscription{
|
|
Channel: channels[x],
|
|
Pairs: currency.Pairs{pairs[z]},
|
|
Asset: asset.Options,
|
|
})
|
|
}
|
|
}
|
|
return subscriptions, nil
|
|
}
|
|
|
|
// OptionSubscribe sends a subscription message to options public channels.
|
|
func (by *Bybit) OptionSubscribe(channelSubscriptions subscription.List) error {
|
|
return by.handleOptionsPayloadSubscription("subscribe", channelSubscriptions)
|
|
}
|
|
|
|
// OptionUnsubscribe sends an unsubscription messages through options public channels.
|
|
func (by *Bybit) OptionUnsubscribe(channelSubscriptions subscription.List) error {
|
|
return by.handleOptionsPayloadSubscription("unsubscribe", channelSubscriptions)
|
|
}
|
|
|
|
func (by *Bybit) handleOptionsPayloadSubscription(operation string, channelSubscriptions subscription.List) error {
|
|
payloads, err := by.handleSubscriptions(operation, channelSubscriptions)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for a := range payloads {
|
|
// The options connection does not send the subscription request id back with the subscription notification payload
|
|
// therefore the code doesn't wait for the response to check whether the subscription is successful or not.
|
|
err = by.Websocket.Conn.SendJSONMessage(context.TODO(), request.Unset, payloads[a])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|