U
    "h1                     @   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http://:	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 bucketsz/api/0/bucketsr   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endz/api/0/buckets/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 )afkr0   r2   Zwindow_bucketsr   r   r5   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      r4   hostnameappapplicationUnknowntitleurl)r   developer_namedeveloper_hostnameapplication_namewindow_titler?   r9   categorydetailed_activityrF   	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
activitiesrN   eventseventr8   timestamp_strr9   r$   r?   activityr   r7   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   r3   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 rm   r   r3   browserrp   r   r   rr      s     )chromefirefoxsafariedgebraveoperazWeb Browsingc                 3   s   | ]}| kV  qd S rm   r   r3   commrp   r   r   rr      s     )slackdiscordteamszoomskypetelegramwhatsappZCommunicationc                 3   s   | ]}| kV  qd S rm   r   )r3   terminalrp   r   r   rr      s     )r   cmd
powershellbashZzshZitermc                 3   s   | ]}| kV  qd S rm   r   )r3   designrp   r   r   rr      s     )figmaZsketch	photoshopillustratorcanvaZDesignc                 3   s   | ]}| kV  qd S rm   r   )r3   prodrp   r   r   rr      s     )notionobsidianZtrelloZasanaZjiraZ
confluenceZProductivityN)r1   any)r   rk   r   rp   r   r^      s     z/DynamicActivityWatchClient._categorize_activity)r8   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 descriptionrE   r:   rB   zUnknown Activityc                 3   s   | ]}|   kV  qd S rm   r0   rn   rB   r   r   rr      s     zDDynamicActivityWatchClient._get_detailed_activity.<locals>.<genexpr>)rs   rt   ru   rv   rw   c                 3   s   | ]}|   kV  qd S rm   r0   r3   extrE   r   r   rr      s     ).py.js.html.css.json.md.tsx.jsxzCoding: zIDE: c                 3   s   | ]}|   kV  qd S rm   r0   r|   r   r   r   rr      s     )r~   r   r   r   rF   z
Browsing: githubzGitHub: stackoverflowzStackOverflow: zWeb: c                 3   s   | ]}|   kV  qd S rm   r0   r   r   r   r   rr      s     )r   r   r   zChat: )r   r   _extract_domain_from_urlr1   )r   r8   domainr   )rB   rE   r   r_      s(    





z1DynamicActivityWatchClient._get_detailed_activity)rE   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 rm   r0   r   r   r   r   rr     s     z@DynamicActivityWatchClient._extract_file_path.<locals>.<genexpr>z - r@   r   c                 3   s   | ]}|   kV  qd S rm   r0   r   )potential_pathr   r   rr     s     )u    — z | u    • c                 3   s   | ]}|   kV  qd S rm   r0   r   )partr   r   rr     s     )r   splitrY   strip)r   rE   
extensionsparts	delimiterr   )r   r   rE   r   r`      s     

z-DynamicActivityWatchClient._extract_file_path)rF   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
startswithrY   )r   rF   r   parsedr   r   r   r   r     s    
z3DynamicActivityWatchClient._extract_domain_from_urlN)__name__
__module____qualname____doc__r   r   boolr   r%   rb   r   r   r.   rj   r^   r_   r`   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
   
