
    Ji1                     p    d dl Z d dlmZmZ d dlmZmZmZ d dlZ ej                  e	      Z
 G d d      Zy)    N)datetimetimezone)ListDictOptionalc            	           e Zd ZdZdefdZdefdZdefdZde	de
d	e
dee   fd
Zde
d	e
dee   fdZde	de	fdZdede	fdZde	de	fdZde	de	fdZy)DynamicActivityWatchClientzFActivityWatch client that works with dynamically discovered developersdeveloper_infoc                     || _         |d   | _        |d   | _        |d   | _        d| j                   d| j                   | _        |j                  d| j                        | _        d| _        y )Nidhostportzhttps://:	device_id
   )r
   developer_idr   r   base_urlgetr   timeout)selfr
   s     BE:\timesheet\timesheet_new\backend\dynamic_activitywatch_client.py__init__z#DynamicActivityWatchClient.__init__   sl    ,*40"6*	"6*	"499+Qtyyk:'++K9J9JK    returnc                 x    	 t        j                  | j                   dd      }|j                  dk(  S #  Y yxY w)z'Test connection to ActivityWatch serverz/api/0/info   r      F)requestsr   r   status_code)r   responses     r   test_connectionz*DynamicActivityWatchClient.test_connection   s=    	||t}}o[$A1MH''3..	s   25 9c                     	 t        j                  | j                   d| j                        }|j	                          |j                         S # t        $ r$}t        j                  d|        i cY d}~S d}~ww xY w)zGet all available buckets/api/0/buckets/r   zError getting buckets: N)	r   r   r   r   raise_for_statusjson	Exceptionloggererror)r   r!   es      r   get_bucketsz&DynamicActivityWatchClient.get_buckets   sg    	||t}}o_$Et||\H%%'==?" 	LL21#67I	s   AA 	A=A82A=8A=	bucket_id
start_timeend_timec                 P   	 |j                         |j                         d}t        j                  | j                   d| d|| j                        }|j                          |j                         S # t        $ r'}t        j                  d| d|        g cY d}~S d}~ww xY w)z!Get events from a specific bucket)startendr$   z/events)paramsr   zError getting events from : N)
	isoformatr   r   r   r   r%   r&   r'   r(   r)   )r   r,   r-   r.   r2   r!   r*   s          r   
get_eventsz%DynamicActivityWatchClient.get_events'   s    	#--/))+F  ||==/7CH
 %%'==?" 	LL5i[1#FGI	s   A2A5 5	B%>B B% B%c                 x
   	 | j                         }|s$t        j                  d| j                          g S |j	                         D cg c]  }d|j                         v s| }}|j	                         D cg c]  }d|j                         vs||vs| }}t        j                  d| j                   dt        |       dt        |       d       g }|D ]  }| j                  |||      }	t        j                  dt        |	       d	|        |	D ]  }
|
j                  d
i       }|
j                  dd      }	 |r|j                  d      r&t        j                  |j                  dd            }nWd|v sd|dd v rt        j                  |      }n6t        j                  |      j                  t        j                        }n|}|
j                  dd      }|dk  r| j                  | j"                  d   | j"                  d   |j                  d|j                  dd            |j                  dd      ||j%                         | j'                  |j                  dd            | j)                  |      |j                  dd      | j+                  |j                  dd            || j,                  |d}|j/                  |         |s|rt        j                  d |        |dd! D ]q  }| j                  |||      }	t        j                  dt        |	       d	|        |	D ]1  }
|
j                  d
i       }|
j                  dd      }|d"k  r.|
j                  dd      }	 |rM|j                  d      r&t        j                  |j                  dd            }nt        j                  |      }n|}|j/                  | j                  | j"                  d   | j"                  d   |j                  dt1        |            t1        |      ||j%                         | j'                  |j                  dd            d#| dd|| j,                  |d       4 t |j3                  d$ d%&       t        j                  d't        |       d(| j                          |S c c}w c c}w # t         $ r(}t        j                  d| d|        |}Y d}~d}~ww xY w#  |}Y /xY w# t         $ r1}t        j5                  d)| j                   d|        g cY d}~S d}~ww xY w)*zGet processed activity datazNo buckets found for windowafkzFound buckets for r3   z	 window, z otherz
Retrieved z events from data	timestamp Zz+00:00+-iN)tzinfozError parsing timestamp durationr      namehostnameappapplicationUnknowntitleurl)r   developer_namedeveloper_hostnameapplication_namewindow_titler@   r:   categorydetailed_activityrH   	file_pathbucket_namer   activity_timestampz,No window data found, trying other buckets:    r   zActivity from c                     | d   S )Nr@    )xs    r   <lambda>z>DynamicActivityWatchClient.get_activity_data.<locals>.<lambda>   s    !J-r   T)keyreversez
Processed z activities for z Error getting activity data for )r+   r(   warningr   keyslowerinfolenr5   r   endswithr   fromisoformatreplacer   utcr'   r
   r4   _categorize_activity_get_detailed_activity_extract_file_pathr   appendstrsortr)   )r   r-   r.   bucketsrB   window_bucketsapp_buckets
