
    K4i.                    6   d Z ddlmZ ddlZddl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 ddlZddlZddlmZ ddlmZ ej&                  j)                  ej&                  j)                  ej&                  j+                  e                  Zeej&                  vrej&                  j1                  de       dd	lmZ dd
lmZ ddlmZ  ed      Z d6dZ!d7dZ"d8dZ#d9dZ$d:dZ%	 	 	 	 	 	 	 	 	 	 d;dZ&d<dZ'	 	 	 	 	 	 	 	 	 	 	 	 	 	 d=dZ(	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d>dZ) ejT                          ejV                  ddd       ejV                  dddd       ejV                  ddd ej                  d e
!      "       ejV                  d#d$d ej                  d e
!      "       ejV                  d%d&de,"       ejV                  d'd(       ejV                  d)d*de,"       ejV                  d+d,de-"       ejV                  d-d&de,"       ejV                  d.d/d01       ejV                  d2d3de,"      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d?d4                                                                                    Z.e/d5k(  r e.        yy)@a  
Record a LoL event's main orderbooks and live-data activity trades together.

This is the preferred entrypoint for event studies. It records:
    - CLOB orderbook events/snapshots for selected winner markets
    - ws-live-data activity trades for the same selected markets
    )annotationsN)datetime)Path)ZoneInfo)load_dotenv)logger)LplEventOrderbookRecorder)run_recorder)_market_setzAsia/Shanghaic                     t        j                          t        j                  t        j                  t
        j                  j                  dd      j                         dd       y )N	LOG_LEVELINFOzQ<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level:<7}</level> | {message}T)levelformatcolorize)	r   removeaddsysstderrosenvirongetupper     scripts/record_lpl_event.py_setup_loggingr   $   s?    
MMO
JJ

