
    Jiy                         d dl Z d dlZd dlmZmZ d dlmZmZmZ d dlZd dl	m
Z
 d dlZd dlmZ  e
         G d d      Zy)    N)datetime	timedelta)ListDictOptional)load_dotenv)urlparsec            
       2   e Zd Zd Zdee   fdZdedededee   fdZ	dded	edefd
Z
d	ededefdZd	edee   fdZd	edee   fdZd	edee   fdZd	edee   fdZdededee   fdZddedededee   fdZd	ededefdZd	ededefdZdefdZy)ActivityWatchClientc                 b    t        j                  dd      | _        | j                   d| _        y )NACTIVITYWATCH_HOSTzhttp://localhost:5600z/api/0)osgetenvbase_urlapi_url)selfs    =E:\timesheet\timesheet_new\backend\my_activitywatch_client.py__init__zActivityWatchClient.__init__   s(    		"68OP--/    returnc                    	 t        j                  | j                   dd      }|j                          |j	                         S # t         j
                  $ r}t        d|        	 t        j                  | j                   dd      }|j                          |j	                         cY d}~S # t         j
                  $ r}t        d|        i cY d}~cY d}~S d}~ww xY wd}~ww xY w)z,Get all available buckets from ActivityWatch	/buckets/T)allow_redirectszError fetching buckets: /bucketsNz!Error with alternative endpoint: )requestsgetr   raise_for_statusjsonRequestExceptionprint)r   responseee2s       r   get_bucketszActivityWatchClient.get_buckets   s    	||t||nI$>PTUH%%'==?"(( 		,QC01#<<4<<.(ASWX))+}}&,, 9">?				sO   AA C+C&(AB1+C+1C#CC#C&C+C##C&&C+	bucket_idstartendc                 B   	 |j                  d      }|j                  d      }||dd}t        j                  | j                   d| d|d      }|j	                          |j                         S # t        j                  $ r}t        d| d	|        	 t        j                  | j                   d| d
d      }|j	                          |j                         cY d}~S # t        j                  $ r}	t        d|	        g cY d}	~	cY d}~S d}	~	ww xY wd}~ww xY w)z!Get events from a specific bucketz%Y-%m-%dT%H:%M:%Si  )r&   r'   limitr   z/eventsT)paramsr   z"Error fetching events from bucket : z/events/Nz(Error with alternative events endpoint: )strftimer   r   r   r   r   r   r    )
r   r%   r&   r'   	start_strend_strr*   r!   r"   r#   s
             r   
get_eventszActivityWatchClient.get_events#   s   	':;Ill#67G #F  ||t||nIi[$PY_quvH%%'==?"(( 		6ykA3GH#<<4<<.	)H(U^dvz{))+}}&,, @EF				sO   A/A2 2DDAC$D$D7DDDDDDDapp_namewindow_titlec                    |j                         |j                         }t        fddD              ryt        fddD              ryt        fddD              ry	t        fd
dD              ryt        fddD              ryt        fddD              s%j                  d      rt        fddD              ryt        fddD              ryy)z5Categorize application based on name and window titlec              3   &   K   | ]  }|v  
 y wN .0browserapp_name_lowers     r   	<genexpr>z=ActivityWatchClient.categorize_application.<locals>.<genexpr>E        r8qWw.(8q   chromefirefoxsafariedgeoperabraver8   c              3   &   K   | ]  }|v  
 y wr4   r5   r7   ider9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>I   s"       f  1esn$  1er<   )vscodevisual studiopycharmintellijsublimeatomvimemacs	notepad++cursorcodedevelopmentc              3   &   K   | ]  }|v  
 y wr4   r5   r7   dbr9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>M   s     |.{r^#.{r<   datagrippgadminmysqldbeavernavicat	sqlserveroracledatabasec              3   &   K   | ]  }|v  
 y wr4   r5   )r7   prodr9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>Q   s"       d  3c$t~%  3cr<   )wordexcel
powerpointoutlookteamsslackdiscordzoomnotionobsidianpostmanproductivityc              3   &   K   | ]  }|v  
 y wr4   r5   r7   mediar9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>U   s     w4v5u&4vr<   )spotifyyoutubevlcmedia playernetflixtwitchentertainmentc              3   &   K   | ]  }|v  
 y wr4   r5   )r7   systemr9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>Y   s"       ]  8\V.(  8\r<   )explorerfinderterminalcmd