activitiesrP   eventseventr9   timestamp_strr:   r*   r@   activitys                    r   get_activity_dataz,DynamicActivityWatchClient.get_activity_data9   s   p	&&(G!6t7H7H6IJK	 07||~Z~tTZZ\AYd~NZ,3LLNwNDe4::<>W\`hv\v4NKwKK,T->->,?r#nBUAVV_`cdo`p_qqwxyJ  .j(KjV];-PQ#E 99VR0D %*IIk2$>M/(,55c:,4,B,B=CXCXY\^fCg,h	!$!5bc@R9R,4,B,B=,Q	,4,B,B=,Q,Y,Yaiamam,Y,n	(2I
  %yyQ7H!|  )-(9(9*.*=*=f*E.2.A.A*.M,0HHUDHH]T]<^,_(,"(=$,%.%8%8%:$($=$=dhhub>Q$R-1-H-H-N#xxr2%)%<%<TXXgr=R%S'2%)^^.7 H  %%h/Q $	  .^ +J;-XY#.r?K!__[*hOFKK*S[M{m TU!'$yy4#(99Z#;#a<$(-		+r(B	3,#0#9#9##>080F0F}G\G\]`bjGk0lI080F0F}0UI,6	 #)),0,=,=.2.A.A&.I262E2Ej2Q04D	0J,/I(0)2)<)<)>(,(A(A$((5RTBU(V3A+1O#%)++6)-2;+ ' "(	 $3R OO 7OFKK*S_$55EdFWFWEXYZK [w6 % /)A-PRSTRU'VW$.	/b3(2I2  	LL;D<M<M;NbQRPSTUI	s   5S? S? 
R7"R7&S? :R<R<R<B&S? BSF)S? <AS5C)S? 7
S? 	S2
S-'S? -S22S? 5S<9S? ?	T9&T4.T94T9app_namec                 (   |sy|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              ryy)z-Categorize activity based on application nameOtherc              3   &   K   | ]  }|v  
 y wNrT   ).0ide	app_lowers     r   	<genexpr>zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>   s       ,
Csi ,
   )cursorcodevimsublimeatomintellijpycharmwebstormphpstormvscodezvisual studioDevelopmentc              3   &   K   | ]  }|v  
 y wru   rT   )rv   browserrx   s     r   ry   zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>   s       6
'I% 6
rz   )chromefirefoxsafariedgebraveoperazWeb Browsingc              3   &   K   | ]  }|v  
 y wru   rT   )rv   commrx   s     r   ry   zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>          0
t" 0
rz   )slackdiscordteamszoomskypetelegramwhatsappCommunicationc              3   &   K   | ]  }|v  
 y wru   rT   )rv   terminalrx   s     r   ry   zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>   s       8
8Y& 8
rz   )r   cmd
powershellbashzshitermc              3   &   K   | ]  }|v  
 y wru   rT   )rv   designrx   s     r   ry   zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>   s       4
