
    ]Sj8;                       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Z
ddlmc mZ ddlmZmZmZ ddlmZ ddlmZ  ed          Z ej                    Zedz  Zed	z  Zd
Zedz  ZddddZddddZd8dZ d9dZ!d:d;dZ"d<d=d$Z#d% Z$d>d(Z%d?d@d+Z&d, Z'dAd.Z(d/ Z)d0 Z*dBdCd3Z+d4 Z,d5 Z-d6 Z.e/d7k    r e.             dS dS )DzData collector for the JARVIS morning briefing.

The cron job runs this script first and injects stdout into an LLM prompt.
The script intentionally returns compact JSON context, not polished prose.
    )annotationsN)datetime	timedeltatimezone)Path)ZoneInfoEurope/Zurichz(.hermes/assets/Gesundheit/health_data.dbz.todoist_tokenzfriday.uplink@gmail.comz.hermes/secrets/gog_keyring.envzWindisch AGg46<G@g oo @namelatlonStein AGghsG@g o@returnr   c                 4    t          j        t                    S )N)r   nowTZ     //home/agent/.hermes/scripts/morning_briefing.py	now_localr       s    <r   strc                 l   t           j                            dd                                          } | r| S t                                          st          dt                     t                                          j        dz  rt          dt                     t          	                    d          
                                D ]}|                                }|r|                    d          r.|                    d	          r|d
d                                          }|                    d          \  }}}|rX|                                dk    r@|                                                    d                              d          }|r|c S t          dt                     )NGOG_KEYRING_PASSWORD z-Missing gog keyring secret environment file: ?   z/Unsafe permissions on gog keyring secret file: utf-8)encoding#zexport    ="'z)GOG_KEYRING_PASSWORD missing or empty in )osenvirongetstripGOG_SECRET_ENVis_fileRuntimeErrorstatst_mode	read_text
splitlines
startswith	partition)valueraw_linelinekeysep	raw_valuesecrets          r   load_gog_keyring_passwordr7   $   s   JNN1266<<>>E !!## ][>[[\\\$u, _]^]]^^^",,g,>>IIKK 
 
~~ 	ts++ 	??9%% 	$8>>##D"nnS11S) 	399;;"888__&&,,S1177<<F 
S>SS
T
TTr      urltimeoutintheadersdict | Nonec                8   t           j                            | |pddi          }t           j                            ||          5 }t	          j        |                                                    dd                    cd d d            S # 1 swxY w Y   d S )N
User-AgentJARVIS-MorningBriefing/1.0r<   r:   r   replace)errors)urllibrequestRequesturlopenjsonloadsreaddecode)r9   r:   r<   reqrs        r   	http_jsonrO   :   s    
.
 
 g.e,Hd9e
 
f
fC			W		5	5 Fz!&&((//')/DDEEF F F F F F F F F F F F F F F F F Fs   ;BBB-   cmd	list[str]envtuple[int, str, str]c                    	 t          j        | dd||          }|j        |j        |j        fS # t
          $ r}ddt          |          fcY d }~S d }~ww xY w)NT)textcapture_outputr:   rS   i  r   )