powershellztask managerlockdwmwinlogoncsrsslsassservicessvchost
searchhostnotepad.exec              3   &   K   | ]  }|v  
 y wr4   r5   )r7   sys_exer9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>Z   s%       7b  aaU\w.7P  aar<   )r~   ry   r   r   r   r   rx   c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   devr9   s     r   r:   z=ActivityWatchClient.categorize_application.<locals>.<genexpr>^   s     c0bsn$0br<   )gitnpmnodepythonjavadotnetother)loweranyendswith)r   r0   r1   window_title_lowerr9   s       @r   categorize_applicationz*ActivityWatchClient.categorize_application?   s    !))//1 r8qrr   f  1e  f  f  |.{||   d  3c  d  d! w4vww"   ]  8\  ]  ]&&v.3  7b  aa  7b  4b c0bcc r   c                 &  	 dddddd}|j                         	|j                         }t        	fddD              rh| j                  |      |d<   d|v rF|j                  d      d   j	                         }d| |d	<   |d   r|d	xx   d
|d    dz  cc<   nd| |d	<   nt        	fddD              r\| j                  |      |d<   |d   r9d|d   v r%|d   j                  dd      \  }}d| d| |d	<   nd|d    |d	<   nvd| |d	<   nlt        	fddD              rU| j                  |      |d<   |d   rd|d    |d	<   n2|j                  dd      j                  dd      }d| d| |d	<   n| j                  ||      dk(  s	j                  d      rb||d<   |j                  d      r|j                  dd      n|}|r-||k7  r(t        |j	                               dkD  rd| d| |d	<   nd| |d	<   n{t        	fddD              r.| j                  |      |d<   |d   rd |d    |d	<   nBd | |d	<   n9t        	fd!d"D              r	d#| |d	<   nt        	fd$d%D              rd&| |d	<   |d	   s
| d'| |d	<   |S )(z;Extract detailed information from window title and app nameN)url	file_pathdatabase_connectionspecific_processdetailed_activityc              3   &   K   | ]  }|v  
 y wr4   r5   r6   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>q   r;   r<   r=   r    - r   z
Browsing: r   z ()c              3   &   K   | ]  }|v  
 y wr4   r5   rE   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>}   s"       `  3_3&  3_r<   )
rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r   /   zCoding: z in c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   db_toolr9   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>   s"       I  ;HwN*  ;Hr<   rV   r   zDatabase: Connected to r    64z
Database: rx   r   zSystem: c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   officer9   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>   s     c8bf>)8br<   )ra   rb   rc   rd   zOffice: c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   commr9   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>   s     c4bD'4br<   )re   rf   rg   rh   skypezCommunication: c              3   &   K   | ]  }|v  
 y wr4   r5   rn   s     r   r:   z<ActivityWatchClient.extract_detailed_info.<locals>.<genexpr>   s     o6nU.(6nr<   )rp   rq   rr   rs   rt   zMedia: r+   )r   r   extract_url_from_browser_titlesplitstripextract_file_pathrsplitextract_database_inforeplacer   r   lenextract_office_document)
r   r1   r0   infor   
page_titleprojectfilenameclean_app_namer9   s
            @r   extract_detailed_infoz)ActivityWatchClient.extract_detailed_infoc   sb    #' $!%
 "))//1 r8qrr==lKDK$)//6q9??A
