o
    ¢ØÆhz  ã                   @   s¶   d dl Z d dlZd dlZd dlmZ d dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZ eddeegdf fdefgƒZdedefd	d
„Zdedee fdd„ZG dd„ dejƒZdS )é    N)Údefaultdict)	ÚAnyÚCallableÚDictÚListÚ
NamedTupleÚOptionalÚSubscriptionÚTupleÚWsMsgÚActiveSubscriptionÚcallbackÚsubscription_idÚsubscriptionÚreturnc                 C   sx  | d dkrdS | d dkrd| d   ¡ › �S | d dkr&d| d   ¡ › �S | d dkr.dS | d d	kr=d
| d   ¡ › �S | d dkrQd| d   ¡ › d| d › �S | d dkrYdS | d dkrhd| d   ¡ › �S | d dkrwd| d   ¡ › �S | d dkr†d| d   ¡ › �S | d dkr•d| d   ¡ › �S | d dkr¤d| d   ¡ › �S | d dkrºd| d   ¡ › d| d   ¡ › �S d S )NÚtypeÚallMidsÚl2Bookúl2Book:ÚcoinÚtradesútrades:Ú
userEventsÚ	userFillsú
userFills:ÚuserÚcandleúcandle:ú,ÚintervalÚorderUpdatesÚuserFundingsúuserFundings:ÚuserNonFundingLedgerUpdatesúuserNonFundingLedgerUpdates:ÚwebData2ú	webData2:Úbboúbbo:ÚactiveAssetCtxúactiveAssetCtx:ÚactiveAssetDataúactiveAssetData:)Úlower)r   © r.   új/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/hyperliquid/websocket_manager.pyÚsubscription_to_identifier   s6    ÿr0   Úws_msgc                 C   sÜ  | d dkrdS | d dkrdS | d dkr!d| d d   ¡ › �S | d dkr>| d }t|ƒd	kr3d S d
|d	 d   ¡ › �S | d dkrFdS | d dkrWd| d d   ¡ › �S | d dkrod| d d   ¡ › d| d d › �S | d dkrwdS | d dkrˆd| d d   ¡ › �S | d dkr™d| d d   ¡ › �S | d dkrªd| d d   ¡ › �S | d dkr»d| d d   ¡ › �S | d dksÇ| d dkrÒd| d d   ¡ › �S | d d krìd!| d d   ¡ › d| d d   ¡ › �S d S )"NÚchannelÚpongr   r   r   Údatar   r   r   r   r   r   r   r   r   r   Úsr   Úir    r!   r"   r#   r$   r%   r&   r'   r(   r)   ÚactiveSpotAssetCtxr*   r+   r,   )r-   Úlen)r1   r   r.   r.   r/   Úws_msg_to_identifier*   s@   $(ÿr9   c                	       s†   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dde	de
egdf dee defdd„Zde	dedefdd„Z‡  ZS )ÚWebsocketManagerc                    sr   t ƒ  ¡  d| _d| _g | _ttƒ| _d|tdƒd …  d }t	j
|| j| jd�| _tj| jd�| _t ¡ | _d S )Nr   FÚwsÚhttpz/ws)Ú
on_messageÚon_open)Útarget)ÚsuperÚ__init__Úsubscription_id_counterÚws_readyÚqueued_subscriptionsr   ÚlistÚactive_subscriptionsr8   Ú	websocketÚWebSocketAppr=   r>   r;   Ú	threadingÚThreadÚ	send_pingÚping_senderÚEventÚ
stop_event)ÚselfÚbase_urlÚws_url©Ú	__class__r.   r/   rA   N   s   

zWebsocketManager.__init__c                 C   s   | j  ¡  | j ¡  d S ©N)rL   Ústartr;   Úrun_forever©rO   r.   r.   r/   ÚrunY   s   
zWebsocketManager.runc                 C   sP   | j  d¡s!| jjsnt d¡ | j t ddi¡¡ | j  d¡rt d¡ d S )Né2   zWebsocket sending pingÚmethodÚpingzWebsocket ping sender stopped)	rN   Úwaitr;   Úkeep_runningÚloggingÚdebugÚsendÚjsonÚdumpsrW   r.   r.   r/   rK   ]   s   
üzWebsocketManager.send_pingc                 C   s0   | j  ¡  | j ¡  | j ¡ r| j ¡  d S d S rT   )rN   Úsetr;   ÚcloserL   Úis_aliveÚjoinrW   r.   r.   r/   Ústope   s
   


ÿzWebsocketManager.stopc                 C   s¢   |dkrt  |¡ d S t  d|› �¡ t |¡}t|ƒ}|dkr't  d¡ d S |d u r2t  d¡ d S | j| }t|ƒdkrEtd||ƒ d S |D ]}| |¡ qGd S )Nz!Websocket connection established.zon_message r3   zWebsocket received pongz$Websocket not handling empty messager   z2Websocket message from an unexpected subscription:)	r^   r_   ra   Úloadsr9   rF   r8   Úprintr   )rO   Ú_wsÚmessager1   Ú
identifierrF   Úactive_subscriptionr.   r.   r/   r=   k   s$   




ÿzWebsocketManager.on_messagec                 C   s6   t  d¡ d| _| jD ]\}}|  ||j|j¡ qd S )Nr>   T)r^   r_   rC   rD   Ú	subscriber   r   )rO   rj   r   rm   r.   r.   r/   r>      s
   
ÿzWebsocketManager.on_openNr   r   r   r   c                 C   s¼   |d u r|  j d7  _ | j }| js#t d¡ | j |t||ƒf¡ |S t d¡ t|ƒ}|dks4|dkrEt| j	| ƒdkrEt
d|› d�ƒ‚| j	|  t||ƒ¡ | j t d	|d
œ¡¡ |S )Né   zenqueueing subscriptionÚsubscribingr   r    r   zCannot subscribe to z multiple timesrn   ©rZ   r   )rB   rC   r^   r_   rD   Úappendr   r0   r8   rF   ÚNotImplementedErrorr;   r`   ra   rb   )rO   r   r   r   rl   r.   r.   r/   rn   …   s   


øzWebsocketManager.subscribec                    sp   | j stdƒ‚t|ƒ}| j| }‡ fdd„|D ƒ}t|ƒdkr+| j t d|dœ¡¡ || j|< t|ƒt|ƒkS )Nz,Can't unsubscribe before websocket connectedc                    s   g | ]	}|j ˆ kr|‘qS r.   ©r   )Ú.0Úxrt   r.   r/   Ú
<listcomp>ž   s    z0WebsocketManager.unsubscribe.<locals>.<listcomp>r   Úunsubscriberq   )	rC   rs   r0   rF   r8   r;   r`   ra   rb   )rO   r   r   rl   rF   Únew_active_subscriptionsr.   rt   r/   rx   ™   s   

zWebsocketManager.unsubscriberT   )Ú__name__Ú
__module__Ú__qualname__rA   rX   rK   rg   r=   r>   r	   r   r   r   Úintrn   Úboolrx   Ú__classcell__r.   r.   rR   r/   r:   M   s$    ÿÿÿÿ
þr:   )ra   r^   rI   Úcollectionsr   rG   Úhyperliquid.utils.typesr   r   r   r   r   r   r	   r
   r   r}   r   Ústrr0   r9   rJ   r:   r.   r.   r.   r/   Ú<module>   s    , #