subprocessrun
returncodestdoutstderr	Exceptionr   )rQ   r:   rS   pes        r   rY   rY   @   su    N3T$UXYYY|QXqx//   BAs   ,/ 
AA
AAc                    t           j                            t          d         t          d         dddddd          } 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'd(d)d*d+d,d-d.}	 t	          d/| z             }|                    d0i           }|                    d1i           }|                    d2i           }|                    d3g           }g }g }t                                                                                      }	t          |          D ]9\  }
}t          |                              |	          s)t          t          |          d4d5                   }t          |          d4d6         |                    d7          pd g|
         |                    d8          pd g|
         |                    d9          pd g|
         |                    |                    d:          pd g|
         d;          d<}d=|cxk    rd>k    rn n|                    |           d=|cxk    rd?k    rn $|                    |           ;t          d@ |D             pd	g          }t          dA         |                    |                    d:          dB          |                    dC          |                    dD          |                    dE          |                    d9          |                    dF          pd gd	         |                    dG          pd gd	         |                    dH          pd gd	         |||                    dI          pd;gd	         dJd          |                    dK          pd;gd	         dJd          dLS # t          $ r}dMt          |          icY d }~S d }~ww xY w)NNr   r   zbtemperature_2m,relative_humidity_2m,apparent_temperature,weather_code,wind_speed_10m,precipitationzRtemperature_2m,precipitation_probability,precipitation,weather_code,wind_speed_10mzYtemperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max,sunrise,sunsetr	      )latitude	longitudecurrenthourlydailyr   forecast_daysr   sonnigzmeist sonnig   u   teils bewölkt   u   bewölktrP   Nebel0   	Reifnebel3   zleichter Nieselregen5   Nieselregen7   zstarker Nieselregen=   zleichter Regenr   RegenA   zstarker RegenG   zleichter SchneeI   SchneeK   zstarker SchneeP   zleichte SchauerQ   Schauerzstarke SchauerGewitterzGewitter/Hagelzstarkes Gewitter/Hagel)R   _   `   c   z'https://api.open-meteo.com/v1/forecast?rd   rf   re   time         precipitation_probabilityprecipitationwind_speed_10mweather_coder   )r   precip_prob	precip_mmwind	condition   	      c                <    g | ]}|                     d           pdS )r   r   r%   ).0xs     r   
<listcomp>zweather.<locals>.<listcomp>r   s)    DDD1QUU=116QDDDr   r   	unbekannttemperature_2mapparent_temperaturerelative_humidity_2mtemperature_2m_mintemperature_2m_maxprecipitation_sumsunrisesunset)locationr   temperature_cfeels_like_chumidity_pctwind_kmhtoday_min_ctoday_max_cprecip_sum_mmmax_precip_probability_pctcommute_windowr   r   error)rE   parse	urlencodeWINDISCHrO   r%   r   date	isoformat	enumerater   r.   r;   appendmaxr]   )paramscodesdcurrf   re   timescommutedaytodayithourrowmax_rain_probr_   s                   r   weatherr   H   sy   \##UOe_wfl#% %  F	8()+;=>

G&(*@BDm 	! $&'7 :<W GI/ 		  "8	 .01A	 DFGX	
 	I
 ,AQWo  E*!?&HIIeeIr""gr""x$$

62&&  "",,..e$$ 	  	 DAqq66$$U++ s1vvbe}%%DAr"u &

+F G G QD6STU$jj99CdVQG$455?$C"YY

>(B(B(Ltfa'PRTUU C D~~~~A~~~~~s###DB

3DDDDDKLL (377>#:#:KHH WW%566GG$:;;GG$:;; 011!II&:;;EvqI!II&:;;EvqI#ii(;<<FJ*7%		),,4a8=yy**2rdA6rss;
 
 	
  ! ! !Q       !s   ;L/N+ +
O5OOOr   
str | Nonec                    | sd S |                      d          r| d d         dz   } 	 t          j        |                               t                    S # t
          $ r Y d S w xY w)NZz+00:00)endswithr   fromisoformat
astimezoner   r]   r   s    r   parse_dtr      sy     tzz# crcFX%a((33B777   tts   +A 
A"!A"ri   daysc                n   t           j                                        }	 t                      |d<   n*# t          $ r}t          |          g g dcY d }~S d }~ww xY wt          ddt          ddddt          |           d	d
ddgd|          \  }}}|dk    s|                                s|                                pd| g g dS 	 t          j
        |          }n # t          $ r}d| g g dcY d }~S d }~ww xY w|                    dt          |t                    r|ng           }t                                                      }	|	t#          d          z   }
g g d}|D ]-}|                    d          pi                     d          p)|                    d          pi                     d          }|                    d          pi                     d          p)|                    d          pi                     d          }d|                    d          pi v}|st%          |          nd }|r=	 t'          j        |                                          }n# t          $ r |	}Y nw xY wd}n>|r|                                n|	}|r|                    d          nt          |          }||                    dd          |                    dd          |                    d          pdd d          ||r|                                n|t%          |          r!t%          |                                          n|d!}||	k    r|d"                             |           ||
k    r|d#                             |           /|D ]}||                             d$ %            |S )&Nr   )r   r   tomorrowgogz-acalendareventsz--allz--daysz--max30z--jsonz
--no-input<   )r:   rS   r   z	gog exit zcalendar json parse: ra   r   )r   r   startdateTimer   endu
   ganztägigz%H:%Msummaryz(ohne Titel)r   r   descriptioni,  )r   r   r   r   all_day	start_isoend_isor   r   c                .    |                      dd          S )Nr   99:99r   r   s    r   <lambda>z!calendar_events.<locals>.<lambda>   s    QUU67%;%; r   r3   )r#   r$   copyr7   r)   r   rY   GOG_ACCOUNTr&   rI   rJ   r]   r%   
