B
    Ef                 @   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kwargs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_status)r   r   r   r   r   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n td|  ytt| j|f| }|S  tk
rr } zt| t	 }|
| dS d }~X Y nX W d Q R X d S )NF)init_views_and_dszEvent from messenger error)r   gdebugsuperr   trigger_event	Exceptionr   ZloggingZ	getLoggerZ	exception)r   eventr   Z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-multideviceN)r+   )r   r   r   r   r   on_scanned_without_multideviceS   s    z9CmfWhatsappClientNamespace.on_scanned_without_multidevicec             C   s   |  d| d S )NZwhatsapp_qrcode_timeout)r+   )r   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_id)r   r    zsend_message_error-)r   CmfChannelMessager   message_statussaver+   parentr   )r   r   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 )Nr0   )r   
message_idZsentzsend_message_success-)	r   r1   r   r7   r2   r3   r+   r4   r   )r   r   r5   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-connectedN)r+   )r   r   r   r   r   r   r   on_whatsapp_connectedl   s    z0CmfWhatsappClientNamespace.on_whatsapp_connectedc             C   sh   xb|d D ]V}t jj|d dd dgd}|r
|js
|d pF|d }|r
||_|jr
|  q
W d S )	NZcontactsZJid@r   
user_local)fieldsZNotifyName)r   Z	CmfPersonZget_by_phonesplitr;   nameZ
is_changedr3   )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-disconnectedN)r+   )r   r   r   r   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 d Q R X d S )NF)r   r   z==Zcrm_idZload_from_date)filterr<   )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   rD   r   r   r   on_whatsapp_message_received   s    	z7CmfWhatsappClientNamespace.on_whatsapp_message_received)r   r   r   r   propertyr   r$   r*   dictr+   r,   r   r.   r/   r6   r8   r9   rA   rB   rG   __classcell__r   r   )r(   r   r   #   s   	


r   z	/whatsapp/)typingr   Zgevent.lockrF   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   |
