o
    žá¬iÐ)  ã                   @   sÜ  d Z ddlZddlZddlZddlm  mZ ddlmZm	Z	 e 
d¡Zdddœdd	dœd
ddœgdddœdddœgdddœdddœdddœgdœZi dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d“d"d“d#d“d$d“d%d“d&d“d'd“Zi d(g d)¢“d*g d+¢“d,g d-¢“d.d/d0g“d1d2g“d3g d4¢“d5d6d7g“d8d9d:g“d;d<d=g“d>d?d@g“dAdBdCg“dDdEdFg“dGg dH¢“dIdJdKg“dLdMg“dNdOg“dPdQdRg“i dSg dT¢“dUdVdWg“dXdYdZg“d[g d\¢“d]d^d_g“d`dadbg“dcdddeg“dfdgdhg“didjg“dkdldmg“dndodpg“dqdrdsg“dtdudvg“dwdxdyg“dzd{d|g“d}d~g“dd€dg“¥g d‚¢dƒgd„d…gd†gd‡dˆgd‰dŠgd‹degdŒdgdŽdWgg d¢dd‘gd’dbgd“d”gd•œ¥Zd–d—„ Zd˜d™„ Zd¦d›dœ„Zddž„ Zd§d d¡„Zd¢d£„ Zd§d¤d¥„ZdS )¨u‰  
Pre-Game Chatter Module for Luke.

Pulls headlines, injury news, and betting buzz from RSS feeds
and free sports news sources. Filters for teams in the matchup
so Bill gets relevant context alongside his strategy picks.

Sources:
  - ESPN (NHL, Soccer, NFL)
  - TSN (Canadian â€” Bill's home turf)
  - BBC Sport (Soccer)
  - Sportsnet (NHL/Canadian sports)

No API key required â€” pure RSS.
é    N)ÚdatetimeÚ	timedeltazpregame-chatterzESPN NHLz&https://www.espn.com/espn/rss/nhl/news)ÚnameÚurlz
TSN Hockeyzhttps://www.tsn.ca/rss/hockeyzSportsnet NHLz)https://www.sportsnet.ca/hockey/nhl/feed/zESPN NFLz&https://www.espn.com/espn/rss/nfl/newszTSN NFLzhttps://www.tsn.ca/rss/nflzESPN FCz)https://www.espn.com/espn/rss/soccer/newszBBC Footballz/https://feeds.bbci.co.uk/sport/football/rss.xmlz
TSN Soccerzhttps://www.tsn.ca/rss/soccer)ÚnhlÚnflÚsoccerr   r   Úeplr   ÚserieaÚserie_aÚligue1Úligue_1ÚlaligaÚla_ligaÚliga_portugalÚmlsÚ
bundesligaÚ
eredivisieÚuclÚchampions_leagueÚeuropazMontreal Canadiens)Ú	canadiensÚhabsÚmontrealzToronto Maple Leafs)zmaple leafsÚleafsÚtorontozOttawa Senators)ÚsenatorsÚsensÚottawazBoston BruinsÚbruinsÚbostonzNew York RangersÚrangerszPittsburgh Penguins)ÚpenguinsÚpensÚ
pittsburghzEdmonton OilersÚoilersÚedmontonzCalgary FlamesÚflamesÚcalgaryzWinnipeg JetsÚjetsÚwinnipegzVancouver CanucksÚcanucksÚ	vancouverzTampa Bay LightningÚ	lightningz	tampa bayzFlorida PanthersÚpanthersÚfloridazWashington Capitals)ÚcapitalsÚcapsÚ
washingtonzCarolina HurricanesÚ
hurricanesÚcarolinazNew Jersey DevilsÚdevilszNew York IslandersÚ	islanderszMinnesota WildÚwildÚ	minnesotazColorado Avalanche)Ú	avalancheÚavsÚcoloradozDallas StarsÚstarsÚdallaszSt. Louis BluesÚbluesz	st. louiszNashville Predators)Ú	predatorsÚpredsÚ	nashvillezChicago BlackhawksÚ
blackhawksÚchicagozDetroit Red Wingsz	red wingsÚdetroitzBuffalo SabresÚsabresÚbuffalozSeattle KrakenÚkrakenÚseattlezUtah Hockey ClubÚutahzAnaheim DucksÚducksÚanaheimzSan Jose SharksÚsharkszsan josezLos Angeles KingsÚkingszla kingszVegas Golden Knightszgolden knightsÚvegaszColumbus Blue Jacketszblue jacketsÚcolumbusÚArsenalÚarsenalÚgunnersÚ	LiverpoolÚ	liverpoolzManchester Cityzman cityzmanchester city)z
man unitedzmanchester unitedzman utdÚchelseaÚ	tottenhamÚspursÚ	newcastlezaston villaÚvillaÚchiefszkansas cityÚbillsÚeaglesÚphiladelphiaÚcowboys)Ú49erszsan franciscoÚninersÚravensÚ	baltimoreÚlionsÚpackersz	green bay)zManchester UnitedÚChelseazTottenham HotspurzNewcastle UnitedzAston VillazKansas City ChiefszBuffalo BillszPhiladelphia EagleszDallas CowboyszSan Francisco 49erszBaltimore RavenszDetroit LionszGreen Bay Packersc              
   C   s"  g }zrt  | ¡}| d¡D ]d}i }| d¡}| d¡}| d¡}| d¡}|dur3|jr3|j ¡ |d< |durL|jrLt dd|j¡}	|	 ¡ dd	… |d