9$ 4
rz   )figmasketch	photoshopillustratorcanvaDesignc              3   &   K   | ]  }|v  
 y wru   rT   )rv   prodrx   s     r   ry   zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>   r   rz   )notionobsidiantrelloasanajira
confluenceProductivity)r[   any)r   rq   rx   s     @r   rb   z/DynamicActivityWatchClient._categorize_activity   s    NN$	   ,
   !   6
   "   0
   #   8
   !   4
      0
   " r   r9   c                    |j                  dd      |j                  dd      sxs dS t        fddD              rt        fddD              rd	 S d
 S t        fddD              r]|j                  d      r| j                  |d         }d| S dj                         v rd S dj                         v rd S d S t        fddD              rd S S )z!Get detailed activity descriptionrG   r;   rD   zUnknown Activityc              3   B   K   | ]  }|j                         v   y wru   r[   )rv   rw   rD   s     r   ry   zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>   s     Z-Ycsciik!-Y   )r{   r|   r}   r~   r   c              3   B   K   | ]  }|j                         v   y wru   r   rv   extrG   s     r   ry   zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>   s     s3rC3%++-'3rr   ).py.js.html.css.json.md.tsx.jsxzCoding: zIDE: c              3   B   K   | ]  }|j                         v   y wru   r   )rv   r   rD   s     r   ry   zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>   s     _7^GCIIK'7^r   )r   r   r   r   rH   z
Browsing: githubzGitHub: stackoverflowzStackOverflow: zWeb: c              3   B   K   | ]  }|j                         v   y wru   r   )rv   r   rD   s     r   ry   zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>   s     O1N$1Nr   )r   r   r   zChat: )r   r   _extract_domain_from_urlr[   )r   r9   domainrD   rG   s      @@r   rc   z1DynamicActivityWatchClient._get_detailed_activity   s   "%hhub!,,, Z-YZZs3rss!%))ug& _7^__xx66tE{C#F8,,U[[]*!%)) EKKM1(00ug& O1NOOC5>!r   rG   c                 h   syg d}t        fd|D              rj                  d      }t        |      dkD  r)|d   j                         t        fd|D              rS dD ]G  }|v sj                  |      }|D ]*  t        fd	|D              sj                         c c S  I y)
z0Extract file path from window title if availabler;   )r   r   r   r   r   r   z.txtr   r   z.vuez.phpc              3   B   K   | ]  }|j                         v   y wru   r   r   s     r   ry   z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>  s     :zsekkm#zr   z - rA   r   c              3   B   K   | ]  }|j                         v   y wru   r   )rv   r   potential_paths     r   ry   z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>  s      K
sn2244
r   )u    — z | u    • c              3   B   K   | ]  }|j                         v   y wru   r   )rv   r   parts     r   ry   z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>  s     Ijssdjjl2jr   )r   splitr]   strip)r   rG   
extensionsparts	delimiterr   r   s    `   @@r   rd   z-DynamicActivityWatchClient._extract_file_path   s     m
:z::KK&E5zA~!&q!1K
KK)) 7	%!KK	2E %IjII#'::</ !& 7 r   rH   c                     	 ddl m}  ||      }|j                  }|j                  d      r|dd }|S #  t	        |      dkD  r
|dd dz   cY S |cY S xY w)zExtract domain from URLr   )urlparsezwww.   N2   z...)urllib.parser   netloc
startswithr]   )r   rH   r   parsedr   s        r   r   z3DynamicActivityWatchClient._extract_domain_from_url  sa    	>-c]F]]F  (M	>'*3x"}3s8e#=#=s   14 AAN)__name__
__module____qualname____doc__r   r   boolr"   r+   rf   r   r   r5   rp   rb   rc   rd   r   rT   r   r   r	   r	   	   s    Pt  T C X  VZ[_V` $rH r rTRVZ rh-S -S -^4 C B  6
>C 
>C 
>r   r	   )r   r   r   typingr   r   r   logging	getLoggerr   r(   r	   rT   r   r   <module>r      s2     ' ' ' 			8	$Y> Y>r   