
    i?                       U 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 ddlmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlZddlmZ 	 ddlmZ n# e $ r ddZY nw xY wg dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(h dZ)h dZ*e)e*z  dhz  Z+dZ,d Z-d!Z.d"Z/ e            Z0d#a1 ej2        d$ej3                  Z4 ej2        d%ej5        ej6        z            Z7 ej2        d&ej5                  Z8 ej2        d'ej6                  Z9 ej2        d(          Z: ej2        d)          Z; ej2        d*ej3                  Z< ej2        d+ej3                  Z= ej2        d,ej3                  Z> ej2        d-ej3                  Z? ej2        d.ej3                  Z@ ej2        d/ej3                  ZA ej2        d0ej3                  ZB ej2        d1ej3                  ZC ej2        d2ej3                  ZD ej2        d3ej3                  ZE ej2        d4ej3                  ZF ej2        d5ej3                  ZG ej2        d6ej3                  ZH ej2        d7ej3                  ZI ej2        d8ej3                  ZJ ej2        d9ej3                  ZK ej2        d:          ZL ej2        d;ej3                  ZM ej2        d<ej3                  ZNe G d= d>                      ZOi ZPd?eQd@<   ddBZRddCZSddDZTddFZUddHZVddJZWddKZXddOZYddQZZdddUZ[dddVZ\dddWZ]ddXZ^dd]Z_dd`Z`ddbZaddcZbddfZcdddiZdddkZedddlZfddoZgdddsZhdduZiddwZjddyZkdd{Zldd|Zmdd~ZnddZoddZpdddZqdddZr	 	 dddZsdddZtddZuddZvddZwddZxdddZydddZzddZ{dddZ|dddZ}dddZ~ddZddZdddZddZdddZddZdddZddZddZdS )zACore pipeline for X account ingestion + AI digest rendering data.    )annotationsN)unescape)	dataclass)datetime	timedeltatimezone)parsedate_to_datetime)Path)Lock)Any)urlparse)get_website_data_dir)load_dotenv_argsr   _kwargsreturnboolc                     dS )NF )r   r   s     !/app/scripts/x_intel/bootstrap.pyr   r      s    u    )TCGRWAChenYichiao
renaissxyzdavidcheang99      P      z0https://api.minimax.io/v1/text/chatcompletion_v2z.https://cdn.syndication.twimg.com/tweet-resultzhttps://discord.com/api/v10>   eventmarketreportfeatureinsightannouncement>   sbtalphaothertoolseventspokemonofficialexclude	r.jina.aig      @   ?        z,https?://x\.com/([A-Za-z0-9_]+)/status/(\d+)z^Title:\s*(.+?)\s*/\s*X\s*$z^Published Time:\s*(.+)$zMarkdown Content:\s*(.*)$zhttps?://[^\s)]+z!\[[^\]]*\]\((https?://[^)]+)\)u   活動|\bevent\b|直播|\blive\b|\bama\b|\bspace\b|community\s*session|join us|報名|报名|\btour\b|\bfestival\b|開包活動|开包活动|参赛|參賽|竞猜|\bgathering\b|\bplaza\b|goes live|restock(?:ing)?|poker night|get ready|drops?\b|開賣|开卖u  progress update|roadmap|版本|version|beta|上線|上线|開放|开放|launch|功能|v2|2\.0|update|即將|coming|mfa|2fa|multi[-\s]*factor|authenticator|authentication|security|帳號安全|账号安全|登入保護|登录保护|setting page|設定頁|设置页u   攻略|教學|教程|指南|心得|介紹|介绍|怎麼|怎么|如何|運費|运费|價格|价格|優點|缺點|集運|集运|buy and ship|分享u-  ((?:直播|live\s+(?:attendees?|session|stream)|ama|community\s*session).{0,42}(?:sbt|积分|積分|reward|rewards|奖励|獎勵|merch|周邊|周边))|((?:sbt|积分|積分|reward|rewards|奖励|獎勵|merch|周邊|周边).{0,42}(?:直播|live\s+(?:attendees?|session|stream)|ama|community\s*session))u   join us|join on|register|signup|報名|报名|參與|参与|出席|attend|參加|参加|discord|space|直播|\blive\b|\bama\b|\bsession\b|地點|地点|venue|填表|投票|互動|互动|attendees?u   hong\s*kong|taipei|台北|台灣|台湾|web3\s*festival|\btour\b|card\s*shop|\bplaza\b|\bvenue\b|線下|线下|\bmeetup\b|causeway\s*bay|restaurant|boothuq   price|市場|市场|交易量|volume|成交|涨|漲|跌|估值|fmv|回購|回购|\$\d|sold\s+for|record\s*breakeru_   announce|公告|發佈|发布|updated?|更新|official|官方|progress update|changelog|roadmapuf   分析|report|投研|guide|教程|教學|教学|指南|策略|总结|總結|整理|懶人包|懒人包uz   sbt|reward|rewards|獎勵|奖励|獎品|prize|airdrop|積分|积分|points?|merch|周邊|周边|coupon|白名單|whitelistuw   新手|玩家|觀眾|观众|社群|community|collectors?|holders?|參賽者|参赛者|all regions|多語|multi-languageu   報名|报名|register|signup|join us|join on|填表|參與|参与|投票|互動|互动|discord|space|直播|\blive\b|\bama\b|\bsession\b|attendees?ur   香港|hong\s*kong|台北|taipei|線上|线上|discord|space|web3\s*festival|plaza|card\s*shop|場地|地点|venueuY   (?:^|[\s。；;])(\d{1,2})\s*[\.、)\]]\s*([A-Za-z0-9\u4e00-\u9fff _&+\-]{2,40})\s*[:：]z#^\s*(\d{1,2})\s*/\s*(?:\d{1,2})?\s*uZ   (?:(?:top|前)\s*([0-9]{1,3})\s*%[^0-9]{0,8}([0-9][0-9,]*)\s*(?:points?|pts?|分|積分)?)u8   (?i)(?:snapshot|快照)\s*[:：]?\s*([^\n。；;]{4,88})u   join us|join on|register|signup|報名|报名|參加|参加|參與|参与|attend|attendees?|live\s+(?:session|stream|ama)|community\s*session|ama|space|tour|festival|meetup|線下|线下|venue|booth|地點|地点u   ((?:sbt|soulbound|points?|積分|积分).{0,42}(?:threshold|snapshot|top\s*\d+%|門檻|快照|排名|rank))|((?:threshold|snapshot|top\s*\d+%|門檻|快照|排名|rank).{0,42}(?:sbt|soulbound|points?|積分|积分))c                  p   e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   dZded<   dZded<   dZded<   dZd
ed<   dZded<   dZ	ded<   dZ
ded<   dZded<   dZd ed!<   dZd ed"<   dZd ed#<   dZd$ed%<   dZd&ed'<   dZded(<   dZd&ed)<   dZded*<   d.d-ZdS )/	StoryCardstridaccounturltitlesummary	list[str]bulletspublished_atfloat
confidence	card_typelayouttagsraw_textr.   provider cover_imageNzdict[str, int] | Nonemetricsr1   
importancecommunity_brieftemplate_idglancetimeline_datenormalurgencyFr   manual_pick
manual_pinmanual_bottomzdict[str, str] | Noneevent_factszlist[str] | Nonetopic_labelsdetail_summarydetail_linesreply_to_idr   dict[str, Any]c                   i d| j         d| j        d| j        d| j        d| j        d| j        d| j        d| j        d	| j        d
| j	        d| j
        d| j        d| j        d| j        d| j        pi d| j        d| j        | j        | j        | j        | j        | j        | j        | j        pi | j        pg | j        | j        pg | j        dS )Nr5   r6   r7   r8   r9   r;   r<   r>   r?   r@   rA   rB   rC   rE   rF   rG   rI   )rJ   rK   rM   rN   rO   rP   rQ   rR   rS   rT   rU   )r5   r6   r7   r8   r9   r;   r<   r>   r?   r@   rA   rB   rC   rE   rF   rG   rI   rJ   rK   rM   rN   rO   rP   rQ   rR   rS   rT   rU   )selfs    r   to_dictzStoryCard.to_dict   s]   
$'
t|
 48
 TZ	

 t|
 t|
 D-
 $/
 
 dk
 DI
 
 
 4+
 t|)r
  $/!
" 4+#
$ k!/|+/!/+1r -3"1 -3+9
 
 
 	