< |durZ|jrZ|j ¡ |d< |durh|jrh|j ¡ |d< d|v rq| |¡ qW |S  t j	y }
 zt
 d|
› ¡ W Y d}
~
|S d}
~
ww )z7Parse RSS XML using stdlib xml.etree (no dependencies).ÚitemÚtitleÚdescriptionÚlinkÚpubDateNz<[^>]+>Ú éÈ   ÚsummaryÚ	publishedzRSS parse error: )ÚETÚ
fromstringÚiterÚfindÚtextÚstripÚreÚsubÚappendÚ
ParseErrorÚloggerÚwarning)ÚcontentÚitemsÚrootrf   ÚentryÚtitle_elÚdesc_elÚlink_elÚpub_elÚcleanÚe© r…   úJ/sessions/lucid-sleepy-lamport/mnt/clawd/whatsapp-agent/pregame_chatter.pyÚ_parse_rss_stdlibt   s8   





€íþ€þr‡   c              
   C   s€   z2ddl }| | ¡}g }|jD ] }| t|ddƒt|ddƒdd… t|ddƒt|ddƒd	œ¡ q|W S  ty?   t| ƒ Y S w )
z6Parse RSS content, preferring feedparser if available.r   Nrg   rk   rm   rl   ri   rn   )rg   rm   ri   rn   )Ú
feedparserÚparseÚentriesrw   ÚgetattrÚImportErrorr‡   )r{   rˆ   Úfeedr|   r~   r…   r…   r†   Ú
_parse_rss“   s   





üÿrŽ   é   c              
   C   sˆ   z$t j| |ddid}|jdkrt|jƒW S t d|j› d| › ¡ g W S  tyC } zt d| › d|› ¡ g W  Y d	}~S d	}~ww )
z"Fetch and parse a single RSS feed.z
User-AgentzLuke-Sports-Agent/1.0)ÚtimeoutÚheadersrl   zFeed returned z: zFeed fetch failed (z): N)ÚrequestsÚgetÚstatus_coderŽ   rs   ry   ÚdebugÚ	Exception)r   r   Úrespr„   r…   r…   r†   Ú_fetch_feed¥   s   ÿ
€þr˜   c                 C   sR   | sdS |   ¡ }t ||  ¡ g¡}|D ]}|  ¡ |v r dS q|  ¡ |v r'dS dS )zCheck if text mentions a team.FT)ÚlowerÚTEAM_SEARCH_NAMESr“   )rs   Ú	team_nameÚ
text_lowerÚsearch_namesr   r…   r…   r†   Ú_matches_teamµ   s   ÿrž   é   c                 C   s0  t  ||¡}t |g ¡}|st d|› ¡ g S g }|D ]K}t|d ƒ}|D ]@}	|	 dd¡}
|	 dd¡}|
› d|› }t|| ƒ}t||ƒ}|sI|rf|rO|rOdn|rSdnd	}| |
||d
 |	 dd¡|dœ¡ q&qtƒ }g }|D ]}|d  	¡ dd… }||vr‰| 
