o
    'fj                     @   sH   d dl Z d dlmZ d dlZd dlmZmZ e eZ	G dd dZ
dS )    N)Any)Settingsget_settingsc                   @   sp  e Zd ZdMdedB ddfddZdejfddZdNdd	Zddd
de	de	de
e	ef dB de
e	ef dB dejf
ddZddddddde	dee	 dB de	de	de	de	de
e	ef fddZddddd e	d!e	dB d"edee	 dB de
e	ef f
d#d$Zd%e	ddfd&d'Zd%e	ddfd(d)Zde
e	ef fd*d+Zd,e	d%e	ddfd-d.Zd,e	d%e	ddfd/d0Zd,e	ddfd1d2Zd%e	de
e	ef fd3d4Zd%e	d5e	de	dB fd6d7ZdOd%e	d9e	de
e	ef fd:d;Zd%e	d<e	de
e	ef fd=d>Zd,e	de
e	ef fd?d@Zdee
e	ef  fdAdBZdee
e	ef  fdCdDZdNdEdFZdGe	dHe	de
e	ef dB fdIdJZ defdKdLZ!dS )P	AriClientNsettingsreturnc                 C   s   |pt  | _d | _d S N)r   r   _client)selfr    r   4/var/www/html/bot-asterisk-ari/backend/ari/client.py__init__   s   
zAriClient.__init__c                    s:   | j d u rtj| jjd| jj| jjfdd| _ | j S )N/g      >@)base_urlauthtimeout)r	   httpxAsyncClientr   ari_base_urlrstripari_userari_passwordr
   r   r   r   _get_client   s   
zAriClient._get_clientc                    s&   | j r| j  I d H  d | _ d S d S r   )r	   acloser   r   r   r   close   s
   
zAriClient.closejsonparamsmethodpathr   r   c                   s,   |   I d H }|j||||dI d H }|S )Nr   )r   request)r
   r   r    r   r   clientresponser   r   r   _request   s   zAriClient._requestulawrtpr"   udp)app_argsfmtencapsulationconnection_type	transportexternal_hostr(   r)   r*   r+   r,   c          	         sR   | j j|||||dd}|rd||d< | jdd|dI dH }|  | S )	uN   Canal UnicastRTP: Asterisk envía RTP a external_host (nuestro puente WebRTC).both)appr-   formatr*   r+   r,   	direction,appArgsPOSTz/ari/channels/externalMediar   N)r   
stasis_appjoinr$   raise_for_statusr   )	r
   r-   r(   r)   r*   r+   r,   r   r#   r   r   r   create_external_media*   s   	zAriClient.create_external_mediaT)	caller_id
use_stasisr(   endpointr:   r;   c                   s~   ||p| j jd}|r| j j|d< |rd||d< n| j j|d< | j j|d< d|d< | jd	d
|dI d H }|  | S )N)r<   callerIdr/   r2   r3   context	extension   priorityr4   /ari/channelsr5   )	r   outbound_caller_idr6   r7   outbound_contextoutbound_extensionr$   r8   r   )r
   r<   r:   r;   r(   r   r#   r   r   r   originate_channelE   s   	
zAriClient.originate_channel
channel_idc                    s6   |  dd| dI d H }|jdvr|  d S d S )Nr4   /ari/channels/z/answer      r$   status_coder8   r
   rG   r#   r   r   r   answer^   s
   
zAriClient.answerc                    4   |  dd| I d H }|jdvr|  d S d S )NDELETErH   rJ     rL   rN   r   r   r   hangupc   
   
zAriClient.hangupc                    s,   | j ddddidI d H }|  | S )Nr4   /ari/bridgestypemixing)r   r$   r8   r   r
   r#   r   r   r   create_bridgeh   s   zAriClient.create_bridge	bridge_idc                    >   | j dd| dd|idI d H }|jdvr|  d S d S )Nr4   /ari/bridges/z/addChannelchannelr5   rI   rL   r
   r\   rG   r#   r   r   r   add_to_bridgem      

zAriClient.add_to_bridgec                    r]   )Nr4   r^   z/removeChannelr_   r5   )rJ   rK   rS   rL   r`   r   r   r   remove_from_bridgev   rb   zAriClient.remove_from_bridgec                    rP   )NrQ   r^   rR   rL   r
   r\   r#   r   r   r   delete_bridge   rU   zAriClient.delete_bridgec                    *   |  dd| I d H }|  | S )NGETrH   rY   rN   r   r   r   get_channel      zAriClient.get_channelvariablec                    sL   | j dd| dd|idI d H }|jdkrd S |  | }|dS )Nrg   rH   z	/variablerj   r5   rS   value)r$   rM   r8   r   get)r
   rG   rj   r#   datar   r   r   get_channel_variable   s   


zAriClient.get_channel_variablesound:hello-worldmediac                    s4   | j dd| dd|idI d H }|  | S )Nr4   rH   z/playrp   r5   rY   )r
   rG   rp   r#   r   r   r   
play_sound   s   
zAriClient.play_sounddigitsc                    s>   d dd t|D }|std| |d| I dH S )u<   Reproduce dígitos uno a uno (sonidos digits/N de Asterisk). c                 s   s    | ]	}|  r|V  qd S r   )isdigit).0cr   r   r   	<genexpr>   s    z(AriClient.play_digits.<locals>.<genexpr>u   No hay dígitos para reproducirzdigits:N)r7   str
ValueErrorrq   )r
   rG   rr   cleanr   r   r   play_digits   s
   zAriClient.play_digitsc                    rf   )Nrg   r^   rY   rd   r   r   r   
get_bridge   ri   zAriClient.get_bridgec                    $   |  ddI d H }|  | S )Nrg   rB   rY   rZ   r   r   r   list_channels      zAriClient.list_channelsc                    r}   )Nrg   rV   rY   rZ   r   r   r   list_bridges   r   zAriClient.list_bridgesc                    s   |   I d H D ]*}z| |d I d H  W q ty2 } ztd|d| W Y d }~qd }~ww |  I d H D ]*}z| |d I d H  W q: tyd } ztd|d| W Y d }~q:d }~ww d S )NidzFailed to hangup channel %s: %szFailed to delete bridge %s: %s)r~   rT   	Exceptionloggerwarningrl   r   re   )r
   r_   excbridger   r   r   cleanup_all   s      zAriClient.cleanup_alltechresourcec                    s>   |  dd| d| I d H }|jdkrd S |  | S )Nrg   z/ari/endpoints/r   rS   )r$   rM   r8   r   )r
   r   r   r#   r   r   r   get_endpoint   s   
zAriClient.get_endpointc                    sF   z|   I d H }|jdddI d H }|jdkW S  ty"   Y dS w )Nz/ari/asterisk/infog       @)r   rK   F)r   rl   rM   r   )r
   r"   r#   r   r   r   health_check   s   zAriClient.health_checkr   )r   N)ro   )"__name__
__module____qualname__r   r   r   r   r   r   rx   dictr   Responser$   listr9   boolrF   rO   rT   r[   ra   rc   re   rh   rn   rq   r{   r|   r~   r   r   r   r   r   r   r   r   r      s    
	



	



		
 	
"r   )loggingtypingr   r   configr   r   	getLoggerr   r   r   r   r   r   r   <module>   s    
