o
    e7                     @   s  d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z* dd	l+m,Z, dd
l-mZ ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= eddZ>dZ?d@e?dgZAdZBd@eBdgZCdZDdZEd@eDdgZFd@eEdgZGdZHdd ZIdd ZJG dd deKZLdS )z)
Core client, used for all API requests.
    N)
namedtuple)ResponseObject)AuthenticationErrorInvalidRequestErrorPlivoRestErrorPlivoServerErrorResourceNotFoundErrorValidationErrorForbiddenError)Accounts	AddressesApplicationsCallsTokenConferences	Endpoints
IdentitiesMessages
PowerpacksMediaLookupBrandCampaignProfileNumbersPricings
RecordingsSubaccountsCallFeedbackMultiPartyCallsSessionsTollfreeVerifications)	LiveCalls)MaskingSessions)VerifyCallerids)r   )QueuedCalls)EndUsersComplianceDocumentTypesComplianceDocumentsComplianceRequirementsComplianceApplications)is_valid_mainaccountis_valid_subaccount)__version__)RequestSessionAuthenticationCredentialszauth_id auth_tokenzhttps://api.plivo.com/z
v1/Accountzhttps://stats.plivo.comc                   C   s   dt t f S )Nzplivo-python/%s (Python: %s))r-   platformpython_version r4   r4   D/var/www/html/venv/lib/python3.10/site-packages/plivo/rest/client.pyget_user_agent/   s   r6   c                 C   s`   | r|szt jd } t jd }W n ty   tdw t| s*t| s*td|  t| |dS )zDFetches the right credentials either from params or from environmentPLIVO_AUTH_IDPLIVO_AUTH_TOKENz:The Plivo Python SDK could not find your auth credentials.zInvalid auth_id supplied: %sauth_id
auth_token)osenvironKeyErrorr   r+   r,   r0   r9   r4   r4   r5   fetch_credentials4   s   
r?   c                   @   sj   e Zd ZdddZdd Zdd Z		dd	d
ZdddZ			dddZdd Z						dddZ
dS )ClientN   c                 C   s  t | _t | _| jjt ddd t||| j_t | _	| j	jt dd t||| j	_|| _
|| _t| | _t| | _t| | _t| | _t| | _t| | _t| | _t| | _t| | _t| | _t | | _!t"| | _#t$| | _%t&| | _'t(| | _)t*| | _+t,| | _-t.| | _/t0| | _1t2| | _3t4| | _5t6| | _7t8| | _9t:| | _;t<| | _=t>| | _?t@| | _AtB| | _CtD| | _EtF| | _Gd| _HtI| | _JtK| | _LdS )z\
        The Plivo API client.

        Deals with all the API requests to be made.
        zapplication/json)
User-AgentzContent-TypeAcceptzno-cache)rB   zCache-Controlr   N)MPLIVO_API_BASE_URIbase_urir/   sessionheadersupdater6   r?   authmultipart_sessionproxiestimeoutr   accountr   subaccountsr   applicationsr   callsr   tokenr"   
live_callsr%   queued_callsr   conferencesr   	endpointsr   messagesr   lookupr   numbersr!   tollfree_verificationr   
powerpacksr   brandr   campaignr   profiler   mediar   pricingr   
recordingsr   	addressesr   
identitiesr   call_feedbackr&   	end_usersr'   compliance_document_typesr(   compliance_documentsr)   compliance_requirementsr*   compliance_applicationsr   multi_party_callsr#   masking_sessionsvoice_retry_countr    verify_sessionr$   verify_callerids)selfr:   r;   rK   rL   r4   r4   r5   __init__F   sb   






























zClient.__init__c                 C   s   | S Nr4   )rn   r4   r4   r5   	__enter__   s   zClient.__enter__c                 C   s   | j   | j  d S rp   )rF   closerJ   )rn   exc_typeexc_valexc_tbr4   r4   r5   __exit__   s   
zClient.__exit__c                    sN  z&|j dd d}|r||j}|}d|v r% r% fdd|jD |_W n ty1   d}Y nw |jdkrM|durDd	|v rDt|jtd
j|jd|jdkrf|r]d	|v r]t	|jt	dj|jd|jdkr|rvd	|v rvt
|jt
dj|jd|jdkr|rd	|v rt|jtdj|jd|jdkr|rd	|v rt|jtdj||jd|jdkr|rd	|v rt|jtdj|jd|jdkr|rd	|v rt|jtdj|jd|jdkr|rd	|v rt|jtdj|jd|dkr|jdvrtdj|jdn|jdvr"tdj|j|d d!_|S )"zgProcesses the API response based on the status codes and method used
        to access the API
        c                 S   s   t | tr	t| S | S rp   )