.8,E();,-2d5k]!1DD-.8,G()   `  3_  `  ` $ 6 6| DDK ${++(,[(9(@(@a(H%GX2:8*D	0RD,-2:4;L:M0ND,-.6|n,E()   I  ;H  I  I*.*D*D\*RD&')*.EdK`FaEb,c() "*!1!1&"!=!E!EdB!O.88HL>,Z() ))(LAXM%%f-'/D#$=E=N=Nv=VX--fb9\dN 8SASASAU=VYZ=Z.6~6Fc,,X().6~6F,G() c8bcc $ < <\ JDK .6tK7H6I,J().6|n,E() c4bcc*9,(HD$% o6noo*1,(@D$% '(+3*B|n(ED$%r   c                    g d}|D ]R  }t        j                  ||t         j                        }|s,d|j                         v sd|j                         v r[|j                         }|j	                  d      sd|z   }	 t        |      }|j                   d|j                   |j                   c S |j                  d      j                         ddd	d
ddddddd
}j                         }|j                         D ]  \  }	}|	|v s|c c S  t              dk  st        fddD              r/dj                         j                  dd       dc S  dg}
|
D ]`  }t        j                  ||      }|D ]C  }t!        |t"              rdj%                  |      n|t        fddD              r<d c c S  b y#  |cY c S xY w)z1Enhanced URL extraction from browser window title)zN^(.+?)\s*-\s*(Google Chrome|Mozilla Firefox|Microsoft Edge|Safari|Opera|Brave)zhttps?://[^\s\)]+zwww\.[^\s\)]+httpwwwzhttps://z://r   zhttps://claude.aizhttps://chat.openai.comzhttps://github.comzhttps://stackoverflow.comzhttps://google.comzhttps://youtube.comzhttps://gmail.comzhttps://linkedin.comzhttps://twitter.comzhttps://facebook.com)
claudechatgptgithubstackoverflowgooglerq   gmaillinkedintwitterfacebook2   c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   charr   s     r   r:   zEActivityWatchClient.extract_url_from_browser_title.<locals>.<genexpr>   s$       8G  XFt
8J  XFr<   )	r   \:*?"<>|zhttps://www. r   z.comz([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}c              3   B   K   | ]  }|j                         v   y wr4   r   )r7   ra   domains     r   r:   zEActivityWatchClient.extract_url_from_browser_title.<locals>.<genexpr>   s(       F  ?Ed46<<>1  ?E   )documentuntitlednewfiler   r>   r?   N)research
IGNORECASEgroup
startswithr	   schemenetlocpathr   r   itemsr   r   r   findall
isinstancetuplejoin)r   r1   browser_patternspatternmatchr   parsedtitle_to_url
page_lowerkeydomain_patternsmatchesr   r   s               @@r   r   z2ActivityWatchClient.extract_url_from_browser_title   s   
 (GIIg|R]]CEU[[]*eu{{}.D++-C>>&1(3.#!)#"(--FMM?6;;-PP
 "'Q!5!5!7J #6#<"6)D"6#8!4$:#8$:$L ",!1!1!3J$0$6$6$8S*,#&J %9
 :+C  8G  XF  8G  5G!-j.>.>.@.H.Hb.Q-RRVWWM (T .
 'Gjj,7G eU+WWU^F"F   F  ?E  F  F%fX.. ! ' ]#"
s    1GGc                 $   g d}|D ]  }t        j                  ||t         j                        }|s,t        |j	                               dk\  r|j                  d      j                         }t        |j	                               dkD  r|j                  d      j                         nd}|j                         dv r|c S d|v r&t        |j                  d            dk(  r	| d| c S |c S |j                  d      j                         c S  y)	z'Extract file path from IDE window title)z&([A-Za-z]:\\[^|<>:*?"]+\.[a-zA-Z0-9]+)z(/[^|<>:*?"]+\.[a-zA-Z0-9]+)zF^([^-]+\.[a-zA-Z0-9]+)\s*-\s*([^-]+)\s*-\s*(Cursor|Code|Visual Studio)zI^([^-]+\.[a-zA-Z0-9]+)\s*-\s*(Cursor|Code|Visual Studio|PyCharm|IntelliJ)z<^([^-]+)\s*-\s*(Cursor|Code|Visual Studio|PyCharm|IntelliJ)$z^([^\\/:*?"<>|]+\.[a-zA-Z0-9]+)   r   r   )rP   rQ   rH   rI   rJ   .r   N)	r   r   r   r   groupsr   r   r   r   )r   r1   patternsr   r   
first_partsecond_parts          r   r   z%ActivityWatchClient.extract_file_path   s    
  GIIg|R]]CEu||~&!+!&Q!5!5!7J<?<ORS<S%++a."6"6"8Y[K #((*.hh))
*s:3C3CC3H/IQ/N"-a
|<<)) ;;q>//11#  & r   c                 n    g d}|D ],  }t        j                  ||      }|s|j                         c S  y)z@Extract database connection info from database tool window title)z
@([^@\s]+)z([a-zA-Z0-9_]+@[a-zA-Z0-9.-]+)z&([a-zA-Z0-9_]+)\s*-\s*([a-zA-Z0-9.-]+)N)r   r   r   )r   r1   db_patternsr   r   s        r   r   z)ActivityWatchClient.extract_database_info"  s9    
 #GIIg|4E{{}$ #
 r   c                     |}g d}|D ]  }||v s|j                  |d      } n |j                         r|j                         S dS )z3Extract document name from Office application title)z - Wordz - Excelz - PowerPointz - Microsoft Wordz - Microsoft Excelz - Microsoft PowerPointr   N)r   r   )r   r1   titleoffice_suffixessuffixs        r   r   z+ActivityWatchClient.extract_office_document2  sP      I%Ffb1 &
 !&u{{}747r   c                 |   | j                         }g }|j                         D ]  \  }}d|j                         v r| j                  |||      }|D ]  }|j	                  di       }	|j	                  dd      }
t        j                  |j	                  dd      j                  dd            }|	j	                  d	|	j	                  d
d            }|	j	                  dd      }|
dk  r| j                  ||      }| j                  ||      }|j                  |||d   |d   |d   |d   |d   ||
|d
         |S )z.Get processed activity data from ActivityWatchafkdatadurationr   	timestampr   Z+00:00appapplicationUnknownr      r   r   r   r   r   )
application_namer1   r   r   r   r   r   categoryr  r  )r$   r   r   r/   r   r   fromisoformatr   r   r   append)r   r&   r'   bucketsactivity_databucket_namebucket_infoeventseventr  r  r  r0   r1   r  detailed_infos                   r   get_activity_dataz%ActivityWatchClient.get_activity_data?  sW   ""$(/$K))++__[%=Fyy, 99Z3$22599["3M3U3UVY[c3de	88E488M9+MN#xx4 a<66xN !% : :< R$$(0$0(/!.{!;+89N+O(56H(I)67J)K ( (!*& #   )8J r   r)   c           
         	 t        d| d|        | j                         }g }|j                         D ]  \  }}d|j                         v rt        d|        | j	                  |||      }|D ]  }	|	j                  di       }
|	j                  dd      }t        j                  |	j                  dd	      j                  d
d            }|
j                  d|
j                  dd            }|
j                  dd	      }|dk  r| j                  ||      r|j                  |||||d         t        dt        |       d       i }|D ]  }	|	d   }|	d   }|	d   }|	d   }| d| }||vr-||| j                  ||      dd| j                  ||      |d||<   ||   dxx   |z  cc<   ||   dxx   dz  cc<   |||   d   kD  s{|||   d<    t        |j                         d d      }t        dt!        |t        |             d        |d!| S # t"        $ r.}t        d"|        dd!l}|j'                          g cY d!}~S d!}~ww xY w)#zVGet top window titles by duration from ActivityWatch - Direct API call for better datau!   🔍 Fetching window titles from z to r  u!   📊 Getting events from bucket: r  r  r   r  r   r  r  r  r  r	  r   r
  )r1   r  r  r  bucketu   📈 Found z total eventsr1   r  r   )r1   r  r  total_durationactivity_countproject_info	last_seenr  r  r   r  c                     | d   S )Nr  r5   )xs    r   <lambda>z;ActivityWatchClient.get_top_window_titles.<locals>.<lambda>  s
    a 01r   T)r   reverseu   🏆 Returning top z window titlesNu%   ❌ Error getting top window titles: )r    r$   r   r   r/   r   r   r  r   _is_non_work_activityr  r   r   extract_project_from_titlesortedvaluesmin	Exception	traceback	print_exc)r   r&   r'   r)   r  
all_eventsr  r  r  r  r  r  r  r0   r1   title_statsr   r   sorted_titlesr"   r'  s                        r   get_top_window_titlesz)ActivityWatchClient.get_top_window_titlesk  s   R	5eWDFG &&(GJ,3MMO([K--//9+GHeSA#E 99VR0D$yyQ7H ( 6 6uyyb7Q7Y7YZ]_g7h iI#xxtxxy/QRH#'88GR#8L  !|  11,I %%(4,4$,%."-' ! $ -<@ KJ0>? K#n- !34 ,!+.	q
+k)(-,4$($?$?%$P*+*+(,(G(Gx(X%.(K$ C !12h>2C !12a72 {3/<<4=K$[1/ $4 #""$1M 'E3}3E(F'G~VW %(( 	9!=>!I		s%   G	H AH 	I##IIIc                    |j                         t        fddD              rd}t        j                  |t        j                        }|r@|j                  d      j                         |j                  d      j                         ddS d}t        j                  |t        j                        }|r|j                  d      j                         d	ddS t        fd
dD              rdv r_j                  d      d   j                         }dv r4t        j                  d      }|r|j                  d      nd}d| |ddS t        j                  d      }	|	r|	j                  d      |ddS |dddS dv sdv r0t        j                  d      }
|
rd|
j                  d       dddS t        fddD              r0t        j                  d      }|rnd|j                  d       dddS t        fddD              rBt        j                  d       }|r*d!|j                  d       d"|j                  d       d#d#dS |j                  d$d%      t              d&kD  rd'd& d(z   d)dS d)dS )*z:Extract project information from window title and app namec              3   &   K   | ]  }|v  
 y wr4   r5   rE   s     r   r:   zAActivityWatchClient.extract_project_from_title.<locals>.<genexpr>  s     d0csn$0cr<   )rP   rG   rQ   rI   rJ   zE^(.+?)\s*-\s*(.+?)\s*-\s*(Cursor|Code|Visual Studio|PyCharm|IntelliJ)r   r   Development)project_name	file_nameproject_typez:^(.+?)\s*-\s*(Cursor|Code|Visual Studio|PyCharm|IntelliJ)$zProject Rootc              3   &   K   | ]  }|v  
 y wr4   r5   r6   s     r   r:   zAActivityWatchClient.extract_project_from_title.<locals>.<genexpr>  s     b:awN*:ar<   r>   r?   rA   r@   r   r   z
localhost:zlocalhost:(\d+)unknownzWeb Developmentz([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})zWeb Page	filezillaftpz1([a-zA-Z0-9.-]+\.[a-zA-Z]{2,}|\d+\.\d+\.\d+\.\d+)zFTP: zServer ConnectionzServer Managementc              3   B   K   | ]  }|j                         v   y wr4   r   )r7   panelr1   s     r   r:   zAActivityWatchClient.extract_project_from_title.<locals>.<genexpr>  s"     [<Z5,,,..<Zr   )cpanelpleskhostingz	Hosting: zControl Panelc              3   &   K   | ]  }|v  
 y wr4   r5   rT   s     r   r:   zAActivityWatchClient.extract_project_from_title.<locals>.<genexpr>  s     \0["~%0[r<   )rW   rX   rY   rZ   z!([a-zA-Z0-9_-]+)@([a-zA-Z0-9.-]+)zDB: @Databaser   r   r   Nz...Work)
r   r   r   r   r   r   r   r   r   r   )r   r1   r0   ide_patternr   simple_patternr   
port_matchport	url_matchserver_matchdomain_matchdb_matchr9   s    `           @r   r"  z.ActivityWatchClient.extract_project_from_title  s   !) d0cddbKIIk<GE$)KKN$8$8$:!&Q!5!5!7$1  [NIInlBMMJE$)KKN$8$8$:!/$1  b:abb$)//6q9??A
  </!#+=|!LJ2<:++A.)D*4TF(;%/(9  II&GV	(1(:%/(9  %/!+$5  N*e~.E99%Y[ghL&+L,>,>q,A+B$C!4$7  [<Z[[99%FUL&/0B0B10E/F$G!0$7  \0[\\yy!E|TH&*8>>!+<*=Qx~~a?P>Q$R!+$.  %,,VR869,6G"6Lcr*U2"
 	
