U
    \d                     @   s   d dl mZ d dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlT d dlmZ G d	d
 d
eZG dd deZej Zeed eed dS )    )DictN)	Namespace)AsyncClientNamespaceClientNamespace)before_requestcmf_context)commit_all_ds)*)CmfMainNamespacec                   @   s    e Zd ZdZdd Zdd ZdS )CmfWhatsappNamespaceu<   
    Отправляем события на messenger
    c                 O   s"   t jj|d d}|r|  dS )u   
        Отправляем запрос на подключение к web.whatsapp.com через whatsapp.active360.ru
        :param data:
        :param args:
        :param kwargs:
        :return:
        idr   N)modelsCmfWhatsappgetZconnectselfdataargskwargsZsession r   ./modules/crm/views/whatsapp.pyon_whatsapp_connect   s    z(CmfWhatsappNamespace.on_whatsapp_connectc                 O   s"   t jj|d d}|r|  d S )Nr   r   )r   r   r   Zcheck_statusr   r   r   r   on_whatsapp_status   s    z'CmfWhatsappNamespace.on_whatsapp_statusN)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c                       s   e Zd ZdZedd Z fddZdd Zedd	d
Z	dd Z
eddddZdd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )CmfWhatsappClientNamespaceu   
    Для получения и обработки событий с whatsapp.active360.ru отправленных через прокси
    c                 C   s   t jS )N)ZAPPlogger)r   r   r   r   r   (   s    z!CmfWhatsappClientNamespace.loggerc                    s   t dd td|  z(tt| j|f| }|W W  5 Q R  S  tk
r } z.t| t	 }|
| W Y W 5 Q R  dS d }~X Y nX W 5 Q R X d S )NFZinit_views_and_dszEvent from messenger error)r   gdebugsuperr   trigger_event	Exceptionr   ZloggingZ	getLoggerZ	exception)r   eventr   reser   	__class__r   r   r%   ,   s    
z(CmfWhatsappClientNamespace.trigger_eventc                 C   s   t dtj d|  dS )u[   
        Читаем событие message
        :param data:
        :return:
        u   Событие с z: N)printZconfigZWHATSAPP_MESSENGER_URLr   r   r   r   r   
on_message8   s    z%CmfWhatsappClientNamespace.on_message)r   c                 C   s   t || dS )u   
        Метод отправки событий на фронтэнд
        :param event: имя события
        :param data: данные в dict
        :return:
        N)Zcmf_emit_event)r   r'   r   r   r   r   send_to_front@   s    z(CmfWhatsappClientNamespace.send_to_frontc                 O   s   |  d| dS )u   
        При получении qr кода, перенаправляем его во фронт
        :param data:
        :param args:
        :param kwargs:
        :return:
        zwhatsapp-generated_qr_codeNr/   r   r   r   r   r   r   r   on_generated_qr_codeI   s    z/CmfWhatsappClientNamespace.on_generated_qr_codeN)r   returnc                 C   s   |  d| dS )u   
        При получении ошибки сканирования QRcode без бета режима, перенаправляем на фронт
        :param data: данные ответа из whatsapp
        zerr-scanned-without-multideviceNr0   r-   r   r   r   on_scanned_without_multideviceS   s    z9CmfWhatsappClientNamespace.on_scanned_without_multidevicec                 C   s   |  d| d S )NZwhatsapp_qrcode_timeoutr0   r-   r   r   r   on_whatsapp_qrcode_timeoutZ   s    z5CmfWhatsappClientNamespace.on_whatsapp_qrcode_timeoutc                 C   s>   t jj|d d}|r:d|_|  | d|jj | d S )Ncrm_message_idr   r!   zsend_message_error-)r   CmfChannelMessager   message_statussaver/   parentr   r   r   Zchannel_msgr   r   r   on_whatsapp_send_message_error]   s
    z9CmfWhatsappClientNamespace.on_whatsapp_send_message_errorc                 C   sH   t jj|d d}|rD|d |_d|_|  | d|jj | d S )Nr6   r   
message_idsentzsend_message_success-)	r   r7   r   r=   r8   r9   r/   r:   r   r;   r   r   r    on_whatsapp_send_message_successd   s    
z;CmfWhatsappClientNamespace.on_whatsapp_send_message_successc                 O   s   |  d| dS )u   
        Успешно подключились к web.whatsapp.com
        :param data:
        :param args:
        :param kwargs:
        :return:
        zwhatsapp-connectedNr0   r1   r   r   r   on_whatsapp_connectedl   s    z0CmfWhatsappClientNamespace.on_whatsapp_connectedc                 C   sd   |d D ]V}t jj|d dd dgd}|r|js|d pD|d }|r||_|jr|  qd S )	NZcontactsZJid@r   
user_local)fieldsZNotifyName)r   Z	CmfPersonZget_by_phonesplitrB   nameZ
is_changedr9   )r   r   ZcontactZpersonnew_namer   r   r   on_whatsapp_contactsv   s     
z/CmfWhatsappClientNamespace.on_whatsapp_contactsc                 O   s   |  d| dS )u   
        Отключились от web.whatsapp.com
        :param data:
        :param args:
        :param kwargs:
        :return:
        zwhatsapp-disconnectedNr0   r1   r   r   r   on_whatsapp_disconnected   s    z3CmfWhatsappClientNamespace.on_whatsapp_disconnectedc                 O   s0   dd }| j d t|| | j d dS )u   
        Получаем сообщение из ватсапп
        :param data:
        :param args:
        :param kwargs:
        :return:
        c              	   S   s@   t dd, tjjdd| d gdgd}||  W 5 Q R X d S )NFr    r   z==Zcrm_idZload_from_date)filterrC   )r   r   r   r   Zreceive_message)r   Zchannelr   r   r   runner   s    zGCmfWhatsappClientNamespace.on_whatsapp_message_received.<locals>.runnerz"on_whatsapp_message_received startz on_whatsapp_message_received endN)r   infogeventZspawn)r   r   r   r   rK   r   r   r   on_whatsapp_message_received   s    	z7CmfWhatsappClientNamespace.on_whatsapp_message_received)r   r   r   r   propertyr   r%   r.   dictr/   r2   r   r4   r5   r<   r?   r@   rH   rI   rN   __classcell__r   r   r*   r   r   #   s   
	


r   z	/whatsapp/)typingr   Zgevent.lockrM   Zflask_socketior   Zsocketior   r   Zcmf.appr   r   Zcmf.data_providers.baser   Zcmf.includeZ)cmf.modules.socketio.views.main_namespacer
   r   r   lockRLockZ_MESSAGE_LOCKZwhatsapp_sioZregister_namespaceZon_namespacer   r   r   r   <module>   s   |