isinstancedictr   )xr4   r4   r5   <lambda>   s    z)Client.process_response.<locals>.<lambda>)object_hookobjectsc                    s   g | ]} |j qS r4   )__dict__).0objobjects_typern   r4   r5   
<listcomp>   s    
z+Client.process_response.<locals>.<listcomp>Ni  errorzFA parameter is missing or is invalid while accessing resourceat: {url})urli  z9Failed to authenticate while accessing resource at: {url}i  zRequest Failed : {url}i  zResource not found at: {url}i  z?HTTP method "{method}" not allowed to access resource at: {url})methodr   i  zConflict: {url}i  zUnprocessable Entity: {url}  z:A server error occurred while accessing resource at: {url}DELETE)      z&Resource at {url} could not be deleted)r         r         zAReceived status code {status_code} for the HTTP method "{method}")status_coder   r   )jsonr}   r|   
ValueErrorr   r	   r   formatr   r   r
   r   r   r   r   rk   )rn   r   responseresponse_typer   response_jsonrr4   r   r5   process_response   s   
















zClient.process_responsec                 K   s   d|v r!d t|d g}t||fi |dkrd|ind|i}nV|ddrK|p*g }d td	d
 |D }t||fi |dkrDd|ind|i}n,|pNg }t|d | j| jjd gtdd
 |D  d fi |dkrqd|ind|i}| j|S )Nis_callinsights_requestr1   callinsights_request_pathGETparamsr   is_lookup_requestFc                 S      g | ]}t |qS r4   strr~   pr4   r4   r5   r          z)Client.create_request.<locals>.<listcomp>r   c                 S   r   r4   r   r   r4   r4   r5   r      r   )	joinCALLINSIGHTS_BASE_URLr.   getlistrE   rF   rI   prepare_request)rn   r   pathdatakwargsr   reqr4   r4   r5   create_request   s(   ((zClient.create_requestc           	   
   C   s   |pg }i }|dkr||d< n#||d< z|r||d< W n t y1 } z
t| W Y d }~nd }~ww d| j| jjd gtdd |D  d }t||fi |}| j|S )	Nr   r   r   filesr1   r   c                 S   r   r4   r   r   r4   r4   r5   r   
  r   z3Client.create_multipart_request.<locals>.<listcomp>)		Exceptionprintr   rE   rJ   rI   r   r.   r   )	rn   r   r   r   r   	data_argser   r   r4   r4   r5   create_multipart_request   s    
.zClient.create_multipart_requestc                 K   s:   d|v r|d }|d= n| j }|j|f| j| jd|S )NrF   )rK   rL   )rF   sendrK   rL   )rn   requestr   rF   r4   r4   r5   send_request  s   zClient.send_requestc                 K   s  |d ur|  ||||}| j}	n|ddst| _|rCd|v rCi }
d|v rB|d |
d< |d |
d< |d= |d= | j|||fi |
}n|ddr|d= | jdkrTt| _| |||}| j}	|	|d< | j	|fi |}|j
dkrtd|j| j |  jd	7  _| jd	krt| _n| jd
krt| _n| ||||S d|d< | j|||fi |S | ||||S |ddr| j|||dd}|d= n| |||}| j}	|	|d< | j	|fi |}| ||||S )Nis_voice_requestFr   r   r   rF   r   zFallback for URL: {}. Retry {}      Tr   )r   )r   rJ   r   rD   rE   r   rk   API_VOICE_BASE_URIrF   r   r   r   r   r   API_VOICE_BASE_URI_FALLBACK_1API_VOICE_BASE_URI_FALLBACK_2r   r   )rn   r   r   r   r   r   r   r   r   rF   params_dictr   resr4   r4   r5   r     sR   



zClient.request)NNNrA   )NN)NNN)NNNNN)__name__
__module____qualname__ro   rq   rv   r   r   r   r   r   r4   r4   r4   r5   r@   E   s&    
9

]
r@   )M__doc__r<   r2   collectionsr   
plivo.baser   plivo.exceptionsr   r   r   r   r   r	   r
   plivo.resourcesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   plivo.resources.live_callsr"   plivo.resources.maskingsessionr#   plivo.resources.verify_calleridr$   plivo.resources.profileplivo.resources.queued_callsr%   %plivo.resources.regulatory_compliancer&   r'   r(   r)   r*   plivo.utilsr+   r,   plivo.versionr-   requestsr.   r/   r0   	PLIVO_APIr   rD   	API_VOICEr   API_VOICE_FALLBACK_1API_VOICE_FALLBACK_2r   r   r   r6   r?   objectr@   r4   r4   r4   r5   <module>   s>   $d