diff --git a/bfxapi/models/Subscription.py b/bfxapi/models/Subscription.py new file mode 100644 index 0000000..572575a --- /dev/null +++ b/bfxapi/models/Subscription.py @@ -0,0 +1,45 @@ +import time +import json + +class Subscription: + + def __init__(self, ws, channel_name, symbol, timeframe=None, **kwargs): + self.ws = ws + self.channel_name = channel_name + self.symbol = symbol + self.timeframe = timeframe + self.is_subscribed_bool = False + self.key = None + if timeframe: + self.key = 'trade:{}:{}'.format(self.timeframe, self.symbol) + self.sub_id = int(round(time.time() * 1000)) + self.send_payload = self._generate_payload(**kwargs) + + async def subscribe(self): + await self.ws.send(json.dumps(self.get_send_payload())) + + async def unsubscribe(self): + if not self.is_subscribed(): + raise Exception("Subscription is not subscribed to websocket") + payload = { 'event': 'unsubscribe', 'chanId': self.chanId } + await self.ws.send(json.dumps(payload)) + + def confirm_subscription(self, chanId): + self.is_subscribed_bool = True + self.chanId = chanId + + def confirm_unsubscribe(self): + self.is_subscribed_bool = False + + def is_subscribed(self): + return self.is_subscribed_bool + + def _generate_payload(self, **kwargs): + payload = { 'event': 'subscribe', 'channel': self.channel_name, 'symbol': self.symbol } + if self.timeframe: + payload['key'] = self.key + payload.update(**kwargs) + return payload + + def get_send_payload(self): + return self.send_payload