|¡ | |¡ qo|jdd„ d |d|… S )zÿ
    Fetch pre-game chatter for a matchup.

    Returns a list of dicts with:
      - title: headline
      - summary: short snippet
      - source: feed name
      - relevance: 'home', 'away', or 'both'

    Sorted by relevance (both > single team).
    z#No RSS feeds configured for sport: r   rg   rk   rm   Ú ÚbothÚhomeÚawayr   ri   )rg   rm   Úsourceri   Ú	relevanceNé(   c                 S   s   | d dkrdS dS )Nr¥   r¡   r   é   r…   )Úxr…   r…   r†   Ú<lambda>ø   s    z%get_pregame_chatter.<locals>.<lambda>)Úkey)ÚSPORT_TO_FEEDr“   Ú	RSS_FEEDSry   r•   r˜   rž   rw   Úsetr™   ÚaddÚsort)Ú	home_teamÚ	away_teamÚsportÚ	max_itemsÚfeed_categoryÚfeedsÚall_matchesÚ	feed_infor|   rf   rg   rm   ÚcombinedÚ
home_matchÚ
away_matchr¥   Úseen_titlesÚuniqueÚmrª   r…   r…   r†   Úget_pregame_chatterÄ   sF   


û€ö

€r¾   c                 C   sÞ   | sdS dg}| D ]`}d}|d dkrd}n|d dkr#|  ¡ d }n|  ¡ d }| d|› d	|d
 › ¡ | d¡r_t|d ƒdkr_|d dd… }t|d ƒdkrW|d7 }| d|› ¡ | d|d › ¡ q	d |¡S )zq
    Format chatter items into a WhatsApp-friendly text block.
    Returns empty string if no chatter found.
    rk   zPRE-GAME BUZZ:r¥   r¡   ÚH2Hr¢   éÿÿÿÿz  [z] rg   rm   é   Néx   z...z    u       â€” r¤   Ú
)Úsplitrw   r“   ÚlenÚjoin)Úchatter_itemsr°   r±   Úlinesrf   ÚiconÚsnippetr…   r…   r†   Úformat_chatter_for_whatsappý   s$   
rË   c              	   C   sÂ   t  | | ¡}t |g ¡}|sg S g }|D ]$}t|d ƒ}|D ]}| | dd¡| dd¡dd… |d dœ¡ qqtƒ }g }	|D ]}|d  ¡ dd	… }
|
|vrZ| |
¡ |	 |¡ q@|	d|… S )
zf
    Get general sport headlines (not filtered by team).
    Useful for the daily slate overview.
    r   rg   rk   rm   Né–   r   )rg   rm   r¤   r¦   )r«   r“   r¬   r˜   rw   r­   r™   r®   )r²   r³   r´   rµ   Ú	all_itemsr·   r|   rf   Úseenr¼   rª   r…   r…   r†   Úget_general_sport_headlines  s.   

ýÿ

€rÏ   )r   )r   rŸ   )Ú__doc__Úloggingr’   ru   Úxml.etree.ElementTreeÚetreeÚElementTreero   r   r   Ú	getLoggerry   r¬   r«   rš   r‡   rŽ   r˜   rž   r¾   rË   rÏ   r…   r…   r…   r†   Ú<module>   s   
ýþýöÿþýüüûûúúùø	÷
öõõôþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à"Þ#Ý$Ü%Î6

9 