r   )r   rV   )__name__
__module____qualname____annotations__rC   rE   rF   rG   rI   rJ   rK   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rY   r   r   r   r3   r3      s        GGGLLLHHHJJJLLLNNNKKKOOOMMMHK%)G))))J(K((((FMGKJM)-K----%)L))))N%)L))))K
 
 
 
 
 
r   r3   zdict[str, dict[str, Any]]SYNDICATION_META_CACHEr
   c                 d    t          t                                                    j        d         S )Nr/   r
   __file__resolveparentsr   r   r   project_rootrd      "    >>!!##+A..r   c                 d    t          t                                                    j        d         S )N   r`   r   r   r   website_rootrh      re   r   c                 j    t          t                                } |                     dd           | S )NT)rc   exist_ok)r   rh   mkdir)paths    r   data_dirrm      s.    //DJJtdJ+++Kr   Nonec                    t          t                      dz             t          t                      dz             t          t                      dz  dz  dz             t          t	          j                              dz  } t          j                    dz  dz  t          j        j	         dt          j        j
         z  dz  }t          j                            dd	                              d
          }| |fD ]>}t          |          }|                                r||vr|                    |           ?d
                    d |D                       t          j        d<   d S )Nz.envoldtcg_probinLibraryPython.PATHrD   :c                    g | ]}||S r   r   ).0ps     r   
<listcomp>z$load_environment.<locals>.<listcomp>   s    ">">">A">1">">">r   )r   rd   rh   r
   sitegetuserbasehomesysversion_infomajorminorosenvirongetsplitr4   existsappendjoin)user_binpy_minor_bin
path_parts	candidatecs        r   load_environmentr      sI   '((('(((&2V;<<<D$&&''%/H9;;*X53;K;Q8l8lTWTdTj8l8llottL++11#66J- ! !		NN 	!!:"5"5a   ">">j">">">??BJvr   r4   c                     g d} | D ]}t          t          j        |          pd                                          }|rp|                    d          r|                    d          s*|                    d          r1|                    d          r|dd                                         }|                                                    d          r.|                    dd          d                                         }|r|c S dS )	N)MINIMAX_API_KEYMINIMAX_KEYMINIMAX_TEXT_API_KEYMINIMAX_TOKENrD   "'   zbearer  )r4   r   getenvstrip
startswithendswithlowerr   )
candidatesnamevalues      r   resolve_minimax_keyr      s     J  
 
BIdOO)r**0022 	(c""	(',~~c':':	(  %%	(*/..*=*=	( !B$K%%''E;;==##I.. 	3KKQ''*0022E 	LLL	2r   textc                   t          t          | pd                    } t          j        dd|           } t          j        dd|           } t          j        dd|           } t          j        dd| t          j                  } t          j        dd|           } t          j        d	d| t          j                  } |                     d
d                              dd          } t          j        dd|           } |                                 S )NrD   z!\[[^\]]*\]\([^)]*\)r   z\[[^\]]+\]\([^)]*\)z(?i)\bshow translation\bz\bRead\\s+\\d+\\s+replies\\bflagsz\b\d{1,2}:\d{2}:\d{2}\buQ   (?:^|\s)[·•]\s*\d[\d,]*(?:\s+\d[\d,]*){2,6}(?=\s*(?:Read\s+\d+\s+replies\b|$))z\n
\s+)r   r4   resubIreplacer   )r   s    r   
clean_textr      s    C
OO$$D6)355D6(#t44D6-sD99D613BDIIID6,c488D6fhkmqy{y}~~~D<<s##++D#66D6&#t$$D::<<r   c                    t          | pd          }t          j        dd|          }t          j        dd|          }t          j        dd|          }t          j        dd|          }|                                S )NrD   zhttps?://\S+r   @\w+z#\w+r   )r4   r   r   r   )r   ts     r   strip_links_mentionsr     sk    DJBA
Q''A
wQA
wQA
vsAA7799r   abr=   c                P   t          j        ddt          |                                                                                     }t          j        ddt          |                                                                                    }|r|sdS ||v s||v rdS t          t          j        d|                    }t          t          j        d|                    }|r|sdS t          ||z            }|t          t          |          t          |                    z  S )Nr   r   r1         ?[a-z0-9\u4e00-\u9fff]{2,})	r   r   r   r   r   setfindalllenmax)r   r   a_normb_norma_setb_setoverlaps          r   similarity_ratior     s   VFC!5a!8!8!>!>!@!@AAGGIIFVFC!5a!8!8!>!>!@!@AAGGIIF  s6V++s
7@@AAE
7@@AAE  s%%-  GSUSZZ0000r   r:   c                >   t          |           }|sg S t          j        d|          }g }|D ]o}t          |          }t          j        dd|                                          }t          t          |                    dk     rZ|                    |           p|S )Nu&   [。！？!?]|(?:\s{2,})|(?:\s*•\s*)z^\d+/\s*rD      )r   r   r   r   r   r   r   r   )r   srcpartsoutrz   s        r   split_sentencesr     s    
T

C 	H>DDEC  qMMF;A&&,,..#A&&''!++

1Jr      limitintc                   t          |           }|sg S g }g d}|D ]}t          |          }t          dt          |          dz            }|D ]'}t	          j        ||t          j                  r|dz  }(t          t	          j        d|                    dk    r|dz  }|                    ||f           |	                    d d	
           g }	t                      }
|D ]\\  }}t          |          }|r||
v r|r|
                    |           |	                    |           t          |	          |k    r n]|	S )N)z)\b(apr|may|jun|jul|aug|sep|oct|nov|dec)\bz\b\d{1,2}/\d{1,2}\bz\b(utc|gmt|pm|am)\bz%\b(v2|2\.0|beta|launch|open|coming)\buL   活動|更新|公告|功能|市場|上線|開放|報名|直播|抽卡|統計z
\$\d+|\d+%g@g      P@皙?r   r/   g      ?c                    | d         S Nr   r   )xs    r   <lambda>z#pick_signal_lines.<locals>.<lambda>A  s
    ad r   T)keyreverse)r   r   minr   r   searchr   r   r   sortr   
dedupe_keyadd)r   r   linesrankedkey_patternslineplainscorepatresultseen_r   s                r   pick_signal_linesr   +  s~   D!!E 	&(F  L  % %$T**CUd*++ 	 	CydBD)) rz'4(())Q..SLEudm$$$$
KKNNDK111FUUD  4 	3$;; 	HHSMMMdv;;%E  Mr   c                b   g }t          | pd          }t          j        d|          D ]}t          |                    d                    }|s(|                    d          }|s@t          j        d|          rVt          j        d|          rl|dv rq|t          d|                                dz
            t          t          |          |                                dz                                                      }t          t          j        d	|t          j                            }|                    d
d                              dd                              dd          }d}	|                                                    d          rd}	|d d         }ng|                                                    d          rd}	|d d         }n3|                                                    d          rd}	|d d         }	 t%          |          |	z  }
n# t&          $ r d}
Y nw xY wd|
cxk    rdk    rn nd
|vrd|vr|s*|
r|
dk     rd
|vrd|vr|s>d|vrd
|vrd|vr
|s|
dk     rT||v rZ|                    |           t          |          |k    r n|S )NrD   z$\$?\d[\d,]*(?:\.\d+)?(?:[kKmMbB])?%?r   ,z\d{1,2}u   \d{1,2}[:：]\d{2}>   000   uu   card|cards|pack|packs|users|volume|成交|交易量|萬|千|億|usd|ntd|u\b|points|積分|sbt|%|billion|million|bn|mn$%r   kg     @@r   mg    .Ar   g    eAr1   il  i3  
   d   )r4   r   finditerr   grouprstrip	fullmatchr   startr   r   endr   r   r   r   r   r   r=   	Exceptionr   )r   r   uniqr   r   hctxhas_unitnumericscalenvals              r   extract_numeric_factsr   P  s   D
djb//C[@#FF / /qwwqzz"" 	HHSMM 	<
A&& 	<-q11 	#aR((3s3xx2+F+FFGMMOOI I 
 
 ))C$$,,S"55==c2FF==??##C(( 	#EcrclGG]]__%%c** 	#EcrclGG]]__%%c** 	##EcrclG	>>E)DD 	 	 	DDD	 44CqLLS\\(\ 	D2II#Q,,3a<<<a<<CqLLS\\(\tVYzz99At99E Ks   H%%H43H4c                l   t          |           }|sg S t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  t          j        dt          j                  g}g }|D ]}|                    |          D ]}t          |                    d	                    }|s't          |||                                |                                          s^||v rc|	                    |           t          |          |k    r|c c S |S )
