U
    =Nh1                     @   sP   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e	Z
G dd dZdS )    N)datetimetimezone)ListDictOptionalc                   @   s   e Zd ZdZedddZedddZeddd	Ze	e
e
ee d
ddZe
e
ee dddZe	e	dddZee	dddZe	e	dddZe	e	dddZdS )DynamicActivityWatchClientzFActivityWatch client that works with dynamically discovered developers)developer_infoc                 C   sT   || _ |d | _|d | _|d | _d| j d| j | _|d| j| _d| _d S )Nidhostportzhttps://:	device_id
   )r   developer_idr
   r   base_urlgetr   timeout)selfr    r   !./dynamic_activitywatch_client.py__init__   s    


z#DynamicActivityWatchClient.__init__)returnc                 C   s6   z"t j| j ddd}|jdkW S    Y dS X dS )z'Test connection to ActivityWatch serverz/api/0/info   r      FN)requestsr   r   Zstatus_code)r   responser   r   r   test_connection   s
    z*DynamicActivityWatchClient.test_connectionc              
   C   sj   z*t j| j d| jd}|  | W S  tk
rd } ztd|  i  W Y S d}~X Y nX dS )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   er   r   r   get_buckets   s    
z&DynamicActivityWatchClient.get_buckets)	bucket_id
start_timeend_timer   c              
   C   s   zD|  |  d}tj| j d| d|| jd}|  | W S  tk
r } z"t	d| d|  g  W Y S d}~X Y nX dS )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(   r+   r   r$   r   r   r   
get_events'   s    
z%DynamicActivityWatchClient.get_events)r'   r(   r   c                    s  z|   }|s(td| j  g W S dd | D   fdd| D }td| j dt  dt| d g } D ]}| |||}td	t| d
|  |D ]`}|di }	|dd}
zj|
r4|
	drt
|
dd}n<d|
ksd|
dd krt
|
}nt
|
jtjd}n|}W n> tk
rx } ztd|
 d|  |}W 5 d}~X Y nX |dd}|dk rq| j| jd | jd |	d|	dd|	dd|| | |	dd| |	|	dd| |	dd|| j|d }|| qq|s\|r\td!|  |dd" D ]}| |||}td	t| d
|  |D ]}|di }	|dd}|d#k rqr|dd}
z:|
r|
	drt
|
dd}n
t
|
}n|}W n   |}Y nX || j| jd | jd |	dt|	t|	|| | |	ddd$| dd|| j|d  qrq@|jd%d& d'd( td)t| d*| j  |W S  tk
r } z$td+| j d|  g  W Y S d}~X Y nX dS ),zGet processed activity datazNo buckets found for c                 S   s   g | ]}d |  kr|qS )Zwindowlower.0namer   r   r   
<listcomp>B   s      z@DynamicActivityWatchClient.get_activity_data.<locals>.<listcomp>c                    s$   g | ]}d |  kr| kr|qS )Zafkr/   r1   Zwindow_bucketsr   r   r4   C   s       zFound buckets for r,   z	 window, z otherz
Retrieved z events from data	timestamp Zz+00:00+-iN)ZtzinfozError parsing timestamp durationr      r3   ZhostnameappZapplicationZUnknowntitleurl)r   Zdeveloper_nameZdeveloper_hostnameZapplication_nameZwindow_titler<   r7   categoryZdetailed_activityr@   Z	file_pathbucket_namer   Zactivity_timestampz,No window data found, trying other buckets:    r   zActivity from c                 S   s   | d S )Nr<   r   )xr   r   r   <lambda>       z>DynamicActivityWatchClient.get_activity_data.<locals>.<lambda>T)keyreversez
Processed z activities for z Error getting activity data for )r%   r"   Zwarningr   keysinfolenr.   r   endswithr   Zfromisoformatreplacer   Zutcr!   r   r-   _categorize_activity_get_detailed_activity_extract_file_pathr   appendstrsortr#   )r   r'   r(   ZbucketsZapp_bucketsZ
activitiesrB   ZeventsZeventr6   Ztimestamp_strr7   r$   r<   Zactivityr   r5   r   get_activity_data9   s    (







z,DynamicActivityWatchClient.get_activity_data)app_namer   c                    s   |sdS |   t fdddD r*dS t fdddD rDdS t fd	dd
D r^dS t fdddD rxdS t fdddD rdS t fdddD rdS dS dS )z-Categorize activity based on application nameZOtherc                 3   s   | ]}| kV  qd S Nr   r2   ZideZ	app_lowerr   r   	<genexpr>   s     zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>)cursorcodevimsublimeatomZintellijZpycharmZwebstormZphpstormZvscodezvisual studioZDevelopmentc                 3   s   | ]}| kV  qd S rV   r   r2   ZbrowserrX   r   r   rY      s     )chromefirefoxsafariedgeZbraveZoperazWeb Browsingc                 3   s   | ]}| kV  qd S rV   r   r2   ZcommrX   r   r   rY      s     )slackdiscordteamsZzoomZskypeZtelegramZwhatsappZCommunicationc                 3   s   | ]}| kV  qd S rV   r   )r2   terminalrX   r   r   rY      s     )rh   cmdZ
powershellZbashZzshZitermc                 3   s   | ]}| kV  qd S rV   r   )r2   ZdesignrX   r   r   rY      s     )ZfigmaZsketchZ	photoshopZillustratorZcanvaZDesignc                 3   s   | ]}| kV  qd S rV   r   )r2   ZprodrX   r   r   rY      s     )ZnotionZobsidianZtrelloZasanaZjiraZ
confluenceZProductivityN)r0   any)r   rU   r   rX   r   rN      s     z/DynamicActivityWatchClient._categorize_activity)r6   r   c                    s   | dd| dd s$ p"dS t fdddD rftfddd	D rZd
 S d S nt fdddD r| dr| |d }d| S d krd S d krd S d S n t fdddD rd  S S )z!Get detailed activity descriptionr?   r8   r>   zUnknown Activityc                 3   s   | ]}|   kV  qd S rV   r/   rW   r>   r   r   rY      s     zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>)rZ   r[   r\   r]   r^   c                 3   s   | ]}|   kV  qd S rV   r/   r2   extr?   r   r   rY      s     ).py.js.html.css.json.md.tsx.jsxzCoding: zIDE: c                 3   s   | ]}|   kV  qd S rV   r/   r_   rk   r   r   rY      s     )r`   ra   rb   rc   r@   z