jjnn[&1779b	r   c                V    	 | j                         j                  S # t        $ r Y yw xY w)Nr   )statst_sizeFileNotFoundErrorpaths    r   
_file_sizer$   .   s+    yy{""" s    	((c                    	 t        j                  | j                  d            S # t        t         j                  f$ r i cY S w xY w)Nzutf-8)encoding)jsonloads	read_textr!   JSONDecodeErrorr"   s    r   
_load_jsonr+   5   s@    zz$..'.:;;t334 	s   $' AAc                    | dz  dz  ddS )Ni   z.2fz MBr   )sizes    r   _mbr.   <   s    TkD %S))r   c                    | sy	 t        j                  t        |             j                  t              j                  d      S # t        $ r t        |       cY S w xY w)N %Y-%m-%d %H:%M:%S)r   fromisoformatstr
astimezoneSHANGHAI_TZstrftime
ValueError)values    r   _fmt_dtr9   @   sX    %%c%j1<<[IRR
 	
  5zs   ?A AAc                P   || z  }|| z  }t        |dz        }t        |dz        }d}t        |t              rdj                  d |D              }t	        j
                  t              j                  d      }	d| dd	|  d
|	 d|xs d d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       d|j                  dd       dt        |j                  d             d|j                  dd       d t        t        |d!z               d"t        t        |d#z               d$t        t        |d%z               g}
d&j                  |
      S )'Nzrecording_status.jsonztarget_markets.jsonr0   z, c              3     K   | ]E  }t        |t              r3t        |j                  d       xs |j                  d      xs d       G yw)kindslugr0   N)
isinstancedictr3   r   ).0items     r   	<genexpr>z_status_text.<locals>.<genexpr>X   sC      
$%  :DHHV$4:;
s   AAr1   u   LoL 采集状态 []zevent: u   时间(东八区): z	markets: loadingzstatus: statusstartingztoken_count: token_countzconnection_id: connection_idzreconnect_count: reconnect_countzevents_written: events_writtenzsnapshots_written: snapshots_writtenzlast_event_type: last_event_typezlast_received_at: last_received_at_wallzlast_message_age_seconds: last_message_age_secondszorderbook_events: zorderbook_events.jsonlzorderbook_snapshots: zorderbook_snapshots.jsonlzactivity_trades: zactivity_trades.jsonl
)r+   r>   listjoinr   nowr5   r6   r   r9   r.   r$   )
event_slugorderbook_output_rootactivity_output_rootphaseorderbook_diractivity_dirrE   target_marketsmarketsrR   liness              r   _status_textr\   K   s    *J6M'*4L(??@F/D DENG.$')) 
&
 
 ,,{
#
,
,-@
AC
UG1%
*
cU#
G(y)*
6::h
345


="567
&**_b9:;
FJJ'8"=>?
6::&6;<=
fjj)<bABC
FJJ'8"=>?
WVZZ0G%HIJK
$VZZ0JB%O$PQ
SM<T,T!UVWX
J}?Z/Z$[ \]^
C
<:Q+Q RSTU!E$ 99Ur   c           
       K   | sy dd|id}t        j                  d      }t        j                  |      4 d {   }|j                  | |      4 d {   }|j                  dk\  r@|j                          d {   }t        j                  d|j                   d	|d d
         d d d       d {    d d d       d {    y 7 7 v7 Q7 # 1 d {  7  sw Y   +xY w7 "# 1 d {  7  sw Y   y xY ww)Ntext)msg_typecontent
   )totaltimeout)r'   i  u   飞书通知失败: status=z body=i,  )aiohttpClientTimeoutClientSessionpostrE   r^   r   warning)webhookr^   payloadrd   httprespbodys          r   _send_feishu_textro   t   s    !vtn=G##"-G$$W5 ^ ^99W793 	^ 	^t{{c!!YY[(!<T[[MPTUYVYPZ|\]	^ 	^^ ^ ^	^(	^ 	^ 	^ 	^^ ^ ^ ^s   ;DCDC-CC-#C C,C-C-8C9C-=DC+	DC-CC-C(	CC(	$C-+D-C?3C64C?;Dc           
     r  K   | sy t        | t        |||d             d {    |j                         s@	 t        j                  |j                         |       d {    |j                         s?y y 7 U7 # t        j                  $ r% t        | t        |||d             d {  7   Y Nw xY ww)NstartedrS   rT   rU   rV   rc   running)ro   r\   is_setasynciowait_forwaitTimeoutErrorrj   rS   rT   rU   interval_seconds
stop_events         r   _feishu_status_loopr|      s      
!"7!5		
   !	"":??#4>NOOO ! P## 		#)*?)=#	  		sV    B7A8B7(A<  A:!A< %B76B7:A< </B4+B.,B41B73B44B7c                
  K   t        | |||||||      t        j                  j                         d      }t        j                  t	        | ||dd|d||
      d      }|	r&t        j                  t        |	| |||
	      d
      nd }dfd}	 j                         s||h}||j                  |       t        j                  |dt        j                         d {   \  }}|D ]Y  }||u r-|j                         }|t        j                  d|        d }5|j                         r~ |          |        	 ||g}||j                  |       t        j                  t        j                   |ddid       d {    |	r"t'        |	t)        | ||d             d {    y y |j                         }|	 |        | |          |        	 ||g}||j                  |       t        j                  t        j                   |ddid       d {    |	r"t'        |	t)        | ||d             d {    y y  j                         s |        	 ||g}||j                  |       t        j                  t        j                   |ddid       d {    |	r"t'        |	t)        | ||d             d {    y y 7 7 O# t        j"                  $ rP ||g}||j                  |       |D ]  }|j%                           t        j                   |ddi d {  7   Y w xY w7 7 "# t        j"                  $ rP ||g}||j                  |       |D ]  }|j%                           t        j                   |ddi d {  7   Y w xY w7 h7 # t        j"                  $ rP ||g}||j                  |       |D ]  }|j%                           t        j                   |ddi d {  7   Y ew xY w7 K#  |        	 ||g}||j                  |       t        j                  t        j                   |ddid       d {  7   ne# t        j"                  $ rO ||g}||j                  |       |D ]  }|j%                           t        j                   |ddi d {  7   Y nw xY w|	r#t'        |	t)        | ||d             d {  7   w w xY ww)N)rS   rZ   output_rootsnapshot_interval_secondsinsecure_sslstatus_interval_secondsjsonl_flush_everyjsonl_flush_interval_secondslpl_event_orderbook)nameFr0   g      @)
rS   rZ   r~   include_commentscomments_parent_idr   reconnect_delay_secondsr   r   r{   lpl_event_activityry   lpl_event_feishu_notifyc                 F    j                           j                          y N)setstop)	orderbookr{   s   r   stop_allz_run_capture.<locals>.stop_all   s    r   g      ?)rd   return_whenu   飞书通知任务停止: return_exceptionsTg      $@rc   stoppedrr   returnNone)r	   ru   create_taskrunrun_activity_recorderr|   rt   r   rw   FIRST_EXCEPTION	exceptionr   ri   	cancelledappendrv   gatherrx   cancelro   r\   )rS   rZ   rT   rU   r   r   r   r   r   feishu_webhookfeishu_interval_secondsr{   orderbook_taskactivity_tasknotify_taskr   tasksdone_pendingtaskexcr   s              `         @r   _run_capturer      sy     *)";! 7+%A	I ((?TUN''!,"!%$'/)E!	
 "M6  	&%&;%9!8% +
	
   4##%#]3E&		+&#*<<#33$ ND(
  ;&..*C)CC5'IJ"&K>>#J 	
	A#]3E&[)"">>   #)*?)=#	   / nn&?JI

	A#]3E&[)"">>   #)*?)=#	   C ##%4 	
	A#]3E&[)"">>   #)*?)=#	   M6 ## 	A#]3E&[) ..%@4@@@	A ## 	A#]3E&[) ..%@4@@@	A ## 	A#]3E&[) ..%@4@@@	A# 	
	A#]3E&[)"">>   ## 	A#]3E&[) ..%@4@@@	A #)*?)=#	   s  BTAP  *K+AP  T	AK KK T0M1T7#P  T"AM &M'M +T	N1
TP  #T+AN7 /N40N7 4TPTP  K AM8L;9M>TMTM AN.$N'%N.*T-N..T4N7 7APPPTPT S?)AQ4-Q0.Q43S?4ASS
SS?S!S?7S:8S??Tz--event-slugTzPolymarket event slug)requiredhelpz	--marketsautoz6auto, or comma-separated target markets through game4.)defaultshow_defaultr   z--orderbook-output-rootzdata/lplF)	file_okay	path_type)r   r   typez--activity-output-rootzdata/lpl_eventsz--snapshot-interval-secondsg      ?z--insecure-ssl)is_flagz--status-interval-secondsg      @z--jsonl-flush-everyd   z--jsonl-flush-interval-secondsz--feishu-webhookr0   zDFeishu bot webhook. Defaults to FEISHU_WEBHOOK_URL env when omitted.)r   r   z--feishu-interval-secondsg     r@c                j   t                t                t        |      }|	xs t        j                  dd      }	t        j                         t        j                         }t        j                  |       dfd}t        j                  t        j                  fD ]  }|j                  ||        t        j                  d|  d|        	 |j                  t!        | |||||||||	|
             |j#                          t        j                  d|         y # |j#                          w xY w)	NFEISHU_WEBHOOK_URLr0   c                 &     j                          y r   )r   )r{   s   r   r   zmain.<locals>.stopK  s    r   u#   开始录制 LoL event: event_slug=z	 markets=)rS   rZ   rT   rU   r   r   r   r   r   r   r   r{   u   录制已停止: event_slug=r   )r   r   r   r   getenvru   Eventnew_event_loopset_event_loopsignalSIGINTSIGTERMadd_signal_handlerr   inforun_until_completer   close)rS   rZ   rT   rU   r   r   r   r   r   r   r   selected_marketsloopr   sigr{   s                  @r   mainr     s   X M"7+#Jryy1Er'JNJ!!#D4  v~~. +T*+ KK
-j\7)L%(&;%9*C)(?"3-I-(?%	
" 	


KK.zl;< 	

s   &D   D2__main__r   )r#   r   r   int)r#   r   r   zdict[str, object])r-   r   r   r3   )r8   objectr   r3   )
rS   r3   rT   r   rU   r   rV   r3   r   r3   )rj   r3   r^   r3   r   r   )rj   r3   rS   r3   rT   r   rU   r   rz   floatr{   asyncio.Eventr   r   )rS   r3   rZ   zset[str] | NonerT   r   rU   r   r   r   r   boolr   r   r   r   r   r   r   r3   r   r   r{   r   r   r   )rS   r3   rZ   r3   rT   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r   r   r   )0__doc__
__future__r   ru   r'   r   r   r   r   pathlibr   zoneinfor   re   clickdotenvr   logurur   r#   dirnameabspath__file__ROOTinsertanalysis.lpl_orderbook.recorderr	   "scripts.record_lpl_activity_tradesr
   r   "scripts.record_lpl_event_orderbookr   r5   r   r$   r+   r.   r9   r\   ro   r|   r   commandoptionr   r   r   __name__r   r   r   <module>r      s   #   	  
       	wwrwwrwwx'@ABsxxHHOOAt E T : '*&&  & 	&
 & 	&R	^      	 
       
 Fqq q  	q
 q  %q q #q q #(q q #q q 
qh nt2IJ	A	 	et	4	 	et	4	 +StRWX-)3TPUV#St#N.$UZ[	O
 )5tRWX1=1=1=  1= 	1=
  %1= 1= #1= 1= #(1= 1= #1= 
1= Y \ O W . Y K >1=h zF r   