
    W3i?,                    r   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Zddl	Z	ddl
m
Z
mZ ddlmZ ddlmZ ddlZddlZddlZddlmZ ddlmZ ej.                  j1                  ej.                  j1                  ej.                  j3                  e                  Zeej.                  vrej.                  j9                  de       dd	lmZ dd
lm Z m!Z!m"Z"m#Z#m$Z$m%Z% d0dZ&d1dZ'd2dZ(d3dZ)d4dZ*d5dZ+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6dZ, ejZ                          ej\                  ddd       ej\                  dddd       ej\                  ddd ej                  de             ej\                  ddd !       ej\                  d"d#d$%       ej\                  d&dd'!       ej\                  d(d)de/       ej\                  d*d+de0       ej\                  d,d-de/      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7d.                                                                      Z1e2d/k(  r e1        yy)8z
Record Polymarket live-data activity trades for selected markets under one event.

The WebSocket filter is event-level. Market filtering is done locally by slug,
condition id, market id, and token id.
    )annotationsN)datetimetimezone)Path)Any)load_dotenv)logger)
GAMMA_BASE)ACTIVITY_WS_URLJsonlWriterTargetMarketmatch_activity_tradenormalized_activity_rowselect_target_marketsc                   | j                         j                         dk(  ry | j                  d      D ch c]1  }|j                         s|j                         j                         3 }}ddd}|D ch c]  }|j                  ||       }}dht	        dd      D ch c]  }d| 	 c}}||z
  }|r0t        j                  ddj                  t        |                   |S c c}w c c}w c c}w )	Nauto,	moneyline)seriesmatch      gamezunsupported markets: )	striplowersplitgetrangeclickBadParameterjoinsorted)rawitemvaluesaliases
normalizediallowedunknowns           %scripts/record_lpl_activity_trades.py_market_setr,   )   s    
yy{f$/2yy~Ntdjjl  "NFN${;G6<=d'++dD)=J=?%1+>QQCj>?G7"G  #8&/9R8S!TUU O=>s   C+ C+7C0"C5c                     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environr   upper     r+   _setup_loggingr<   6   s?    
MMO
JJ

jjnn[&1779b	r;   c                  K   |rt        j                  d      nd }t        j                  |      4 d {   }|j                  t         d|  t        j
                  d            4 d {   }|j                          |j                          d {   cd d d       d {    cd d d       d {    S 7 7 P7 *7 7 # 1 d {  7  sw Y   nxY wd d d       d {  7   y # 1 d {  7  sw Y   y xY ww)NF)ssl)	connectorz/events/slug/   )totaltimeout)aiohttpTCPConnectorClientSessionr   r
   ClientTimeoutraise_for_statusjson)
event_sluginsecure_sslr?   httpresps        r+   _fetch_eventrN   @   s     3?$$/TI$$y9 % %T88l-
|4))3  
 	% 	% !!#$	% 	% 	%% % %	%
 %	%%	% 	% 	%% % % % %s   5DB?D5C00C1C04$C	CC	C0(C)C0-D9C:DC0C	C0D	C	CC	C0D)C,*D0D6C97D>Dc           	         ddt        j                  d| id      dg}|r6|j                  ddt        j                  t        |      d	d