R^"
 	
r   c                 X  	 |s|sy|rF|j                         dk(  s3|dv s/|j                         dk(  st        |j                               dk  ry|r|j                         nd	|r|j                         ndg d}g d}g d}|D ]  }|	v s|v s y |D ]  }|	v s|v s y |D ]  }|	v s|v s y g d}|D ]  }|	v s|v s y	 t        fd
dD              rJd	v s0d	v s,d	v s(d	v s$d	v s d	v sd	v sd	v st        	fddD              ry	t        	fddD              syy	)z@Check if activity is non-work related and should be filtered outTr   )r	  r5  r      )znew tabz
blank pager   loadingzplease waiterror404z	not foundzaccess denied	forbiddenreactr   r   yarnwebpackbabel)#rq   rt   rp   musicvideomoviesongrv   gamegamingru   stream	instagramr   r   tiktoksnapchatwhatsapptelegramreddit	pinterestzlinkedin personaldatingshoppingzamazon personalflipkartmyntranewscricketsports	bollywoodhindizdubbed moviezlatest movietrailer)zlock screenlockedlockappscreensaveridlezwindows default locklogonzlogin screenshutdownrestartz
sleep mode	hibernate)|rR   rQ   programmingrP   rG   rH   rI   rJ   rK   rL   rM   rN   rO   r   r   gitlab	bitbucketr   documentationapir^   sqlrY   
postgresqlmongodbredisserverr<  r:  r;  r6  sshr{   r|   r}   bashubuntulinuxawsazuregcpdocker
kubernetesnginxapachephpr   
javascriptrO  vueangularr   r   rP  rQ  rR  
typescripthtmlcsssassscss	bootstraptailwindfigma	photoshopillustratorcanvadesignuiuxr   clientworkbusinessadmin	dashboardr9  r   r   ai
automationscripttoolutilitytestingdebugrL  bugfixdeploybuildcompile	localhost	127.0.0.1r   staging
productionlivewaareefirsteconomygeraistanakikileadscrm
salesforceintegrationajaxform
validationemailmailinboxcontactinquirywebsiter   dnssslcertificatebackup	migrationupdateupgradeFc              3   &   K   | ]  }|v  
 y wr4   r5   )r7   r8   	app_lowers     r   r:   z<ActivityWatchClient._is_non_work_activity.<locals>.<genexpr>q  s     [3Zw)#3Zr<   r4  r  r  r   r  r  r9  r:  r;  c              3   &   K   | ]  }|v  
 y wr4   r5   )r7   r   title_lowers     r   r:   z<ActivityWatchClient._is_non_work_activity.<locals>.<genexpr>w  s       9fFk) 9r<   )z