isinstancelistr   r   r   r   r   r   strftimer   r   sort)r   rS   excrcouterrrawr_   evsr   r   resultev	start_rawend_rawr   r   r   time_sitemks                        r   calendar_eventsr      s   
*//

C@&?&A&A"## @ @ @SBB????????@t[*h3t99V]_cemo{s  LBS 
Qwwciikkw8(8B(8(82SUVVVSjoo S S S444rrRRRRRRRRS
''(:c4#8#8@CCb
A
ACKKEya((((Hr**F , ,VVG__*//
;;bw@USU?Z?Z[a?b?b	66%==&B++J77\BFF5MM<OR;T;TU[;\;\RVVG__%:;+2<### 	J*955::<<   !FF %0

5A05IU^^G,,,3y>>Fvvi88z2..FF=117R#>.3B***8@8I8IVx((22444w
 
 ::7O""4(((((]]:%%d+++ = =q	;;<<<<MsJ   2 
AAAAC 
C:'C5/C:5C:>&I%%I43I4c                    t                                           sddiS t                                                                           } t          j                            ddd|  i          }	 t          j                            |d          5 }t          j	        |
                                                                          }d d d            n# 1 swxY w Y   n(# t          $ r}dt          |          icY d }~S d }~ww xY w|                    d	t          |t                     r|ng           }t#                                                      }|t'          d
          z   }g g g g g d}|D ]}	|	                    d          r|	                    d          pi                     d          }
|	                    dd          |	                    d          |
|	                    d          d}|
r	 t)          j        |
d d                                                   }n# t          $ r d }Y nw xY w|r"||k     r|d                             |           ||k    r|d                             |           ||k    r|d                             |           2|r=||cxk     r|t'          d          z   k    rn V|d                             |           s|d                             |           |D ]8}||                             d            ||         d |dv rdnd          ||<   9t1          d! |D                       |d"<   |S )#Nr   zTodoist token fehltz$https://api.todoist.com/api/v1/tasksAuthorizationzBearer rA      rB   resultsra   r   )overduer   r   next_7_days
no_due_topcheckedduer   contentr   priority
project_id)r   r   r   r   
   r   r   r   r   r   r   c                ^    |                      d          pd|                      d          pdfS )Nr   9999r   r   r   r   s    r   r   ztodoist.<locals>.<lambda>   s,    quuU||'=vquuZ?P?P?UTU&V r   r   )r   r         c                <    g | ]}|                     d           |S )r   r   )r   r   s     r   r   ztodoist.<locals>.<listcomp>   s)     J J Jqy9I9I J J J Jr   
total_open)TODOIST_TOKENexistsr,   r&   rE   rF   rG   rH   rI   rJ   rK   rL   r]   r   r%   r   r   r   r   r   r   r   r   r   len)tokenrM   rN   r   r_   tasksr   r   bucketsr   r   r   ddr   s                 r   todoistr     s   !! 0.//##%%++--E
.
 
 !GRactmrctctQu
 
v
vC!^##C#44 	.
16688??,,--A	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. ! ! !Q       !EE)*Q"5"5=QQ2>>EKKEya((((Hrr"\^__G / /55 	uuU||!r&&v..55B//QUU:=N=NWZjkjojop|j}j}~~ 	/+CH55::<<    4b5jj	"))$////u ''----x
#**40000 4????eiQ.?.?.?&??????&--d333L!((.... H H
VVWWWQZ Fa+?&?&?Q FG

 J JE J J JKKGLNsT   0!C" 9C
C" CC" CC" "
D,D<DD;.H**H98H9placec                @   t           j                            | dddd          }	 t          d|z   d          }|rQ|d                             d	          t          |d         d
                   t          |d         d                   dS n# t          $ r Y nw xY wd S )NrI   ra   ch)qformatlimitcountrycodesz+https://nominatim.openstreetmap.org/search?   rB   r   display_namer   r   r
   )rE   r   r   rO   r%   floatr]   )r  r  arrs      r   geocoder     s    UfqZ^__``AEISUVVV 	rFJJ~66uSVE]?S?S\abefgbhinbo\p\pqqq	r   4s   A&B 
