o
    i                      @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlZeeZejejeZeje eje d eje d	 eje d
 eje d e ZG dd deZdd Zdd ZdS )u9   
# 作 者：84028
# 时 间：2024/2/28 21:00
# tsdpsdk
    N)ThreadPoolExecutor)wraps)OptionalCallable)json_format)datatype_mapconvert_ts_modelz/comz
/com/modelz/com/interfacez	/com/libsc                   @   sZ   e Zd ZdddZdd Zdd	 Zd
d ZdddZedddZ	dde
e fddZdS )InsightSubscribe 221.131.138.171$  c                 C   s`   || _ || _|| _|| _d}d}d}t ||| |   t | _t | _	t | _
t | _d S )NF)userpasswordipportget_interfaceinitloginsetsubscribe_id_elementssubscribe_callbackssubscribe_typessubscribe_codes)selfr   r   r   r   
open_traceopen_file_logopen_cout_log r   Q/opt/alphahud/venv/lib/python3.10/site-packages/tushare/subs/ht_subs/subscribe.py__init__!   s   zInsightSubscribe.__init__c              	   C   s:   d}t  d}t }t | j| j| j| j||| d S )NFz	/com/cert)	com_pathmdc_gateway_interface
BackupListr   r   r   r   r   r   )r   istoken
certfolderbackup_listr   r   r   r   2   s   
$zInsightSubscribe.loginc                 C   s6   t  }t }| j|_|| |tjt| j	 dS )u:   统一订阅app上所有的types-codes, 启动监听程序N)
r   OnRecvMarkertDatasubscribe_callbackOnMarketDatasetCallBacksubscribeByIdMDSubscribeCOVERAGElistr   )r   	interfacecallbackr   r   r   subscribe_start8   s
   
z InsightSubscribe.subscribe_startc                 C   s   | j D ]}|| qdS )u   回调所有的注册函数N)r   )r   recordcbr   r   r   r'   @   s   

z#InsightSubscribe.subscribe_callbackNc                    s   |r st dg |D ]}| }|tvrt d| t|  q D ]}t|}j| q' fdd}|S )N   订阅内容不能为空！   非法的数据据类型 c                    s4    fdd}j | t  fdd}|S )Nc              
      s   t | }| jv rnd S | D ]}t|tr&d|v r&|d }| v r& nqd S zt|}t|| W d S  t	yS } zt
jt|dd W Y d }~d S d }~ww )NHTSCSecurityIDTexc_info)r   MessageToDictmarketDataTypevalues
isinstancedictr   thread_poolsubmit	Exceptionloggererrorstr)r1   	inst_datav_code	ts_recordee)codesfuncmarket_data_type_listr   r   callback_funcT   s$   

 zMInsightSubscribe.subscribe_register.<locals>.decorator.<locals>.callback_funcc                         | i |S z* should receive a message-value parameter r   argskwargsrI   r   r   innerk      zEInsightSubscribe.subscribe_register.<locals>.decorator.<locals>.inner)r   addr   )rI   rK   rR   rH   rJ   r   rQ   r   	decoratorR   s
   z6InsightSubscribe.subscribe_register.<locals>.decorator)r?   upperr   appendr!   SubscribeByIdElementr   rT   )r   	datatypesrH   datatypecode
id_elementrV   r   rU   r   subscribe_registerE   s   z#InsightSubscribe.subscribe_register2021110309000020211103150000c                    s    st ddv sdv rdddddddv s$dv r2dddddd  tvrCt d  fdd}|S )	Nr3   -:r
    r4   c                    sX    fdd}t  }||_t }|| |t tj t  fdd}|S )Nc              
      sp   z| j jjD ]}t|}t|}t || qW d S  ty7 } zt	j
t|dd W Y d }~d S d }~ww )NTr6   )marketDataStreammarketDataListmarketDatasr   r8   r   r=   r>   r?   r@   rA   rB   )r1   instrC   rF   rG   rQ   r   r   on_func   s   
 zFInsightSubscribe.register_playback.<locals>.decorator.<locals>.on_funcc                     rL   rM   r   rN   rQ   r   r   rR      rS   zDInsightSubscribe.register_playback.<locals>.decorator.<locals>.inner)	r&   OnPlaybackPayloadr   r)   playCallbackr   
MDPlaybackNO_EXRIGHTSr   )rI   rh   r/   r.   rR   rH   r[   end_date
start_daterQ   r   rV      s   
z5InsightSubscribe.register_playback.<locals>.decorator)r?   replacerW   r   )r[   rH   ro   rn   rV   r   rm   r   register_playbacks   s   z"InsightSubscribe.register_playback	stop_whenc                 C   sf   | j r/|   t|tr	 td | rdS qtd t }|dkr1tdt| d  dS dS dS )u   
        Parameters
        ----------
        stop_when  可执行对象， 当执行返回True时，退出订阅循环

        Returns
        -------
        T   Nzinput 'stop' to exit >>>stopzsync: input-->>z,then exit this sync.)	r   r0   r;   r   timesleepprintinputrB   )r   rr   liner   r   r   run   s   	


zInsightSubscribe.run)r
   r
   r   r   )NN)r
   Nr_   r`   )N)__name__
__module____qualname__r   r   r0   r'   r^   staticmethodrq   r   r   rz   r   r   r   r   r	      s    

."r	   c                 C   s8   t | |d}|jdgdgdi i fdd}|  d S )Nr   r   TICK	000001.SZ)rZ   rH   c                 _       t | | tdt|   dS )u  
        订阅数据类型datatypes，并指定codes列表，
            datatype TICK, TRANSACTION, ORDER, 1MIN, 5MIN, 15MIN, 30MIN, 60MIN, 1DAY, 15SECOND
        :param
            ts_record_list:
                数据类型：列表
                字段说明参考 tushare.subs.model.min 和 tushare.subs.model.tick
            ht_record_dict
                数据类型：字典
                字段说明参考华泰的数据格式
        :return:
        0   用户定义业务代码输出 print_message(%s)Nrw   r@   inforB   rF   ht_record_dictrO   rP   r   r   r   print_subscribe_message      
z&demo1.<locals>.print_subscribe_message)r	   r^   rz   )usernamer   appr   r   r   r   demo1   s   r   c                 C   s:   t | |d}|jddgdddi i fdd}|  d S )	Nr   r   r   202109241300000020210924150000)r[   rH   ro   rn   c                 _   r   )u  
        订阅数据类型datatype，并指定codes列表，
            datatype TICK, TRANSACTION, ORDER, 1MIN, 5MIN, 15MIN, 30MIN, 60MIN, 1DAY, 15SECOND
        :param
            ts_record_list:
                数据类型：列表
                字段说明参考 tushare.subs.model.min 和 tushare.subs.model.tick
            ht_record_dict
                数据类型：字典
                字段说明参考华泰的数据格式
        :return:
        r   Nr   r   r   r   r   print_playback_message   r   z%demo2.<locals>.print_playback_message)r	   rq   rz   )r   r   r   r   r   r   r   demo2   s   r   )__doc__loggingosru   concurrent.futures.threadr   	functoolsr   typingr   r   google.protobufr   tushare.subs.ht_subs.covertr   r   sys	getLoggerr{   r@   pathdirnameabspath__file__r    rX   r=   objectr	   r   r   r   r   r   r   <module>   s,    
 