github.comzstackoverflow.comzdocs.zapi.z
developer.zconsole.zaws.zazure.zcloud.zfirsteconomy.comz
waaree.comz	claude.aiz
openai.comc              3   &   K   | ]  }|v  
 y wr4   r5   )r7   	work_wordr  s     r   r:   z<ActivityWatchClient._is_non_work_activity.<locals>.<genexpr>  s!       BIyK/ Br<   )r   r  r  r  rR   rQ   rw  r^   r|  r  r  r  )r   r   r   r   )
r   r1   r0   generic_keywordsentertainment_keywordssystem_keywordskeywordwork_keywordsr  r  s
           @@r   r!  z)ActivityWatchClient._is_non_work_activity  s   H  2 2 4 :22 B&""$%).:l((*(0HNN$b	
"

 (G+%I)= (
 .G+%I)= .
 'G+%I)= '

, %G+%I)= %
 [3Z[[{*k[.H$;(>{*g.DK'7k+A  9  
    B    r   c                 x    	 t        j                  | j                   dd      }|j                  dk(  S #  Y yxY w)z'Test connection to ActivityWatch serverr   r
  )timeout   F)r   r   r   status_code)r   r!   s     r   test_connectionz#ActivityWatchClient.test_connection  s=    	||t||nH$=qIH''3..	s   25 9N)r   )   )__name__
__module____qualname__r   r   r   r$   strr   r/   r   dictr   r   r   r   r   r   r  intr,  r"  boolr!  r  r5   r   r   r   r      so   0T$Z $C  x DQUJ 8"s "# "s "HP# P P PdD3 D8C= DL%c %hsm %N# (3-  8C 8HSM 8*x *h *4: *XT8 T( T3 TX\]aXb Tl\
s \
c \
d \
|g# g g gR r   r   )r   r   r   r   typingr   r   r   r   dotenvr   r   urllib.parser	   r   r5   r   r   <module>r     s1      ( ' ' 	  	 ! B
 B
r   