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   ?/var/www/html/timesheet/backend/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   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 )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 )afkr1   r3   Zwindow_bucketsr   r   r6   C   s       zFound buckets for r-   z	 window, z otherz
Retrieved z events from data	timestamp Zz+00:00+-iN)tzinfozError parsing timestamp durationr      r5   hostnameappapplicationUnknowntitleurl)r   developer_namedeveloper_hostnameapplication_namewindow_titler@   r:   categorydetailed_activityrG   	file_pathbucket_namer   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#   warningr   keysinfolenr/   r   endswithr   fromisoformatreplacer   utcr"   r   r.   _categorize_activity_get_detailed_activity_extract_file_pathr   appendstrsortr$   )r   r(   r)   bucketsZapp_buckets
activitiesrO   eventseventr9   timestamp_strr:   r%   r@   activityr   r8   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 nameOtherc                 3   s   | ]}| kV  qd S Nr   r4   ide	app_lowerr   r   	<genexpr>   s     zBDynamicActivityWatchClient._categorize_activity.<locals>.<genexpr>)cursorcodevimsublimeatomintellijpycharmZwebstormZphpstormvscodezvisual studioDevelopmentc                 3   s   | ]}| kV  qd S rn   r   r4   browserrq   r   r   rs      s     )chromefirefoxsafariedgebraveoperazWeb Browsingc                 3   s   | ]}| kV  qd S rn   r   r4   commrq   r   r   rs      s     )slackdiscordteamszoomskypetelegramwhatsappZCommunicationc                 3   s   | ]}| kV  qd S rn   r   )r4   terminalrq   r   r   rs      s     )r   cmd
powershellbashZzshZitermc                 3   s   | ]}| kV  qd S rn   r   )r4   designrq   r   r   rs      s     )figmaZsketch	photoshopillustratorcanvaZDesignc                 3   s   | ]}| kV  qd S rn   r   )r4   prodrq   r   r   rs      s     )notionobsidianZtrelloZasanaZjiraZ
confluenceZProductivityN)r2   any)r   rl   r   rq   r   r_      s     z/DynamicActivityWatchClient._categorize_activity)r9   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 descriptionrF   r;   rC   zUnknown Activityc                 3   s   | ]}|   kV  qd S rn   r1   ro   rC   r   r   rs      s     zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>)rt   ru   rv   rw   rx   c                 3   s   | ]}|   kV  qd S rn   r1   r4   extrF   r   r   rs      s     ).py.js.html.css.json.md.tsx.jsxzCoding: zIDE: c                 3   s   | ]}|   kV  qd S rn   r1   r}   r   r   r   rs      s     )r   r   r   r   rG   z
Browsing: githubzGitHub: stackoverflowzStackOverflow: zWeb: c                 3   s   | ]}|   kV  qd S rn   r1   r   r   r   r   rs      s     )r   r   r   zChat: )r   r   _extract_domain_from_urlr2   )r   r9   domainr   )rC   rF   r   r`      s(    





z1DynamicActivityWatchClient._get_detailed_activity)rF   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 availabler;   r   r   r   r   r   r   z.txtr   r   z.vuez.phpc                 3   s   | ]}|   kV  qd S rn   r1   r   r   r   r   rs     s     z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>z - rA   r   c                 3   s   | ]}|   kV  qd S rn   r1   r   )potential_pathr   r   rs     s     )u    — z | u    • c                 3   s   | ]}|   kV  qd S rn   r1   r   )partr   r   rs     s     )r   splitrZ   strip)r   rF   
extensionsparts	delimiterr   )r   r   rF   r   ra      s     

z-DynamicActivityWatchClient._extract_file_path)rG   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...)urllib.parser   netloc
startswithrZ   )r   rG   r   parsedr   r   r   r   r     s    
z3DynamicActivityWatchClient._extract_domain_from_urlN)__name__
__module____qualname____doc__r   r   boolr   r&   rc   r   r   r/   rk   r_   r`   ra   r   r   r   r   r   r   	   s   	
t/!r   )r   r   r   typingr   r   r   logging	getLoggerr   r#   r   r   r   r   r   <module>   s
   