Nua   (?<![:\d])(?:[01]?\d|2[0-3])[:：][0-5]\d\s*(?:am|pm)\b(?:\s*\(?(?:utc|gmt)\s*[+＋−-]?\d+\)?)?zF\b(?:apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,2}(?:\s*-\s*\d{1,2})?u:   \b(?:20\d{2}/)?\d{1,2}/\d{1,2}(?:\s*[-~到至]\s*\d{1,2})?n   (?:20\d{2}\s*年\s*)?\d{1,2}\s*月\s*\d{1,2}\s*(?:日|号|號)?(?:\s*[-~到至]\s*\d{1,2}\s*(?:日|号|號)?)?z*(?<![:\d])(?:1[0-2]|0?[1-9])\s*(?:am|pm)\bu2   (?<![:\d])(?:[01]?\d|2[0-3])[:：][0-5]\d(?![:\d])u+   \b(?:utc|gmt)\s*[+-]?\d+\b|utc[+＋−-]\d+u}   (?:本週|下週|週末|明天|今晚|即將|今天|今日|稍後|稍后|tonight|tomorrow|today|live now|this week|next week)r   )r   r   compiler   r   r   _keep_schedule_factr   r   r   r   )r   r   r   patsfoundr   matchtokens           r   extract_schedule_factsr    s   
T

C 	 	
pD	
 	
 	
\^`^bcc

PRTRVWW

  E  GI  GK  	L  	L

@"$GG

H"$OO

A24HH

  T  VX  VZ  	[  	[D E  \\#&& 
	 
	Eu{{1~~..E &sE5;;==%))++NN ~~LL5zzU"" #
	 Lr   c                p    t          | pd          }|sdS t          t          j        d|                    S )NrD   Fu   (?i)\b(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,2}\b|\b(?:20\d{2}/)?\d{1,2}/\d{1,2}\b|(?:20\d{2}\s*年\s*)?\d{1,2}\s*月\s*\d{1,2}\s*(?:日|号|號)?)r4   r   r   r   )r   r   s     r   _contains_calendar_dater    sJ    
djb//C u
	O 		
 	
  r   sourcer  r   r   c                   |                                 }| t          d|dz
            t          t          |           |dz                                                       }t	          j        d|t          j                  rdS t	          j        d|          rt	          j        t	          j        |           d| t          j                  rdS t	          j        d	| t          j                  rdS t	          j        d
|          rdS t	          j        d| t          j                  rdS dS t	          j        d|t          j                  r-t          t	          j        d| t          j                            S dS )Nr   r   r   u"   views?|repl(?:y|ies)|播放|觀看Fu   (?:[01]?\d|2[0-3])[:：][0-5]\dz\s*(?:am|pm)T   (?:utc|gmt)\s*[+＋−-]?\d+u2   [-~–—至到]\s*(?:[01]?\d|2[0-3])[:：][0-5]\du7   (join us|live|session|ama|活動|event|報名|register)uU   today|tonight|tomorrow|今天|今晚|明天|本週|下週|週末|即將|稍後|稍后u?   (join us|live|session|ama|活動|event|報名|register|discord))
r   r   r   r   r   r   r   r   escaper   )r  r  r   r   lowr   s         r   r   r     sQ   
++--C
Q
##c#f++sRx&@&@@
A
G
G
I
IC	y6RTBB u	|6>> 	95))777FF 	494fbdCC 	49JCPP 	49OQWY[Y]^^ 	4u	yiknprptuu qBI`bhjljnooppp4r   tweet_idr   c                r    t          |           dz	  dz   }t          j        |dz  t          j                  S )N   l   )i  )tz)r   r   fromtimestampr   utc)r  ts_mss     r   snowflake_to_datetimer    s3    ]]b M1E!%$,8<@@@@r   r7   c                    	 t          t          | pd                    j                                        t          k    S # t
          $ r Y dS w xY w)NrD   F)r   r4   netlocr   	JINA_HOSTr   )r7   s    r   _is_jina_urlr    sU    CI2''.4466)CC   uus   =A   
AAc                     t           5  t          j                    } t          | t          z
  z
  }|dk    rt          j        |           t          j                    ad d d            d S # 1 swxY w Y   d S r   )JINA_RATE_LOCKtime	monotonicJINA_MIN_INTERVAL_SECONDSJINA_LAST_REQUEST_ATsleep)nowwait_secondss     r   _wait_for_jina_slotr!    s    	 0 0n0C:N4NO!J|$$$#~//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   AA((A,/A,resprequests.Response | Nonec                   | dS t          | j                            d          pd                                          }|sdS 	 t	          dt          t          |          d                    S # t          $ r Y dS w xY w)Nr1   zRetry-AfterrD   g      >@)r4   headersr   r   r   r   r=   r   )r"  raws     r   _retry_after_secondsr'    s    |s
dl}--3
4
4
:
:
<
<C s3E#JJ--...   sss   *A0 0
A>=A>-   timeoutc                *   ddd}t          |           }|r
t          dz   nd}d }t          |          D ]}d }	 |rt                       t	          j        | ||          }|r	|j        dvr|                                 |j        c S |                                 i# t          $ rX}|}|r	||dz
  k    r t          |          }	|	pt          d|z  z  }