BBc           	        	 d| d          d| d          d|d          d|d          d	}t          |d          }|                    d	          pi gd
         }t          |                    dd
          dz  d          t          |                    dd
          dz            dS # t          $ r}dt	          |          icY d }~S d }~ww xY w)Nz1https://router.project-osrm.org/route/v1/driving/r   ,r   ;z.?overview=false&alternatives=false&steps=falser8   rB   routesr   distancei  ra   durationr   )distance_kmduration_min_no_trafficr   )rO   r%   roundr]   r   )origindestr9   r   router_   s         r   
osrm_router%     sD   ! l&-  l  lRXY^R_  l  lbfglbm  l  lptuzp{  l  l  lc2&&&x(RD!,$UYYz1%=%=%DaHHejkpktktu  BC  lD  lD  GI  lI  fJ  fJ  K  K  	K ! ! !Q       !s   B#B& &
C0C CCc                   |                      dg           D ]}|                     d          pd                                |                     d          pd                                sWg d}t          fd|D                       rx|                     dd          d	k    r0t	                    }|rd
|                     d           |d<   |c S t          t                    }d|d<   |S )Nr   r   r   r   )
homeofficeteamszoomonlinetelefonwindischc              3  P   K   | ] }|d z   z                                    v V  !dS ) N)lower)r   r   locr   s     r   	<genexpr>z%choose_destination.<locals>.<genexpr>
  s=      ??aqS3Y(//111??????r   r   r   z12:00zerster externer Termin: reasonzStandard Arbeitsweg)r%   r&   r/  anyr  dictSTEIN_AG)r   r   badgr   r0  r   s        @@r   choose_destinationr8    s   jj"%%  vvj!!'R..0066)$$*1133 	NNN?????3????? 	66&'""g--A L	9J9JLL(XA'AhKHr      	max_itemsc                   	 t           j                            | ddi          }t           j                            |d          5 }|                                }d d d            n# 1 swxY w Y   t          j        |          }g }|                    d          d |         D ]}|                    d          pd	                                }|                    d	          pd	                                }	|                    d
          pd	                                }
|r-|
                    t          j        dd|          |	|
d           |S # t          $ r g cY S w xY w)Nr?   r@   rA   r8   rB   z.//itemtitler   linkpubDatez\s+r.  )r<  r=  	published)rE   rF   rG   rH   rK   ET
fromstringfindallfindtextr&   r   resubr]   )r9   r:  rM   rN   xmlrootitemsr   r<  r=  pubs              r   	rss_itemsrJ    s   n$$S<A]2^$__^##C#44 	&&((C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	}S!!LL++JYJ7 	d 	dD]]7++1r88::EMM&))/R6688D==++1r88::C drvfc5'A'A4^abbccc   			s7   AE A'E 'A++E .A+/C$E E#"E#c            	         ddd}  | dd          t          dd	          p | d
d          t          dd	          p | dd           | dd           | dd           | dd	          dS )Nr9  queryr   nr;   c                h    t           j                            |           }t          d| d|          S )Nz%https://news.google.com/rss/search?q=z&hl=de-CH&gl=CH&ceid=CH:de)rE   r   
quote_plusrJ  )rL  rM  r  s      r   google_newsznews.<locals>.google_news)  s4    L##E**^^^^`abbbr   zBrugg Windisch Aargau heutez$https://www.srf.ch/news/bnf/rss/1646r  zSchweiz Nachrichten heutez$https://www.srf.ch/news/bnf/rss/1003zWelt Nachrichten heuteu%   Künstliche Intelligenz AI News heutez"Bitcoin Ethereum Krypto News heutez)Stau Aargau A1 A3 Brugg Baden Frick heute)local_brugg_windischswitzerlandworldaicryptotraffic_incidentsr9  )rL  r   rM  r;   )rJ  )rP  s    r   newsrX  (  s    c c c c c !,,I1 M M !GKKz{{[vxyOzOzA1EEqUmopIqIqkA1EE+BAFF([)TVWXX  r   c                    g d d} t                                           s| S 	 t          j        t                     }t          j        |_        t                                                      t          d          z
  	                                }	 d |
                    d|f          D             | d<   n# t          $ r Y nw xY w	 |
                    d                                          d         | d	<   n# t          $ r Y nw xY w|                                 n)# t          $ r}t          |          | d