Browsing: ZgithubzGitHub: ZstackoverflowzStackOverflow: zWeb: c                 3   s   | ]}|   kV  qd S rV   r/   rd   rk   r   r   rY      s     )re   rf   rg   zChat: )r   rj   _extract_domain_from_urlr0   )r   r6   domainr   )r>   r?   r   rO      s(    





z1DynamicActivityWatchClient._get_detailed_activity)r?   r   c                    s   sdS dddddddd	d
ddg}t fdd|D rd}t|dkrt|d  t fdd|D rtS dD ]F}|krx|}|D ]* t  fdd|D r      S qqxdS )z0Extract file path from window title if availabler8   ro   rp   rq   rr   rs   rt   z.txtru   rv   z.vuez.phpc                 3   s   | ]}|   kV  qd S rV   r/   rl   rn   r   r   rY     s     z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>z - r=   r   c                 3   s   | ]}|   kV  qd S rV   r/   rl   )potential_pathr   r   rY     s     )u    — z | u    • c                 3   s   | ]}|   kV  qd S rV   r/   rl   )partr   r   rY     s     )rj   splitrK   strip)r   r?   
extensionspartsZ	delimiterr   )rz   ry   r?   r   rP      s     

z-DynamicActivityWatchClient._extract_file_path)r@   r   c                 C   sh   z6ddl m} ||}|j}|dr2|dd }|W S    t|dkrZ|dd d n| Y S X dS )zExtract domain from URLr   )urlparsezwww.   N2   z...)Zurllib.parser   Znetloc
startswithrK   )r   r@   r   Zparsedrx   r   r   r   rw     s    
z3DynamicActivityWatchClient._extract_domain_from_urlN)__name__
__module____qualname____doc__r   r   boolr   r%   rR   r   r   r.   rT   rN   rO   rP   rw   r   r   r   r   r   	   s   	
t/!r   )r   r   r   typingr   r   r   ZloggingZ	getLoggerr   r"   r   r   r   r   r   <module>   s
   