t          j        t          |
d                     Y d }~d }~ww xY w|r|t          d	          )
N+Mozilla/5.0 (compatible; RenaissXIntel/1.0)z*text/plain, text/markdown;q=0.9, */*;q=0.8)
User-AgentAcceptr   r%  r)  >             rg   g      (@zfailed to fetch text)r  JINA_MAX_RETRIESranger!  requestsr   status_coderaise_for_statusr   r   r'  JINA_RETRY_BASE_SECONDSr  r  r   RuntimeError)r7   r)  r%  is_jinaattempts
last_errorattemptr"  excretry_afterbackoffs              r   
fetch_textrB    sw   C> G 3G'.5!##AH#'J?? + +)-	+ &#%%%<WgFFFD !d.6OOO%%'''y   !!#### 	+ 	+ 	+J gA55.t44K!O&=g&NGJs7D))********	+  
-
.
..s   ABB
C?'AC::C?usernamec                    d|  d|  dg}g }|D ]5}	 |                     t          |                     &# t          $ r Y 2w xY wd                    |          S )Nzhttps://r.jina.ai/http://x.com/z?mx=1z

)r   rB  r   r   )rC  variantscombinedr7   s       r   fetch_profile_pagerG    s    4(449(999H H  	OOJsOO,,,, 	 	 	H	;;x   s   "6
AAc                   t          | pd                                                              d          }|sg S d| d}	 t          j        |ddid          }|j        d	k    s|j                                        sg S |j        }n# t          $ r g cY S w xY wt          j	        d
t          j
        |           dt          j                  }g }t                      }|                    |          D ]a}	|	|v r|                    |	           |                    |	           t!          |          t#          dt%          |                    k    r nb|S )NrD   @zhttps://nitter.net/z/rssr,  r+  r   r.     /z/status/(\d+)r   )r4   r   lstripr6  r   r7  r   r   r   r   r
  r   r   r   r   r   r   r   r   )
rC  r   unamer7   r"  r   r   r   r   sids
             r   (fetch_account_status_ids_from_nitter_rssrO    su   B%%''..s33E 	
+
+
+
+C
|!#PQ
 
 

 s""$)//*;*;"Iy   			 *9")E**99924
@
@CCUUD{{4    $;;

3s88s1c%jj))))E *Js   >B	 B	 	BBdatarV   c                "   t          |                     d          t                    r|                     d          ng }|D ]g}t          |t                    st	          |                    d          pd                                          }|                    d          r|c S ht          |                     d          t                    r|                     d          ng }|D ]g}t          |t                    st	          |                    d          pd                                          }|                    d          r|c S ht          |                     d          t                    r|                     d          ni }t          |                    d          t                    r|                    d          ni }d	D ]}|                    |          }t          |t                    s-t          |                    d
          t                    r|                    d
          ni }	t	          |	                    d          pd                                          }|                    d          r|c S dS )Nphotosr7   rD   httpmediaDetailsmedia_url_httpscardbinding_values)broadcast_thumbnail_originalbroadcast_thumbnail_x_largebroadcast_thumbnail_largebroadcast_thumbnailphoto_image_full_size_originalphoto_image_full_size_largeimage_value)
isinstancer   listdictr4   r   r   )
rP  rR  itemr7   mediarV  bindingsr   entryr^  s
             r   _extract_syndication_coverrf  7  sk   #-dhhx.@.@$#G#GOTXXhRF  $%% 	$((5//'R((..00>>&!! 	JJJ	 )3488N3K3KT(R(RZDHH^$$$XZE  $%% 	$((,--344::<<>>&!! 	JJJ	  *$((6*:*:DAAI488FrD-7AQ8R8RTX-Y-Yatxx()))_aH   S!!%&& 	2<UYY}=U=UW[2\2\deii...bd+//%((.B//5577>>&!! 	JJJ	2r   Fforcedict[str, Any] | Nonec                
   t          | pd                                          }|sd S |s8|t          v r/t                              |          pi }|rt	          |          nd S |dd}	 t          j        t          |d          }|                                 |                                }n# t          $ r Y d S w xY wt          |t                    r|sd S t          |                    d          t                    r|                    d          ni }t          |                    d          pd                                          }t          |                    d          pd                                          }	t          |                    d	          t                    r|                    d	          ni }
t          |
                    d
          pd                                          }t          |                    d
          pd                                          }t          |          t          |          k    r|}t          |                    d          pd                                          }t          |          }|r|                                nd}t          |                    d          p+|                    d          p|                    d          pd                                          }t          |                    d          pd                                          }t          |                    d          t                    r|                    d          ni }t          |                    d          pd                                          }t          |                    d          t                    r|                    d          ni }t          |                    d          pd                                          }t          |                    d
          pd                                          }|s|r|}|s|r|}t          |                    d          p|          ||	t          |          ||||||t          |          t          |                    d          pd          t!          |          d}|t          |<   t	          |          S )NrD   r   )r5   r  r   )paramsr)  userscreen_namer   
note_tweetr   
created_atin_reply_to_status_id_strin_reply_to_status_idparent_tweet_id_strin_reply_to_screen_nameparentid_strconversation_countr   )r5   r6   display_namer   rn  created_at_isorU   reply_to_account	parent_idparent_accountparent_textru  rE   )r4   r   r^   r   ra  r6  SYNDICATION_TWEET_URLr8  jsonr   r_  r   parse_datetime_guess	isoformatr   r   rf  )r  rg  rN  cachedrj  r"  rP  rk  r6   rv  rm  	note_textr   created_raw
created_dtcreated_isorU   rx  rs  ry  parent_userrz  r{  metas                           r   fetch_status_metadatar  \  s   
hn"


#
#
%
%C t 0S222'++C006B%/tF|||4/#&&F|1&"MMMyy{{   tt dD!!  t)$((6*:*:DAAI488FrD$((=))/R006688Gtxx''-2..4466L+5dhh|6L6Ld+S+S[,'''Y[JJNN6**0b117799Itxx%2&&,,..D
9~~D		!!dhh|,,23399;;K%k22J,6>*&&(((BK,-- 	88+,,	88)**	 	 
 egg  488$=>>D"EEKKMM#-dhhx.@.@$#G#GOTXXhRFFJJx((.B//5577I(26::f3E3Et(L(LT&**V$$$RTK77=2>>DDFFNfjj((.B//5577K  9   * *) $((8$$+,,$4  !%",(!+..!$((+?"@"@"EAFF1$77 D #'3::s   (AB- -
B;:B;r  c                   t          t          |                     d          pd                    }t          |                     d          pd                                          }t          |                     d          p|                                          }t          |                     d          pd                                          }d| d| d	| d
}|r	|d| d
z  }|d| d
z  }|S )Nr   rD   r6   x_userrv  rn  zTitle: z on X: "z" / X

URL Source: r   z
Published Time: z
Markdown Content:
)r   r4   r   r   )r  r7   r   r6   rv  createdr8   s          r   build_markdown_from_status_metar    s    c$((6**0b1122D$((9%%12288::Gtxx//:7;;AACCL$((<((.B//5577GNlNNDNNsNNNE 21g1111	-T----ELr   	page_textc                r   | sg S |                                                     d          }t                      }g }t                              |           D ]`\  }}|                                                     d          |k    r1||v r6|                    |           |                    |           a|S )NrI  )r   rL  r   	STATUS_REr   r   r   )r  rC  wantedr   r   ownerrN  s          r   extract_status_idsr    s     	^^$$S))FUUDF''	22  
s;;==$$..$;;cMr   
title_linec                   d}|| v rq|                      |d          d                                         }|                    d          r|                    d          r
|dd         }t	          |          S t	          |           S )Nz on X: r   r   r   )r   r   r   r   r   )r  markerbodys      r   _extract_titler    s    F**1-3355??3 	DMM#$6$6 	":D$j!!!r   markdown_bodyc                   t          | pd          }|sdS dD ]$}||v r|                    |d          d         } n%dD ]"}||v r|                    |d          d         }#g d}|D ]}|                    |d          }t          j        dd|t          j        	          }t          j        d
d|          }t          |          S )NrD   )z# Conversationz## Conversationz# Postz## Postr   )z## New to X?z## Trending nowzTerms of Serviceu   © 2026 X Corp.r   )u   Don’t miss what’s happeningz!People on X are the first to knowzSee new postszSign up with ApplezSign up with Googler   z^#+\\s*r   zhttps://t\\.co/\\S+)r4   r   r   r   r   Mr   )r  r  r  stopboilerplater  s         r   extract_focus_contentr    s   }"##D rL  T>>::fa((+DE  [ * *4<<::dA&&q)D  K  ( (||E3''6*b$bd333D6(#t44Ddr   c                ^   t          |           }|                                }t          |          dk     rdS t          j        d|          rdS t          j        d|t          j                  rdS t          t          j        d|t          j                            }t          t          j        d|                    }t          t          j	        d|                    }|dk    r|s|sdS |
                                                    d	          rt          |          d
k     r|sdS dS )N   Tz[\W_]+u+   ^(恭喜|讚|wow+|nice+|哈哈|lol|both~?)$uz   活動|event|update|公告|feature|launch|上線|即將|coming|tour|festival|market|price|volume|抽卡|空投|sbt|2\.0|v2\dr   r/   rI  @   F)r   r   r   r   r   r  r   r   r   r   r   r   )r   r   plain_lowerhas_signal_kw
has_numbertoken_counts         r   is_noise_textr    s    &&E++--K
5zzBt	|Iu%% t	x>rtLL t
	 JD	
 	
 M biu--..Jbj!={KKLLKajt{{}}$$ Ubt5r   rc  c                   t          | t                    sdS | D ]g}t          |t                    st          |                    d          pd                                          }|                    d          r|c S hdS )NrD   r7   rS  )r_  r`  ra  r4   r   r   r   )rc  rb  r7   s      r   extract_first_imager    s    eT"" r  $%% 	$((5//'R((..00>>&!! 	JJJ	2r   c                    t          | pd          }g d}|D ]0}t          j        ||          }|r|                    d          c S 1dS )NrD   )zH(?i)\b(apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{1,2}(?:\s*-\s*\d{1,2})?z1\b(?:20\d{2}/)?\d{1,2}/\d{1,2}(?:\s*-\s*\d{1,2})?r   u4   (?:本週|下週|週末|明天|今晚|今天|今日)r   )r4   r   r   r   )r   r   patternsrz   r   s        r   date_hint_from_textr  	  sj    DJBA  H   IaOO 	771::	2r   r?   c                @    ddddddd}|                     | d          S )Nevent_postermarket_signalannouncement_timelinerH   r    r!   r%   r#   r"   r$   r   r?   mappings     r   choose_template_idr    s7    !/*#$ G ;;y"3444r   rD   rG   rK   c                   | dv r|r	 t          j        |          }|j         |                    t          j                  }|                                t          j        t          j                                                  z
  j        }d|cxk    rdk    rn ndS d|cxk    rdk    rn ndS n# t          $ r Y nw xY w|dk    rdS |d	k    rdS d
S )N>   r    r#   r%   tzinfor   r/   highr   r   medium   rL   )
r   fromisoformatr  r   r   r  dater  daysr   )r?   rG   rK   dtr  s        r   compute_urgencyr  $  s    888]8
	'66By ZZx|Z44GGIIX\ : : ? ? A AAGDD~~~~A~~~~~vDBx 	 	 	D	RvQx8s   BB2 B2 2
B?>B?base_dtdatetime | Nonetuple[str, str]c                >   t          | pd          }|pt          j        t          j                                      t          j                  j        }dddddddd	d
dddd}dUdVfd}t          j        d|          }|r|	                    |
                    d                                          d d         d          }t          |
                    d                    }|
                    d          r"t          |
                    d                    nd }	 |||||	          \  }
}|
r|
|fS t          j        d|          }|rt          |
                    d                    }|	                    |
                    d                                          d d         d          }|
                    d          r"t          |
                    d                    nd }	 |||||	          \  }
}|
r|
|fS t          j        d|          }|r|}|
                    d          rV	 t          t          |
                    d                                        d                    }n# t          $ r |}Y nw xY wt          |
                    d                    }t          |
                    d                    }|
                    d          r"t          |
                    d                    nd }	 |||||	          \  }
}|
r|
|fS t          j        d|          }|r|
                    d          r"t          |
                    d                    n|}t          |
                    d                    }t          |
                    d                    }|
                    d          r"t          |
                    d                    nd }	 |||||	          \  }
}|
r|
|fS t          |                                          }t!          t          j        d|t          j                            }dWfd#}|r,t          j        d$|t          j                  r |dd%          S |r,t          j        d&|t          j                  r |dd'          S |r,t          j        d(|t          j                  r |dd)          S i ddd*dd+dd,dd-dd.dd/dd0dd1dd2dd3dd4dd5dd6dd7dd8dd9di d:dd;dd<dd=dd>dd?dd@ddAddBddCddDddEddFddGddHddId}t          j        dJ|          }|r|r|
                    d          pd                                }|s-|
                    d          rdK|
                    d           }|	                    |          }||                                z
  dz  }|dk    r"t          j        dL|t          j                  rd}t'          |M          z                       ddddN          }|                                |                    dO          fS |rOt          j        dP|t          j                  r/                    ddddN          }|                                dQfS |r`t          j        dR|t          j                  r@t'          dM          z                       ddddN          }|                                dSfS dTS )XNrD   r   rg   r/   r      r     r   	   r      r   )janfebmaraprmayjunjulaugsepoctnovdecyr   mondayday_end
int | Noner   r  c                x   d|cxk    rdk    rn nd|cxk    rdk    sn dS 	 t          | ||ddt          j                  }|t          d          z
  k     r"t          | dz   ||ddt          j                  }|d	d
|d	}|r||k    r| d|d	}|                                |fS # t
          $ r Y dS w xY w)Nr   r      rD   rD   r   r  x   r  02drK  -)r   r   r  r   r  r   )r  r  r  r  r  labelr  s         r   _build_datez*extract_timeline_date.<locals>._build_dateA  s   SB1>>>>r>>>>6		!S#q!HLAAABC)------a!eS#q!HLIII******E 17c>> 007000<<>>5(( 	 	 	66	s   BB+ +
B98B9z^(?i)\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+(\d{1,2})(?:\s*-\s*(\d{1,2}))?r   )r  zn(?i)\b(\d{1,2})(?:st|nd|rd|th)?\s+(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*(?:\s*-\s*(\d{1,2}))?uB   \b((?:20\d{2})/)?(\d{1,2})/(\d{1,2})(?:\s*[-~到至]\s*(\d{1,2}))?rK  ux   (?:\b(20\d{2})\s*年\s*)?(\d{1,2})\s*月\s*(\d{1,2})\s*(?:日|号|號)?(?:\s*[-~到至]\s*(\d{1,2})\s*(?:日|号|號)?)?u}   (join us|live|session|ama|活動|event|報名|register|discord|goes live|launch|release|snapshot|開放|上線|上线|提醒)r  r  r4   c                    t          |           z                       dddd          }|                                |fS )Nr  r   hourminutesecondmicrosecond)r   r   r  )r  r  r  r  s      r   _build_relativez.extract_timeline_date.<locals>._build_relative  sC    I4((((11q1Z[1\\||~~u$$r   u"   (後天|后天|day after tomorrow)u   後天u   (明天|tomorrow)u   明天u4   (今天|今日|今晚|今夜|today|tonight|live now)u   今天mondayu   週一u   周一tuetuestuesdayu   週二u   周二wed	wednesdayu   週三u   周三thuthurthursthursdayu   週四u   周四frifridayu   週五u   周五satsaturdayu   週六u   周六sunsundayu   週日u   周日u   週天u   周天u   (?i)\b(mon(?:day)?|tue(?:s|sday)?|wed(?:nesday)?|thu(?:r|rs|rsday|rsday)?|fri(?:day)?|sat(?:urday)?|sun(?:day)?)\b|(?:週|周)([一二三四五六日天])u   週u   (next week|下週|下周)r  r  z%m/%du4   (this week|本週|本周|this weekend|週末|周末)u   本週u&   (next week|下週|下周|next weekend)u   下週r  N)
r  r   r  r   r  r   r  r  r   r  )r  r   r  r4   r   r  )r4   r   r  r   r  
astimezoneyearr   r   r   r   r   r   r   r   r   r   r   weekdayr   r   r  strftime)r   r  r   r  	month_mapr  r   r  r  r  isor  	year_hintsrc_lowtime_contextr  weekday_mapwkr  targetdeltar  r  s                         @r   extract_timeline_dater  8  s5   
djb//C0hl8<00
<
<X\
J
JC8D1Qq1R2 I
       		suxyyA mmAGGAJJ,,..rr2A66!''!**oo%&WWQZZ9#aggajj///T [sCAAA
U 	:
	y	 	A 	 !''!**oommAGGAJJ,,..rr2A66%&WWQZZ9#aggajj///T [sCAAA
U 	:
	WY\]]A 	771:: 	!!AGGAJJ 5 5c : :;;		 ! ! ! 			!!''!**oo!''!**oo%&WWQZZ9#aggajj///T [CgFFF
U 	:
	 	D	 	A 	 '(wwqzz;C

OOOt	!''!**oo!''!**oo%&WWQZZ9#aggajj///T [CgFFF
U 	:oo##%%G
	 MD	
 	
 L% % % % % %  ,	"GRTRVWW ,q(+++ ,	"6FF ,q(+++ ,	"Y[bdfdhii ,q(+++qA',4aq!&+3Q8@! 	q q #+A 08 	q	 !	 %a	 *4Q	  9A!	 FNq	
 	q
 A
  (
 -5a 	q a "*1 /7 	q A  ( -5a :B1 GOPQ K 
 	f
 
B 
 
8l 
8!"))++ 	(! 	('"((1++''E''ckkmm+q0Ezzbi(DgrtTTz	u----66AaPQ_`6aaB<<>>2;;w#7#777 (	"Y[bdfdhii ([[a![CC||~~x'' (	"KWVXVZ[[ (I1%%%%..AaWX.YY||~~x''6s   7AI: :J	J	markdownrC   
tweet_metaStoryCard | Nonec                p	   t                               |           }|sd S t                              |           }t                              |           }t	          |                    d                    }	|r'|                    d                                          nd}
t          |
          pt          |
          }t          |          dk     rt          |	          dk     rd S t          |          t          |	          k    r|n|	}d}t          |t                    r1t          t          |                    d          pd                    }t          |          t          dt          |                    k    r|}t          |          rd S t!          |          \  }}}t#          |||          }t          |                    d          pt%          |d                    }t          |                    d	          t&                    r|                    d	          nt)          |          }t          |                    d
          pd                                          }d}|r	 t+          j        |                    d                                          d          }|                    t0          j                                                  }n# t6          $ r d}Y nw xY w|sOt          |t                    r:t          |                    d          pd                                          }|r|}|s!t9          |                                          }d}t:                              |           D ]
}d|v r|} n|sKt          |t                    r6t          |                    d          pd                                          }d}t          |t                    rKt          |                    d          p|                    d          pd                                          }t?          d!i d|d|d|d
|p|	pd| dd|d	|d|ddd|d|d|d|d d         d|d|d i d|}tA          |          |_!        tE          |           tG          |           |S )"Nr   rD   r   r   r   r9      max_lenr;   r8   z%a, %d %b %Y %H:%M:%S %Zr  rw  zpbs.twimg.com/media/rE   rU   ry  r5   r6   r7   rI  z updater<   r>   gQ?r?   r@   rA   rB   i	  rC   rF   r   )$TITLE_REr   PUBLISHED_REMARKDOWN_REr  r   r   r  r   r   r_  ra  r4   r   r   r  classify_storybuild_editorial_copysummarize_naiver`  extract_bulletsr   strptimer   r   r  r  r   r  IMAGE_REr   r3   
score_cardrG   enrich_card_metadataenrich_detail_view)r  rC  r  r7   rC   r  title_matchpublished_matchmarkdown_matchr8   r&  	raw_cleancontent_source	meta_textr?   r@   rA   shapedr9   r;   normalized_titler<   r  meta_isocoverimgrU   rV  s                               r   parse_status_pager%    s
    //(++K t"))(33O ''11N;,,Q//00E-;
C.

q
!
!
'
'
)
)
)C%c**=jooI
9~~c%jj1nnt"%i..3u::"="=YY5NI*d## Bs:>>&#9#9#?R@@AA	
9~~BN 3 34444"^$$ t,^<<Ivt!.)XFFF&**Y''W?>SV+W+W+WXXG'1&**Y2G2G'N'Nsfjj###TcdrTsTsG6::g..4"55;;==L 	"?#8#8#;#;#A#A#C#CE_``B::X\:::DDFFLL 	 	 	LLL	 $Jz488 $z~~&677=2>>DDFF 	$#L C,X66@@BBE))  !S((EE )  AZ
D11 AJNN=117R88>>@@K*d## f*..77\:>>+;V;V\Z\]]ccee   8 C @%@+@x+@+@+@	
   "\ 4 ) v T  &&  E    K!D$ !&&DOtKs   1A,K K-,K-timeline_isoc                   t          |           }t          |          pt          |          }t          t                              |                    }t          t
                              |                    }t          t                              |                    }t          t                              |                    }t          t                              |                    }t          t          j        d|t          j
                            }	t          t          j        d|t          j
                            }
t          t                              |                    }t          t          j        d|t          j
                            }t          t          j        d|t          j
                            }|r|sdS d}|r|dz  }|r|dz  }|r|dz  }|r|dz  }|r|dz  }|s|r|dz  }|	r|r|dz  }|r|d	k     rdS |
r
|d	k     r|sdS |r|r|	rd
S t          |dk    o|o	|p|p|p|p|          S )Nu   (that'?s a wrap|thanks to everyone who joined|活動回顧|行程回顧|回顧|結束回顧|tour recap|after the tour|during web3 festival)uc   (threshold|snapshot|beta|v\d|2\.0|mfa|authentication|security|progress update|版本|功能|更新)u4   \bwhat if\b|會不會|会不会|\bif\b.{0,18}\bama\bu|   join us|live now|今晚|tonight|報名|register|discord|space|goes live|drop now|open now|開賣|开卖|參加|参加|attendFr   r   rg   r   Tr/   )r   r   _has_actionable_event_scheduleEVENT_SIGNAL_REr   PARTICIPATION_SIGNAL_RELOCATION_SIGNAL_RELIVE_REWARD_RESTRICT_EVENT_CALL_REr   r   SBT_THRESHOLD_NOTICE_RE)r   r&  r  has_timehas_event_signalhas_participationhas_locationhas_live_rewardhas_explicit_eventhas_recap_signallooks_like_feature_updatelooks_like_sbt_threshold_noticehypotheticalexplicit_callevidence_scores                  r   _has_event_evidencer;    s   FL!!K%CF%K%KHO226::;;4;;FCCDD*11&99::L>008899O299&AABB
	 [D	
 	
  !%
	rD	
 	
! ! '++B+I+I&+Q+Q&R&R#	"Y[acecghhiiL
	 LD	
 	
 M  M uN ! ! ! ! ! ] ! L ! ' >A+=+=u  ^a%7%7%7u L -= t! 	j	jh,h/h]hVh  r   c                *   t          |           }|sdS t          |d          }|sdS d                    |          }t          |          }t	          t          j        d|t
          j                            }t	          t          j        d|t
          j                            }t	          t          j        d|t
          j                            }t	          t                              |                    }|rdS |r|s|rdS |r|rdS |r|rdS dS )	NFr  r   r   uJ   \b\d{1,2}\s*(?:am|pm)\b|(?<![:\d])(?:[01]?\d|2[0-3])[:：][0-5]\d(?![:\d])r	  uG   tonight|today|tomorrow|今晚|今天|明天|本週|下週|週末|即將T)	r   r  r   r  r   r   r   r   r-  )	r   r   factsjoinedhas_dater/  has_zonehas_relativehas_event_contexts	            r   r(  r(  L  s+   
T

C u"3a000E uXXe__F&v..HBIkmsuwuyzz{{HBI=vrtLLMMH	"lnqsuswxxyyL188==>> t X  t % t ) t5r   tuple[str, str, list[str]]c                6   t          |           }t          |          }t          |          \  }}|                                }t	          ||          }t          t                              |                    }t          t                              |                    }t          t                              |                    }	t          t                              |                    }
t          t                              |                    }t          t          j        d|                    }t          t          j        d|t          j                            }t          t          j        d|t          j                            }|r	|sddddgfS |rd	d
ddgfS |s|r|	r	|sddddgfS ddddgfS |
r	|rddddgfS |r	|sddddgfS |	rddddgfS |rddddgfS t          t          j        d|                    dk    r|sdddgfS dddgfS )N)r&  r  u  (\bsbt\b|soulbound|積分|积分|points?).{0,38}(threshold|snapshot|top\s*\d+%|排名|rank|門檻|快照|unlock|claim|mint|發放|领取|領取|取得|獲得)|(threshold|snapshot|top\s*\d+%|排名|rank|門檻|快照).{0,38}(\bsbt\b|soulbound|積分|积分|points?)u   (pull|open|mint|claim|join|attend|share|hold|buy|參加|参与|完成|快照|排名).{0,48}(\bsbt\b|soulbound|認證|认证)|(\bsbt\b|soulbound).{0,48}(unlock|claim|get|receive|領取|领取|取得|獲得|解鎖|解锁)r"   brief   分析   內容r    poster   活動   參與r%   timeline   更新   公告r#      功能   即將開放r!   rP     市場   數據r   r  r$      觀點)r   r   r  r   r;  r   GUIDE_SIGNAL_REr   FEATURE_SIGNAL_REANNOUNCE_SIGNAL_REMARKET_SIGNAL_REREPORT_SIGNAL_REr   r   r   r   )r   r  r   r&  r   r   	has_event	has_guidehas_featurehas_announce
has_market
has_reporthas_numbershas_sbt_featurehas_sbt_unlocks                  r   r  r  d  s   F ((E+E22OL!KKMME#EEEEI_++E2233I(//6677K*11%8899L&--e4455J&--e4455Jry..//K
	yD		
 	
 O 
	nD		
 	
 N  7 78X"666  78X"666  A. A 	D 	D!:(/CCC*x&@@@  6k 6(H!555  A9 A*x&@@@ @zHh+??? 78X"666 2:2E::;;q@@@'H:--gz))r   tuple[str, list[str]]c                t    dddgfdddgfddd	gfd
ddgfdddgfd
dgfd}|                     | d
dgf          S )NrI  rJ  rK  rL  rO  rP  rP  rQ  rR  rF  rG  rH  rM  rN  rS  )r    r#   r!   r"   r%   r$   r  r  s     r   default_style_for_typerd    sv    Xx01> :;Hh/0Xx01#h%9:hZ( G ;;y7XJ"7888r   rV  c                X   d}| j                                         dk    r|dz  }dddddd	d
}||                    | j        d          z  }| j        p| j        }t          |          r|dz  }| j        dk    r| j        r|dz  }t          	                    |pd          r|dz  }| j
        r|dz  }| j        pi }t          |                    dd          pd          }t          |                    dd          pd          }t          |                    dd          pd          }t          |                    dd          pd          }|t          d|dz  |dz  z   |dz  z   |dz  z             z  }t          t          |                    dk     r|dz  }t!          |d          S )Nr1   r   g      @g      @g@gffffff@g333333@g      @g      ?)r    r#   r%   r!   r"   r$   r   g333333?r    r0   rD   r   likesr   retweetsrepliesviewsg      @g      9@g       @g      .@g     p@   g@r/   )r6   r   r   r?   rB   r8   r  rK   r,  r   rE   rF   r   r   r   r   round)	rV  r   type_weightr   rF   rf  rg  rh  ri  s	            r   r  r    s   E||++ K 
[__T^S111E=&DJD4   ~  T%7 TZR((  l bGGQ'',1--E7;;z1--233H'++i++0q11GGQ'',1--E	SedlX^3gnDuv~UVVVE %%&&++??r   rJ  r  c                    t          |           }t          |          |k    r|S |d |                             dd          d                                         }|dz   S )Nr   r   r   z...)r   r   rsplitr   )r   r  cleanedsnippets       r   r  r    s^    G
7||whwh&&sA..q17799GU?r   c                .   t          |           }t          j        d|          }g }|D ]\}|                                }t	          |          dk     r*|                    |d d                    t	          |          |k    r n]|s|r|d d         g}|S )Nu   [。.!?！？]\s*r  n   r  )r   r   r   r   r   r   )r   r   ro  chunksitemschunks         r   r  r    s    GX*G44FE  u::??U4C4[!!!u::E   W  #Lr   c                @    ddddddd}|                     | d          S )	Nu   活動重點u   市場訊號u   官方公告u   功能進度u   重點分析u   社群觀點r  u   情報重點r  r  s     r   _headline_prefixrw    s6     &! ! G ;;y.111r   rt  c                   g }t                      }| D ]l}t          |d          }|st          |          }|r||v r+|r|                    |           |                    |           t          |          |k    r nm|S )Nr  )r   compact_pointr   r   r   r   )rt  r   r   r   r&  r   r   s          r   _unique_non_emptyrz    s    CUUD  #s## 	qMM 	d 	HHQKKK

1s88uE Jr   T   r   r  list[re.Pattern[str]]c                    | D ]C}t          |          }|s|D ],}|                    |          rt          ||          c c S -DdS )Nr  rD   )r   r   ry  )r   r  r  r   ro  r   s         r   _pick_fact_liner~  	  s|     ? ?T"" 	 	? 	?Czz'"" ?$Wg>>>>>>>>?	? 2r   c                    t          t          | pd                    }t          j        dd|          }t          j        dd|                              d          }t          ||          S )NrD   u   ^[\-\u2022•./:：()\s]+r   r   u    ;；,.。、r  )r   r4   r   r   r   ry  )r   r  r   s      r   _clean_fact_valuer    sa    3tzr??##A
+R33A
vsA$$_55AG,,,,r   r   dict[str, str]c                    t          | t                    si S d}i }|D ]>}|                     |          }t          t	          |pd          d          }|r|||<   ?|S )NrewardparticipationaudiencelocationschedulerD   \   r  )r_  ra  r   r  r4   )r   allowedr   r   r&  r   s         r   normalize_event_factsr    st    eT"" 	MGC  iinn SYB<<< 	CHJr   c                   t          | t                    rt          j        d|           }n$t          | t                    rd | D             }ng S g }t                      }|D ]}t          |pd                                                                          }|r||v r>|t          vrH|	                    |           |
                    |           t          |          dk    r n|S )Nu   [,，/|\\\s]+c                ,    g | ]}t          |          S r   )r4   ry   r   s     r   r{   z*normalize_topic_labels.<locals>.<listcomp>,  s    +++SVV+++r   rD   r  )r_  r4   r   r   r`  r   r   r   ALLOWED_TOPIC_LABELSr   r   r   )r   	raw_itemsr   r   r&  r  s         r   normalize_topic_labelsr  (  s    % H-u55			E4	 	  ++U+++			CUUD 	 	CI2$$&&,,.. 	,,,

5s88q==E Jr   	token_map!list[tuple[re.Pattern[str], str]]	max_itemsc                   g }t                      }|D ]^\  }}|                    |           rD||v r|                    |           |                    |           t	          |          |k    r n_d                    |          S )N   、)r   r   r   r   r   r   )r   r  r  r   r   r   r  s          r   _event_token_summaryr  >  s    CUUD  
U::d 	}}HHUOOOJJu3xx9$$::c??r   	list[int]c                    g }t          j        dt          | pd                    D ]5}	 |                    t	          |                     &# t
          $ r Y 2w xY w|S )Nz	(\d{2,5})rD   )r   r   r4   r   r   r   )r   valuesns      r   _extract_number_valuesr  L  sq    FZc$*"oo66  	MM#a&&!!!! 	 	 	H	Ms   "A
AArg   4   c                *   t          j        dt          |                     }g }|D ]E}t          |d          }|s||v r|                    |           t          |          |k    r nF|sdS t          d                    |          |          S )Nu   [，,。；;｜|]0   r  rD   r  )r   r   r   r  r   r   ry  r   )r   r  r  rs  pickedru  r   s          r   _compact_clauser  V  s    X*Jt,<,<==FF  eR000 	;;av;;)##E $ rF++W====r   r&  c                   t          |           }|sdS t          j        d|t          j                  rdnd}t          j        d|t          j                  }|st	          |d          S |                    d          }t          |                    d          pd          }|                                d	v r|                                }n|                                d
k    rd}| | }|r| | n|S )NrD   u   包稅|含稅u   包稅u    (\d{2,5})\s*(ntd|twd|usd|u|元)?   r  r   rg   >   ntdtwdusduU)	r   r   r   r   r  r   r4   r   upper)r&  r   pkgr   numunitcores          r   _normalize_price_textr  g  s    
S//C ri 0#rt<<
D(("C
	5sBDAAA 2 b1111
''!**CqwwqzzR  Dzz||,,,zz||			>4>>D *c>4>>>d*r   list[dict[str, str]]c           
     H   t          |           }|sg S t          t                              |                    }|sg S g }t	          |d |                   D ]\  }}t          |                    d          d          }|s-|                                }|dz   t          |          k     r||dz            	                                nt          |          }	t          |||	                   }
|
sd}t          j        d|
t          j                  }|r"t          |                    d                    }|sDt          j        d|
t          j                  }|r"t          |                    d                    }d}t          j        d|
t          j                  }|r%t          |                    d          dd	
          }d}t          j        d|
t          j                  }|r%t          |                    d          dd	
          }g }|r|                    d|            |r|                    d|            |r|                    d|            |s6|                    t          |
dd
          pt!          |
d                     g }t#                      }|D ]D}t%          |          }|r||v r|r|                    |           |                    |           E|                    ||||d                    |          d           |S )Nrg   rj  r  r   rD   u}   (?:價格|价格|價位|价位|費用|费用|運費|运费)[:：]?\s*([^。；;]{1,40}?)(?=(?:優點|优点|缺點|缺点|$))u"   (\d{2,5}\s*(?:ntd|twd|usd|u|元)?)uo   (?:優點|优点|優勢|优势|好處|好处)[:：]?\s*([^。；;]{2,72}?)(?=(?:缺點|缺点|價格|价格|$))6   )r  r  un   (?:缺點|缺点|風險|风险|限制|缺陷)[:：]?\s*([^。；;]{2,72}?)(?=(?:價格|价格|使用方式|$))u   價格 u   優點 u   缺點 X   u   ｜)r   priceprosconsdetail)r   r`  REPORT_OPTION_START_REr   	enumerater  r   r   r   r   r   r   r   r  r  r   ry  r   r   r   r   )r   r   r   matchesoptionsir   r   r   r   segmentr  pmpnr  pros_mr  cons_mdetail_partsdeduped_parts
seen_partspartr   s                          r   extract_report_optionsr  y  s}   
T

C 	)2237788G 	$&G'&5&/** E
 E
1 R888 	()AG(<(<ga!en""$$$#c((Ss^,, 	Y MD
 

  	7)"((1++66E 	;@'24PPB ;-bhhqkk::~D
 

  	M"6<<??aLLLD}D
 

  	M"6<<??aLLLD"$ 	3 1% 1 1222 	2 0$ 0 0111 	2 0$ 0 0111 	y1b Q Q Q wUbcjtvUwUwUwxxx#%"uu
  	' 	'DT""C sj(( $s###  &&&&**]33 	
 	
 	
 	
 Nr   c                &   t          |           }t          |d          }|sdg dS d |D             }dt          |           dd                    |d d                    d	g}g }|D ]D}t	          |                    d
d                    D ]}|dk     r	|                    |           E|rZt          |          t          |          }	}||	k    r|                    d| d	           n|                    d| d|	 d	           t          d |D                       st          d |D                       r|                    d           d |D             d d         }
t          d                    |                    d d         |
dS )Nr   r=  rD   )r9   r;   c                H    g | ]}|                     d           |d           S )r   r  ry   os     r   r{   z'build_report_digest.<locals>.<listcomp>  s+    9991155==9QvY999r   u
   整理出 u    個方案：z / u   。r  r   u   主要價格落點約 u   價格區間約 z - c              3  @   K   | ]}|                     d           V  dS )r  Nr  r  s     r   	<genexpr>z&build_report_digest.<locals>.<genexpr>  s,      
*
*Q155==
*
*
*
*
*
*r   c              3  @   K   | ]}|                     d           V  dS )r  Nr  r  s     r   r  z&build_report_digest.<locals>.<genexpr>  s,      1Q1QA!%%--1Q1Q1Q1Q1Q1Qr   u6   差異重點在速度、覆蓋範圍與額外費用。c                ^    g | ]*}|                     d           |d           d|d          +S )r   u   ：r  r  r  s     r   r{   z'build_report_digest.<locals>.<listcomp>  s=    PPP!!%%--P!F)--(--PPPr   r/   r   i  )
r   r  r   r   r  r   r   r   r   any)r   r   r  namessummary_partsr  r  vlohir;   s              r   build_report_digestr    s   
T

C$S222G ."---99999E bS\\ b b

SXY[Z[Y[S\H]H] b b bcMF  'gr(:(:;; 	 	A2vvMM!	  DVc&kkB88  !A"!A!A!ABBBB  !BB!B!B2!B!B!BCCC

*
*'
*
*
*** Wc1Q1Q1Q1Q1Q.Q.Q WUVVVPPwPPPQSRSQSTG!#((="9"9::4C4@WUUUr   c                   t          |           }|si S t          |d          }|st          |          d d         }t          |d          }t	          d                    |d d                   d          }t          |t          j        dt          j	                  dft          j        d	t          j	                  d
ft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dfgd          }t          |t          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dfgd          }|}|st          |t          t          gd           }|r	t          |          d!k    rt          |t          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dft          j        dt          j	                  dfgd          }|r|}g }	t          j        d"|t          j	                  }
|
r7|	                    t	          |
                    d#          d$                     t          j        d%|t          j	                  r|	                    d&           t          j        d'|t          j	                  r|	                    d(           t          j        d)|t          j	                  r|	                    d*           d                    t#          t$                              d+ |	D                                 d d                   }d,}t          j        d-|t          j	                  r#t          j        d.|t          j	                  rd/}nt          j        d0|t          j	                  rd1}nt          j        d2|t          j	                  rd3}nt          j        d4|t          j	                  rd5}nht          j        d.|t          j	                  rd6}nEt          j        d7|t          j	                  rd8}n"t          j        d9|t          j	                  rd:}|s"t          j        d;|t          j	                  rd8}t)          |||||d<          S )=Nr   r=  r/   r  8   r  z\bsbt\bSBTu   積分|积分|points?u   積分u   merch|周邊|周边u   周邊u   airdrop|空投u   空投u!   獎勵|奖励|獎品|prize|rewardu   活動獎勵r   )r  discordDiscordu   live|直播u   直播zsession|community\s*sessionu   社群 Sessionzjoin us|joinu   參與活動u   報名|报名|register|signupu   報名u   填表u   投票|互動|互动u   互動投票H   (   u#   (\d+\s*位?(?:參賽者|参赛者))r   r   u   觀眾|观众u   觀眾u!   all regions|多語|multi-languageu   多語社群u   community|社群u   社群玩家c                    g | ]}||S r   r   r  s     r   r{   z%build_event_facts.<locals>.<listcomp>*  s    -M-M-MA1-Ma-M-M-Mr   rD   zweb3\s*festivalu   hong\s*kong|香港u   香港 Web3 Festivalzarcadia\s+restaurantu-   Arcadia Restaurant & Bar（香港銅鑼灣）u   causeway\s*bay|銅鑼灣u   香港銅鑼灣midtownu   香港 Midtownu   香港u   discord|space|直播|liveu   線上（Discord / Live）plazazRenaiss Plazau   discord|space|live|直播r  )r   r   r   r  r  r   r  r   r   r   r~  JOIN_SIGNAL_REr*  r   r   r   r   r`  ra  fromkeysr  )r   r   r   schedule_itemsr  r  participation_tokensr  compact_participationaudience_partsr   r  r  s                r   build_event_factsr    sQ   
T

C 	c+++E )$$RaR(+Cq999N N2A2,>!?!?LLLH!Z
BD))51Z0"$77BZ.55x@Z)2400(;Z<bdCC^T	
 
 
 
F 0Z
BD))95Z--x8Z6==?OPZ..?Z8"$??JZ	24(((3Z/66G	
    )M f'@W/Xbdeee 2]++b00 4J--y9NBD118<:BDAACSTORT22NC<bdCCXNIrt,,h73RT::NK !
 !
 !
 ! 	21M "N
	8#rtDDA I/

BGGGHHH	y!3-- (h'''	y5sBDAA .n---	y$c2400 .n---zz$t}}-M-M-M-M-MNNOOPRQRPRSTTHH	y#S"$// #BI>SUXZ\Z^4_4_ #)	*C	6	6 #B	.RT	:	: 	#$	:sBD	)	) ##	(#rt	4	4 #	/bd	;	; #/	8S"$	'	' #" 0	">RTJJ 0/ *   	
 	
  r   )r   r   r   r   r   r   )r   r
   )r   rn   )r   r4   )r   r4   r   r4   )r   r4   r   r4   r   r=   )r   r4   r   r:   )r   )r   r4   r   r   r   r:   )r/   )r   r4   r   r   )
r  r4   r  r4   r   r   r   r   r   r   )r  r4   r   r   )r7   r4   r   r   )r"  r#  r   r=   )r(  )r7   r4   r)  r   r   r4   )rC  r4   r   r4   )r   )rC  r4   r   r   r   r:   )rP  rV   r   r4   )F)r  r4   rg  r   r   rh  )r  rV   r7   r4   r   r4   )r  r4   rC  r4   r   r:   )r  r4   r   r4   )r  r4   r   r4   )rc  r   r   r4   )r?   r4   r   r4   )rD   )r?   r4   rG   r=   rK   r4   r   r4   r  )r   r4   r  r  r   r  )r.   N)r  r4   rC  r4   r  r4   r7   r4   rC   r4   r  rh  r   r	  )r   r4   r&  r4   r   r   )r   r4   r   rD  )r?   r4   r   rb  )rV  r3   r   r=   )rJ  )r   r4   r  r   r   r4   )rt  r:   r   r   r   r:   )r{  )r   r:   r  r|  r  r   r   r4   )r   r   r   r  )r   r   r   r:   )r   r4   r  r  r  r   r   r4   )r   r4   r   r  )rg   r  )r   r4   r  r   r  r   r   r4   )r&  r4   r   r4   )r   r4   r   r   r   r  )r   r4   r   rV   )r   r4   r   r  )__doc__
__future__r   r}  r   r   r|   
subprocessr   r  htmlr   dataclassesr   r   r   r   email.utilsr	   pathlibr
   	threadingr   typingr   urllib.parser   r6  website_storager   dotenvr   r   DEFAULT_ACCOUNTSDEFAULT_WINDOW_DAYSDEFAULT_MAX_POSTS_PER_ACCOUNTDEFAULT_DISCORD_MONITOR_LIMITDEFAULT_CURATED_MAX_CARDSMINIMAX_URLr|  DISCORD_API_BASE_URLALLOWED_CARD_TYPESr  ALLOWED_FEEDBACK_LABELSr  r  r4  r9  r  r  r   r   r  r  Sr  r  r  LINK_REr  r)  rU  rT  r,  r*  r+  rW  rV  rX  REWARD_SIGNAL_REAUDIENCE_SIGNAL_REr  EVENT_LOCATION_REr  THREAD_PREFIX_RESBT_THRESHOLD_RESBT_SNAPSHOT_REr-  r.  r3   r^   r]   rd   rh   rm   r   r   r   r   r   r   r   r   r  r  r   r  r  r!  r'  rB  rG  rO  rf  r  r  r  r  r  r  r  r  r  r  r  r%  r;  r(  r  rd  r  r  r  rw  rz  r~  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s	   G G G " " " " " "  				 				      



        ! ! ! ! ! ! 2 2 2 2 2 2 2 2 2 2 - - - - - -                   ! ! ! ! ! !  0 0 0 0 0 0"""""""         LKK   "  "  @H 4 XXX ZZZ ,/CCykQ 	    BJFMM	2:4bdRTkBBrz5rt<<bj5rt<<
"*(
)
)2:899"*ND 
 BJ OD   "* YD  ^D 
 %"* LD    RZ aD   2:xD    RZfD   2:mD   2: BD    RZ~D    \D  BJyD   $`D   2:DbdKK 2:aD   "*XYY!rz \D   %"*sD   <
 <
 <
 <
 <
 <
 <
 <
~ 57  6 6 6 6/ / / // / / /   @ @ @ @   *
 
 
 
   1 1 1 1   " " " " "J3 3 3 3 3l    D      (A A A A   0 0 0 0	 	 	 	/ / / / /<! ! ! !    <" " " "JA A A A AH	 	 	 	    " " " "   :   2	 	 	 	   	5 	5 	5 	5    (| | | | |H  (,S S S S Sl< < < < <~   0;* ;* ;* ;*|	9 	9 	9 	9" " " "J         	2 	2 	2 	2    $    - - - - -
 
 
 
   ,       > > > > >"+ + + +$O O O O OdV V V V:_ _ _ _ _ _s   %A, ,	A87A8