
    6iB-                     N    d dl Z d dlZd dlmZ d dlmZ d dlmZ  G d de      Zy)    N)AsyncClient)ReconnectingWebsocket)KEEPALIVE_TIMEOUTc                        e Zd Z	 	 	 	 ddef fdZ fdZd Zd Z fdZ fdZ	d Z
d	 Zd
 Zd ZdefdZd Zd Zd Z xZS )KeepAliveWebsocketclientc           	          t        	|   dd ||||d| || _        || _        |xs t        | _        d | _        d | _        d | _        d| _	        d | _
        y )N)pathurlprefix	is_binary	exit_coroF )super__init___keepalive_type_clientr   _user_timeout_timer_subscription_id_listen_key_uses_ws_api_subscription_listen_token_expiration)
selfr   r   keepalive_typer   r   r   user_timeoutkwargs	__class__s
            \/var/www/app/trading-bot/venv/lib/python3.12/site-packages/binance/ws/keepalive_websocket.pyr   zKeepAliveWebsocket.__init__	   sy     	 	
	
 	
  .)>-> $).& 	%    c                   K   | j                   r!| j                   j                          d | _         | j                  st        | j                  d      rE| j                  j
                  r/| j                  j
                  j                  | j                         | j                          d {    | j                  ry | j                  sy t        | ,  |i | d {    y 7 67 w)Nws_api)r   cancelr   hasattrr   r"   unregister_subscription_queue"_unsubscribe_from_user_data_streamr   _pathr   	__aexit__)r   argsr   r   s      r   r(   zKeepAliveWebsocket.__aexit__'   s     ;;KK DK  ,t||X.4<<3F3F##AA$BWBWX99;;;))zzg0000 < 	1s$   B(C&+C",0C&C$C&$C&c                     | j                   | _        t        | j                  dd       }|r| j                    d| | _        y y )N	TIME_UNITz
?timeUnit=)r   r'   getattrr   )r   	time_units     r   _build_pathzKeepAliveWebsocket._build_path8   sB    %%
DLL+t<	 ,,-Z	{CDJ r    c                 Z  K   | j                   dk(  r| j                          d {   | _        | j                  t        d      d| _        | j
                  j                  j                  | j                  | j                         d| j                   | _	        y | j                   dk(  r| j                          d {   | _        | j                  t        d      d| _        | j
                  j                  j                  | j                  | j                         d| j                   | _	        y | j                   dvr| j                  | j                          d {   | _        | j                  t        d	| j                    d
      d| _        | j
                  j                  j                  | j                  | j                         d| j                   | _	        y | j                  s.| j                          d {   | _        | j                          y y 7 7 f7 7 #w)NuserzDFailed to subscribe to user data stream: no subscription ID returnedTzuser_subscription:marginzFFailed to subscribe to margin data stream: no subscription ID returnedzmargin_subscription:)r0   r1   futurescoin_futuresportfolio_marginz7Failed to subscribe to isolated margin data stream for z: no subscription ID returnedzisolated_margin_subscription:)r   _subscribe_to_user_data_streamr   
ValueErrorr   r   r"   register_subscription_queue_queuer'    _subscribe_to_margin_data_stream)_subscribe_to_isolated_margin_data_streamr   _get_listen_keyr.   r   s    r   _before_connectz"KeepAliveWebsocket._before_connect>   s    6)*.*M*M*O$OD!$$, Z  .2D*LL;;%%t{{ .d.C.C-DEDJ8+*.*O*O*Q$QD!$$, \  .2D*LL;;%%t{{ 00E0E/FGDJ (
 
 DD((  !
 $$, MdNbNbMc  dA  B  .2D*LL;;%%t{{ 99N9N8OPDJ%)%9%9%;;D  g %P %R,   <sH   #H+H!BH+>H$?B"H+!H'"B#H+H)H+$H+'H+)H+c                    K   | j                   dv s| j                   dvr=| j                          d{    | j                  r| j                          d{    yt        |           d{    y7 @7 7 	w)z<Override connect to handle ws_api subscriptions differently.)r0   r1   )r2   r3   r4   N)r   r=   r   _after_connectr   connect)r   r   s    r   r@   zKeepAliveWebsocket.connectx   s~      #559M9M V
 :
 &&(((--))+++go ) , 	 s3   0A:A4#A:A6A:.A8/A:6A:8A:c                 r  K   | j                   rKd}|sE	 t        j                  | j                  j	                         | j
                         d{   }|sE|S t        | )          d{   S 7 # t        j                  $ r, | j                  j                  d| j
                   d       Y [w xY w7 Hw)zCOverride recv to work without a read loop for ws_api subscriptions.N)timeoutzno message in z seconds)r   asynciowait_forr8   getTIMEOUTTimeoutError_logdebugr   recv)r   resr   s     r   rJ   zKeepAliveWebsocket.recv   s     ))CM ' 0 0)4<<! C  JW\^## ++ MIIOOnT\\N($KLM $sL   B7<A3 A1A3 B7B7,B5-B71A3 3<B2/B71B22B7c                 F   K   | j                   | j                          y y wN)r   _start_socket_timerr<   s    r   r?   z!KeepAliveWebsocket._after_connect   s!     ;;$$& s   !c                 b      j                   j                   j                   fd       _        y )Nc                  J    t        j                   j                               S rM   )rC   create_task_keepalive_socketr<   s   r   <lambda>z8KeepAliveWebsocket._start_socket_timer.<locals>.<lambda>   s    (;(;D<R<R<T(U r    )_loop
call_laterr   r   r<   s   `r   rN   z&KeepAliveWebsocket._start_socket_timer   s%    jj++ U
r    c                    K   dt        t        j                               i}| j                  j	                  dd|       d{   }|j                  d      S 7 w)z1Subscribe to user data stream using WebSocket APIidz"userDataStream.subscribe.signatureTsignedparamsNsubscriptionId)struuiduuid4r   _ws_api_requestrE   )r   rZ   responses      r   r5   z1KeepAliveWebsocket._subscribe_to_user_data_stream   s]      #djjl#
 550f 6 
 
 ||,--
s   AAAAc                 >  K   | j                   j                  d       d{   }|d   }|j                  d      | _        t	        t        j                               |d}| j                   j                  dd|       d{   }|j                  d	      S 7 v7 w)
zJSubscribe to cross-margin data stream using WebSocket API with listenTokenF)is_isolatedNtokenexpirationTimerW   listenToken$userDataStream.subscribe.listenTokenrX   r[   r   margin_create_listen_tokenrE   r   r\   r]   r^   r_   )r   token_responselisten_tokenrZ   r`   s        r   r9   z3KeepAliveWebsocket._subscribe_to_margin_data_stream   s       $||FF  G  
 
 &g.(6(:(:;K(L% djjl#'
 5525 6 
 
 ||,--

s"    BBA BBBBsymbolc                 @  K   | j                   j                  |d       d{   }|d   }|j                  d      | _        t	        t        j                               |d}| j                   j                  dd|	       d{   }|j                  d
      S 7 v7 w)zMSubscribe to isolated margin data stream using WebSocket API with listenTokenT)rl   rb   Nrc   rd   re   rg   FrX   r[   rh   )r   rl   rj   rk   rZ   r`   s         r   r:   z<KeepAliveWebsocket._subscribe_to_isolated_margin_data_stream   s       $||FFt  G  
 
 &g.(6(:(:;K(L% djjl#'
 5525 6 
 
 ||,--

s"   !BBA BBBBc                    K   | j                   Xt        t        j                               | j                   d}| j                  j                  dd|       d{    d| _         yy7 w)z5Unsubscribe from user data stream using WebSocket APIN)rW   r[   zuserDataStream.unsubscribeFrX   )r   r\   r]   r^   r   r_   )r   rZ   s     r   r&   z5KeepAliveWebsocket._unsubscribe_from_user_data_stream   sn       ,$**,'"&"7"7F ,,..,U6 /    %)D! -
s   AA*A(A*c                   K   | j                   dk(  r$| j                  j                          d {   }|S | j                   dk(  r$| j                  j                          d {   }|S | j                   dk(  r$| j                  j	                          d {   }|S | j                   dk(  r$| j                  j                          d {   }|S | j                   dk(  r$| j                  j                          d {   }|S | j                  j                  | j                          d {   }|S 7 7 7 7 o7 >7 w)Nr0   r1   r2   r3   r4   )r   r   stream_get_listen_keymargin_stream_get_listen_keyfutures_stream_get_listen_key"futures_coin_stream_get_listen_keypapi_stream_get_listen_key%isolated_margin_stream_get_listen_key)r   
listen_keys     r   r;   z"KeepAliveWebsocket._get_listen_key   s.    6)#||AACCJ  !!X-#||HHJJJ  !!Y.#||IIKKJ  !!^3#||NNPPJ  !!%77#||FFHHJ   $||QQ$$  J  DJKPHsi   -D>D12D>"D4#2D>D62D>D8	2D>;D:<.D>*D<+D>4D>6D>8D>:D><D>c                 l  K   	 | j                   r:	 | j                  | j                          y | j                  j	                  d       y | j                          d {   }|| j                  k7  rD| j                  j                  d       || _        | j                          | j                          nG| j                  j                  d       | j                  dk(  r.| j                  j                  | j                         d {    n| j                  dk(  r.| j                  j                  | j                         d {    n| j                  dk(  r.| j                  j                  | j                         d {    nu| j                  dk(  r.| j                  j                  | j                         d {    n8| j                  j!                  | j                  | j                         d {    | j                  | j                          y | j                  j	                  d       y 7 7 17 7 7 7 I# t"        $ r(}| j                  j%                  d|        Y d }~sd }~ww xY w# | j                  | j                          w | j                  j	                  d       w xY ww)	Nz*skip timer restart - web socket is exitingzlisten key changed: reconnectzlisten key same: keepaliver1   r2   r3   r4   zerror in keepalive_socket: )r   r   rN   rH   infor;   r   rI   r.   
_reconnectr   r   margin_stream_keepalivefutures_stream_keepalivefutures_coin_stream_keepalivepapi_stream_keepalive isolated_margin_stream_keepalive	Exceptionerror)r   rv   es      r   rR   z$KeepAliveWebsocket._keepalive_socket   s    	M--2 {{&((*		KL7  $3355JT---		 ?@#-   "!		 <=''83,,>>t?O?OPPP))Y6,,??@P@PQQQ))^;,,DDTEUEUVVV))-??,,<<T=M=MNNN ,,GG,,d.>.>   {{&((*		KL7 6 QQVN  	?IIOO9!=>>	? {{&((*		KLs   J4I 9J4
I H5B)I H8<I H;<I H=<I >H??8I 7I8I <9J45I 8I ;I =I ?I I 	I4I/*I7 /I44I7 7:J11J4)zws/FNN)__name__
__module____qualname__r   r   r(   r.   r=   r@   rJ   r?   rN   r5   r9   r\   r:   r&   r;   rR   __classcell__)r   s   @r   r   r      si     

<1"D8t ($'

..&.c .&
)$ Mr    r   )	rC   r]   binance.async_clientr   !binance.ws.reconnecting_websocketr   binance.ws.constantsr   r   r   r    r   <module>r      s%      , C 2JM. JMr    