a
    Q“‰jÁ  ã                   @   s‚   d Z ddlZddlZddlZddlZddlZej dd¡ ddlZdZ	dZ
e dej¡Zdd„ Zd	d
„ Zdd„ Zedkr~eƒ  dS )aì  Harvest VERIFIED team abbreviations from real Kalshi event tickers.

NEVER GUESS AN ABBREVIATION. The 2026-05-19 audit found three wrong ones that
had been assumed (Coritiba CTB->CFC, Sarpsborg S08->SAR, Ham-Kam HAM->HAK), and
a wrong abbr fails SILENTLY: kalshi_live falls through, 404s the per-market call
and the dashboard just shows Kalshi=?A/?H forever.

Every market carries `rules_primary` naming both clubs in full ("... the
Kilmarnock vs Dundee United professional Scottish Premiership soccer game"), and
the per-outcome ticker suffix is that club's abbreviation. Pairing the two gives
an abbreviation straight from the exchange.

Usage:  python research\harvest_kalshi_abbrs.py [DIV ...]
        (no args = every Kalshi-covered division)
é    NzE:\soccer\mainz-https://api.elections.kalshi.com/trade-api/v2)ÚopenZunopenedÚclosedz@\bthe\s+(.+?)\s+vs\.?\s+(.+?)\s+(?:professional|soccer|football)c              
   C   sæ   g t ƒ  }}tD ]Ð}d }tdƒD ]¾}| d|dœ}|r<||d< ztjt› d�|dd�}W n tyn   Y  qY n0 |jdkr~ q| ¡ }| dg ¡D ].}	|	 d	¡}
|
r’|
|vr’| 	|
¡ | 
|	¡ q’| d¡}|sÔ qt d
¡ q q|S )Né   éÈ   )Zseries_tickerÚlimitÚstatusÚcursorz/marketsé   )ÚparamsÚtimeoutZmarketsÚtickerg333333Ã?)ÚsetÚSTATUSESÚrangeÚrequestsÚgetÚBASEÚ	ExceptionÚstatus_codeÚjsonÚaddÚappendÚtimeÚsleep)ÚseriesÚoutÚseenr   r   Ú_ÚpÚrÚjÚmÚt© r#   ú*E:\soccer\research\harvest_kalshi_abbrs.pyÚmarkets_for   s0    



r%   c                    sl  i }t | ƒD ]„}| d¡pd}| d¡p*d}|r| |d ¡s@q|t|ƒd d… }| |tƒ ddœ¡}|d  |¡ |d	 s| d
¡pŠd|d	< qi }| ¡ D ]È\}}t 	|d	 p´d¡}|s¾qž| 
d¡ ¡ | 
d¡ ¡  }	}
dd„ |d D ƒ}t|ƒdkrüqž| dd¡d ‰ t ddˆ ¡‰ t‡ fdd„|D ƒdƒ}|ržtt||h ƒdƒ}|rž| ||	¡ | ||
¡ qž|S )z>{abbr: full team name} verified from this series' own tickers.Úevent_tickerÚ r   ú-é   N)ÚlegsÚrulesr*   r+   Úrules_primaryé   c                 S   s   h | ]}|d kr|’qS )ZTIEr#   ©Ú.0Úlr#   r#   r$   Ú	<setcomp>N   ó    z#abbrs_for_series.<locals>.<setcomp>éÿÿÿÿz^\d{2}[A-Z]{3}\d{2}c                 3   s   | ]}ˆ   |¡r|V  qd S )N)Ú
startswithr.   ©Úsuffixr#   r$   Ú	<genexpr>U   r2   z#abbrs_for_series.<locals>.<genexpr>)r%   r   r4   ÚlenÚ
setdefaultr   r   ÚitemsÚRULES_REÚsearchÚgroupÚstripÚrsplitÚreÚsubÚnextÚiter)r   Úby_eventr!   ÚevÚtkrÚlegÚdÚfoundÚmmÚhomeZawayr*   ÚhÚar#   r5   r$   Úabbrs_for_series:   s:    rN   c            	      C   s  t jdd … pdd„ t ¡ D ƒ} i }t| ƒD ]Š}t |¡}|sNt|› d�ƒ q,t|ƒ}|||< t|› d|› dt|ƒ› d�ƒ t| 	¡ dd	„ d
�D ]\}}td|d›d|› �ƒ q�tƒ  q,d}t
|ddd��$}tj||dddd� W d   ƒ n1 sô0    Y  td|ƒ d S )Nr)   c                 S   s   g | ]}t  |¡r|‘qS r#   )ÚmapsÚleague_kalshi_series)r/   rH   r#   r#   r$   Ú
<listcomp>_   s   
ÿzmain.<locals>.<listcomp>z: no kalshi seriesz (z): z abbreviationsc                 S   s   | d S )Nr)   r#   )Úkvr#   r#   r$   Ú<lambda>j   r2   zmain.<locals>.<lambda>)Úkeyz    Ú6ú z.E:\soccer\research\kalshi_abbrs_harvested.jsonÚwzutf-8)Úencodingr-   FT)ÚindentÚensure_asciiÚ	sort_keysZwrote)ÚsysÚargvrO   Zall_divsÚsortedrP   ÚprintrN   r8   r:   r   r   Údump)	ZdivsÚresultrH   ÚsrM   ZabbrÚnamer   Úfhr#   r#   r$   Úmain^   s"     
2re   Ú__main__)Ú__doc__r@   r\   r   r   r   ÚpathÚinsertrO   r   r   ÚcompileÚ
IGNORECASEr;   r%   rN   re   Ú__name__r#   r#   r#   r$   Ú<module>   s"   ÿ$