d      d       d|dS )NactivitytradesrJ   r   :
separators)topictypefilterscomments*Series)parentEntityIDparentEntityType	subscribe)actionsubscriptions)rI   dumpsappendint)rJ   include_commentscomments_parent_idr`   s       r+   _subscriptionrf   K   sv      zz<"<T	
+M #::*-.@*A,4  *
	
 "MBBr;   c                F   | j                         }|r|j                         dv rg S 	 t        j                  |      }t        |t              r!|D cg c]  }t        |t              s| c}S t        |t              r|gS g S # t        j                  $ r g cY S w xY wc c}w )N>   pingpong)r   r   rI   loadsJSONDecodeError
isinstancelistdict)r#   strippeddecodedr$   s       r+   _decode_itemsrq   d   s    yy{Hx~~'+;;	**X& '4 !(CJtT,BCC'4 yI  	 Ds   B B'BBBc                   K   	 	 t        j                  d       d {    | j                  d       d {    77 7 # t        $ r Y y w xY ww)N
   PING)asynciosleepsend	Exception)wss    r+   _pingrz   s   sN     --###''&/!! #! s9   AA  <A  >A  A   	A	AAAc        
        
  K   t        | |       d {   }
t        | |
j                  d      xs g |      }|st        d|  dt	        |             || z  }|j                  dd       |dz  j                  t        j                  |
ddd	      d
z   d       |dz  j                  t        j                  |D cg c]  }|j                   c}ddd	      d
z   d       t        |dz  ||      }|rt        |dz  ||      nd }d}d}d}t        | ||      }|rt        j                         nd }d dd}|||d<   t        j                  ddj!                  d |D              z          	 |	j#                         s	 t%        j&                  t(        fi |4 d {   }|j+                  t        j                  |d             d {    t        j                  d|         t-        j.                  t1        |            }	 |	j#                         s3	 t-        j2                  |j5                         d       d {   }t9        j:                  t<        j>                        }tA        jB                         }tE        tG        |            D ]  }|dz  }|j                  d      dk(  r-|*|dz  }|jI                  | ||jK                         ||d        I|j                  d      d!k7  s|j                  d"      d#k7  rrtM        ||      }||dz  }|jI                  tO        ||| |||$              |	j#                         s3|jQ                          t-        jR                  |d%       d {    d d d       d {    |	j#                         st        j                  d'| d(|        |j]                          ||j]                          y y 7 c c}w 7 F7 7 # t,        j6                  $ r Y w xY w7 # |jQ                          t-        jR                  |d%       d {  7   w xY w7 # 1 d {  7  sw Y   xY w# t,        jT                  $ r  tV        $ rQ}|	j#                         s6t        jX                  d&|        t-        jZ                  |       d {  7   Y d }~2d }~ww xY w# t        j                  d'| d(|        |j]                          ||j]                          w w xY ww))Nmarketszno target markets found for z: T)parentsexist_okzevent_meta.jsonF   )ensure_asciiindent	sort_keys
zutf-8)encodingztarget_markets.jsonzactivity_trades.jsonl)flush_everyflush_interval_secondszcomments_events.jsonlr   rs   )ping_intervalopen_timeoutr>   zactivity targets: z, c              3  R   K   | ]  }|j                    d |j                    ! yw)rS   N)kindslug).0targets     r+   	<genexpr>zrun_recorder.<locals>.<genexpr>   s#     Pvv{{m1V[[M2Ps   %'rR   rT   z#activity ws subscribed: event_slug=g      ?rB   r   rV   rY   )rJ   message_indexreceived_at_wallreceived_at_monotonic_nsraw_jsonrP   rW   rQ   )r$   r   rJ   r   r   r   )return_exceptionszactivity ws reconnect: z"activity recorder stopped: trades=z
 comments=)/rN   r   r   RuntimeErrorr"   mkdir
write_textrI   ra   __dict__r   rf   r>   _create_unverified_contextr	   infor!   is_set
websocketsconnectr   rw   ru   create_taskrz   wait_forrecvTimeoutErrorr   nowr   utctimemonotonic_nsrq   strwrite	isoformatr   r   cancelgatherCancelledErrorrx   warningrv   close)rJ   r|   output_rootrd   re   rK   reconnect_delay_secondsjsonl_flush_everyjsonl_flush_interval_seconds
stop_eventeventtarget_markets
output_dirr   trades_writercomments_writerr   keptrY   subscriptionssl_ctxconnect_kwargsry   	ping_taskr#   r   r   r$   excs                                r+   run_recorderr   |   s     z<88E*:uyy7K7QrSZ[N9*RwGXYZZz)JTD1##//

5uQ$G$N 0  ''33

+9:V__:		
 	  4 	  ,,%;M  	00)#?	
   MDH -=?QRL2>c,,.DG7;R%PN 'u
KK
))PP
P	Q;$##%4A%--oPP -P -PTV''$**\j"QRRRKK"Ej\ RS ' 3 3E"I >I)P","3"3"5),3,<,<RWWYPS,T&T 08||HLL/I,7;7H7H7J4(5c#h(? " - 2#'88G#4
#B'6'B(0A(7(=(=>HANDTD^D^D`Ld<@-.)* %-#'88G#4
#BdhhvFVZbFb$,)=dN)S#)>$, $	 - 3 3$;-1/53=9IAY6C%&	!"+" #-"3"3"5N "((*%nnY$OOO[-P -P ##%n 	8j
ST&!!# 'W 9 ;N-PR 'U#*#7#7 ) ()J P "((*%nnY$OOO[-P -P -P -P\ ))  A!((*NN%<SE#BC!--(?@@@A
 	8j
