
    nj7                     v   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	rSSK
JrJ
r
  SSKrSSKrSSKrSSKr\R                   " \5      R%                  5       R&                  r\R                   " \R*                  R-                  S\S-  S-  5      5      rS rS rS	 rS
 rS rS rS r\S:X  a  \" 5         gg)u  Утренний пуш по здоровью. Чистая арифметика, без Claude.

python3 digest.py --dry-run    печать в консоль, ничего не отправляя
python3 digest.py              отправка в @natasha_health_bot
python3 digest.py --date 2026-08-01   прогон на конкретную дату
python3 digest.py --when-ready        режим таймера: слать, когда доехали данные
    N)datedatetimeHEALTH_STATEstatez	sent.jsonc                      [        [        S-  SS9 n [        R                  " U 5      nS S S 5        [        R
                  R                  SWS   5      US'   U$ ! , (       d  f       N6= f)Nzconfig.jsonutf-8encodingHEALTH_VAULTvault)openROOTjsonloadosenvironget)fhconfigs     "/home/rasp/health-digest/digest.pyload_configr       sQ    	d]"W	52 
6 jjnn^VG_EF7OM	 
6	5s   A
A'c                  X   0 n [         S-  nUR                  5       (       d  U $ UR                  SS9R                  5        Hf  nUR	                  S5      u  p4nUR                  5       (       d  M.  UR                  S5      (       a  MF  UR                  5       XR                  5       '   Mh     U $ )Nz.envr   r	   =#)r   exists	read_text
splitlines	partitionstrip
startswith)envpathlinekey_values         r   load_envr'   (   s    
C&=D;;==
0;;=s+99;;s~~c22${{}C		 > J    c                     X-  n UR                  SS9$ ! [         a    [        SU 3[        R                  S9   gf = f)Nr   r	   u   не читается: )file )r   OSErrorprintsysstderr)r   relativer"   s      r   readr1   4   sH    D~~w~// 'v.SZZ@s    %==c           	         [         R                  " [        R                  R	                  U S   5      5      nU S   n[
        R                  " [        XS   5      5      n[
        R                  " [
        R                  " [        XS   5      5      U5      nU[
        R                  " [        XS   5      5      [
        R                  " [        XS   5      5      U4$ )up   Читает все четыре файла волта → (дни, тренировки, еда, замеры).r   filesbody_compositiondaily_seriesworkouts
food_diary)pathlibPathr   r"   
expanduserparsersparse_body_compositionr1   merge_weightsparse_daily_seriesparse_workoutsparse_food_diary)r   r   r3   measurementsdayss        r   load_sourcesrC   =   s    LL++F7O<=E7OE11$uDV>W2XYL  ""4^/D#EFD
 	tE+<=>  e<-@!AB	 r(   c                 2   [         R                  " [        R                  R	                  U S   5      5      n[        U 5      u  p4pV[        R                  " UUUU[        R                  " U S   U5      [        R                  " [        X S   S   5      5      S9$ )Nr   stagesr3   r5   )todayrB   r6   foodstage	freshness)r8   r9   r   r"   r:   rC   messagebuild_dailyweek	stage_forr;   parse_freshnessr1   )r   rF   r   rB   r6   rG   r%   s          r   buildrO   P   s    LL++F7O<=E*62DDnnVH-u5))$uWon6U*VW r(   c                    UR                  S5      nUR                  S5      nU(       a  U(       d  [        S5      e[        R                  R	                  X0S.5      R                  5       nSU S3n [        R                  R                  [        R                  R                  XTS9SS	9 n[        R                  " U5      nS S S 5        WR                  S5      (       d  [        SU 35      eg ! , (       d  f       N3= f! [        R                  R                   aW  n[        R                  " U5      R                  S
S5      n	SU	;   a  [        S5      e[        SUR                   SU	 35      eS nAff = f)NHEALTH_BOT_TOKENTELEGRAM_OWNER_USER_IDu=   нет HEALTH_BOT_TOKEN или TELEGRAM_OWNER_USER_ID в .env)chat_idtextzhttps://api.telegram.org/botz/sendMessage)data   )timeoutdescriptionr+   zchat not foundu{   Telegram: chat not found — нажми /start у @natasha_health_bot, бот не может написать первымu   Telegram отказал (z): oku   Telegram отказал: )r   
SystemExiturllibparse	urlencodeencoderequesturlopenRequestr   r   error	HTTPErrorcode)
rT   r!   tokenrS   payloadurlresponsebodyrb   rX   s
             r   sendrj   ^   sG   GG&'Egg./GXYYll$$%GHOOQG(|
<C
S^^##FNN$:$:3$:$MWY#Z^f99X&D [ 88D>>4TF;<<  [Z<<!! Sii&**="={*G  4UZZLK=QRRSs7   29D  +C/D  /
C=9D  =D   E5AE00E5c                     [         R                  " 5       n U R                  SSSS9  U R                  SSS9  U R                  SSS	S9  U R                  5       nUR                  (       a   [        R
                  " UR                  5      O[        R                  " 5       n[        5       nUR                  (       a  [        R                  " [        R                  R                  US
   5      5      n[        R                  " [!        XCS   S   5      5      n["        R$                  " UU[&        R(                  " 5       ["        R*                  " [,        5      S9u  pg[/        [&        R(                  " 5       S SU 35        U(       d  g [1        X25      nUR2                  (       a  [/        U5        g [5        U[7        5       5        UR                  (       a  ["        R8                  " [,        U5        g g )Nz	--dry-run
store_trueu$   печать без отправки)actionhelpz--dateu"   дата прогона YYYY-MM-DD)rn   z--when-readyum   режим таймера: слать, когда доехали данные, и один раз в деньr   r3   r5   )rI   rF   now	last_sentz%Y-%m-%d %H:%M )argparseArgumentParseradd_argument
parse_argsr   fromisoformatrF   r   
when_readyr8   r9   r   r"   r:   r;   rN   r1   scheduledecider   ro   load_last_sent
STATE_PATHr-   rO   dry_runrj   r'   save_last_sent)	parserargsrF   r   r   rI   should_sendreasonrT   s	            r   mainr   u   sj   $$&F
L?ef
'KL
| M  ND-1YYDtyy)DJJLE]FRWW//w@A++Dw8W,XY	&oo--j9	
 	/q9:D||dxz
E2 r(   __main__) __doc__rr   r   r   r8   r.   urllib.errorr[   urllib.parseurllib.requestr   r   rJ   r;   rx   rL   r9   __file__resolveparentr   r   r   r{   r   r'   r1   rC   rO   rj   r   __name__ r(   r   <module>r      s      	  
    #    ||H%%'..\\JJNN>4'>K#?@

	&=.3D zF r(   