<   Y d }~nd }~ww xY w| S )N)recent_symptomsopen_lab_reviewsr   r   c                ,    g | ]}t          |          S r   )r4  )r   rN   s     r   r   z"health_context.<locals>.<listcomp>?  s*     & & &!d1gg & & &r   zSELECT datum, symptom, koerperbereich, intensitaet, notizen FROM symptom_log WHERE datum>=? ORDER BY datum DESC, id DESC LIMIT 6rZ  zUSELECT count(*) FROM laborwerte_staging WHERE status IN ('zur_pruefung','extrahiert')r   r[  r   )	HEALTH_DBr  sqlite3connectRowrow_factoryr   r   r   r   executer]   fetchonecloser   )r   consincer_   s       r   health_contextrg  6  s    d
;
;C 
oi((!+!!##iQ&7&7&77BBDD	& &s{{ S  V[  U]8 8 & & &C!""  	 	 	D		&)kk  3J  'K  'K  'T  'T  'V  'V  WX  'YC"## 	 	 	D			   1vvGJs`   A-D $B5 4D 5
C?D CD 0C7 6D 7
DD DD 
E&D==Ec                    t                      } t          d          }t          |          }t          t          |          }|                                 |                                                                 g d|                                          t                      |t                      t          ||ddt          j                            t          d                   z   dz   t          j                            |                    d          p|                    d          pd	          z   d
t                      t                      g dd
}t!          t#          j        |dd                     d S )Nri   r   )MontagDienstagMittwoch
DonnerstagFreitagSamstagSonntagzcOSRM-Fahrzeit ohne Live-Verkehr; Stau-/Unfallhinweise werden aus News/Traffic-Meldungen abgeleitet.z https://www.google.com/maps/dir/r   /r2  r   )r"  destinationr$  notegoogle_maps_url)uC   Strukturiere als kompaktes deutsches Morgen-Briefing für Telegram.u   Berücksichtige Termine, Todoist-Pendenzen, Gesprächs-Follow-ups, Chancen/Risiken, Wetter, Arbeitsweg/Verkehr, News, KI/Crypto und proaktive Tipps.zHWenn Datenquelle fehlt: kurz transparent markieren, nicht halluzinieren.)
generated_atr   
weekday_deweather_windischr   r  r   healthrX  briefing_requirementsF)ensure_asciiindent)r   r   r8  r%  r   r   r   weekdayr   r  rE   r   rO  r%   rg  rX  printrI   dumps)t0calr#  r$  payloads        r   mainr  N  s   	B
q
!
!
!Cc""Dx&&E		##%%ggghjhrhrhthtu#II99yAFLD[D[\dek\lDmDmmpssv|  wC  wN  wN  OS  OW  OW  X^  O_  O_  OC  cg  ck  ck  lt  cu  cu  OC  yC  wD  wD   D
 
 !"""
 "
 "
! G, 
$*W5
;
;
;<<<<<r   __main__)r   r   )r   r   )r8   N)r9   r   r:   r;   r<   r=   )rP   N)rQ   rR   r:   r;   rS   r=   r   rT   )r   r   )ri   )r   r;   )r  r   rW  )r9   r   r:  r;   )0__doc__
__future__r   rI   r#   rD  r^  rX   sysurllib.parserE   urllib.requestxml.etree.ElementTreeetreeElementTreer@  r   r   r   pathlibr   zoneinfor   r   homeHOMEr]  r  r   r'   r   r5  r   r7   rO   rY   r   r   r   r  r  r%  r8  rJ  rX  rg  r  __name__r   r   r   <module>r     s~   
 # " " " " "  				 				      



         " " " " " " " " " 2 2 2 2 2 2 2 2 2 2            Xoty{{==	'''99!'&AAwv>>   U U U U,F F F F F    ;! ;! ;!|   0 0 0 0 0f& & &R   ! ! !  (    $    0= = =< zDFFFFF r   