ST&!!# 's;  T	OB)T	<O BT	/S Q O% Q #*QO(:Q	P
(O.O+O.DP
*Q7P8Q<Q P?Q S A T	 T	%Q (Q+O..PP
PP
Q
+P<5P8
6P<<Q?Q QQ
QQ S2A R>2R53R>8S >SS A TT	z--event-slugTz0Polymarket event slug, e.g. lol-wb-we-2026-05-07)requiredhelpz	--marketsr   z5auto, or comma-separated target markets through game4)defaultshow_defaultr   z--output-rootzdata/lpl_eventsF)	file_okay	path_type)r   r   rW   z--include-commentsz Also write comments_events.jsonl)is_flagr   z--comments-parent-id z"Series parentEntityID for comments)r   r   z--insecure-sslz&Disable SSL verification for debuggingz--reconnect-delay-secondsg      @z--jsonl-flush-everyd   z--jsonl-flush-interval-secondsg      ?c	                    t                t                |r|st        j                  d      t	        j
                         }	t	        j                         }
t	        j                  |
       t        j                  t        j                  fD ]  }|
j                  ||	j                           	 |
j                  t        | t        |      ||||||||	
             |
j!                          y # |
j!                          w xY w)Nz8--comments-parent-id is required with --include-comments)
rJ   r|   r   rd   re   rK   r   r   r   r   )r   r<   r   r    ru   Eventnew_event_loopset_event_loopsignalSIGINTSIGTERMadd_signal_handlersetrun_until_completer   r,   r   )rJ   r|   r   rd   re   rK   r   r   r   r   loopsigs               r+   mainr      s    > M 2  ![\\J!!#D4 v~~. 5Z^^45%#G,'!1#5)(?"3-I%	
 	



s   --C+ +C=__main__)r#   r   returnset[str] | None)r   None)rJ   r   rK   boolr   dict[str, Any])rJ   r   rd   r   re   r   r   r   )r#   r   r   zlist[dict[str, Any]])ry   r   r   r   )rJ   r   r|   r   r   r   rd   r   re   r   rK   r   r   floatr   rc   r   r   r   zasyncio.Eventr   r   )rJ   r   r|   r   r   r   rd   r   re   r   rK   r   r   r   r   rc   r   r   r   r   )3__doc__
__future__r   ru   rI   r7   r   r>   r5   r   r   r   pathlibr   typingr   rD   r   r   dotenvr   logurur	   pathdirnameabspath__file__ROOTinsertanalysis.safe_btc5.clientsr
   &analysis.lpl_orderbook.activity_tradesr   r   r   r   r   r   r,   r<   rN   rf   rq   rz   r   commandoptionr   rc   r   __name__r:   r;   r+   <module>r      s   #   	  
 
  '       	wwrwwrwwx'@ABsxxHHOOAt 1 
%C2y$y$ y$ 	y$
 y$ y$ y$ #y$ y$ #(y$ y$ 
y$x nt2de	@	 	et	4	 "D7YZ$b7[\3[\)3TPUV#St#N.$UZ[$$$ $ 	$
 $ $ #$ $ #($ 
$ \ O W ] ] [ f ($N zF r;   