from pybit.unified_trading import WebSocket from typing import Callable from functools import partial from .TickerData import Message, TickerData WS_URL = "wss://stream.bybit.com/v5/public/linear" ws = WebSocket( testnet=True, channel_type="linear", ) subscribed: set[str] = set() lastPrice: dict[str, float] = dict() class Bybit: @staticmethod def subscribe_symbol(symbol: str, callback: Callable[[TickerData], None]): global subscribed if symbol not in subscribed: subscribed.add(symbol) ws.ticker_stream( symbol=symbol, callback=lambda m: Bybit.handle_message(m, callback) ) @staticmethod def handle_message(message, callback: Callable[[TickerData], None]): msg = Message.from_json(message) if msg.data is not None and isinstance(msg.data, TickerData): Bybit.handle_tickerdata(msg.data, callback) @staticmethod def handle_tickerdata(data: TickerData, callback: Callable[[TickerData], None]): global lastPrice if data.symbol not in lastPrice or lastPrice[data.symbol] != data.lastPrice: lastPrice[data.symbol] = data.lastPrice Bybit.handle_new_tickerdata(data, callback) @staticmethod def handle_new_tickerdata(data: TickerData, callback: Callable[[TickerData], None]): callback(data)