U
    ʼbw                     @   s^   d dl Z d dlmZ d dlmZ d dlmZ G dd dZG dd deZG d	d
 d
eZdS )    N)CountryCode)convert_response)prefix_country_codec                   @   sX   e Zd ZdZdZdZdZdZdd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd ZdS )
BaseClientz.Base class for both OTPClient & AsyncOTPClientzhttps://api.msg91.comz/api/sendotp.phpz/api/retryotp.phpz/api/verifyRequestOTP.phpc                 C   s
   || _ d S N)auth_key)selfr    r	   4/tmp/pip-unpacked-wheel-c1x4am86/msg91_otp/client.py__init__   s    zBaseClient.__init__c                 C   s   | j | j S r   )base_urlotp_endpointr   r	   r	   r
   get_otp_url   s    zBaseClient.get_otp_urlc                 C   s   | j | j S r   )r   otp_retry_endpointr   r	   r	   r
   get_resend_otp_url   s    zBaseClient.get_resend_otp_urlc                 C   s   | j | j S r   )r   verify_otp_endpointr   r	   r	   r
   get_verify_otp_url   s    zBaseClient.get_verify_otp_urlc                 K   s   t tjt|}|| jd}d|kr2|d|d< d|krH|d|d< d|kr|d|d< d|krd|d kr|d dd|d< n(d|krd|d kr|d  d |d< d|kr|d|d< |S )	NmobileauthkeymessageZsenderotpz##OTP## z ##OTP##Z
otp_length)r   r   INDIAstrr   getreplacestripr   receiverkwargspayloadr	   r	   r
   get_otp_payload   s"    zBaseClient.get_otp_payloadc                 K   s    t tjt|}|| jd}tS )Nr   )r   r   r   r   r   Zpaylaodr   r	   r	   r
   get_resend_otp_payload6   s
    z!BaseClient.get_resend_otp_payloadc                 C   s.   t tjt|}| j||d}ddi}||fS )N)r   r   r   zContent-typez!application/x-www-form-urlencoded)r   r   r   r   r   )r   r   	otp_valuer"   headersr	   r	   r
   get_verify_payload_headers=   s    z%BaseClient.get_verify_payload_headersN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r#   r$   r'   r	   r	   r	   r
   r      s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )		OTPClientzJSynchronous OTP client
    Use this class for blocking request to API
    c                 K   s4   |   }| j|f|}tj||d}t||d}|S )a  Request the Service to send OTP message to given number
        Args:
            receiver(str): 10 digit mobile number with country code of reciever

            message(str, optional): text message to send along with OTP
            sender(str, optional): the name to appear in SMS as sender
            otp (int, optional): the opt value to send, if not service will generate
            otp_length (int, optional): the length of otp. default 4, max 9
        Returns:
            a response object with status and status message
        params)
identifier)r   r#   httpxpostr   )r   r    r!   otp_urlr"   service_response	_responser	   r	   r
   send_otpK   s
    zOTPClient.send_otpc                 K   s0   |   }| j|f|}tj||d}t|}|S )zResend OTP request
        Args:
            receiver(str): 10 digit mobile number with country code of receiver
        Returns:
            a response object with status and status message
        r-   )r   r$   r0   r1   r   )r   r    r!   	retry_urlr"   r3   r4   r	   r	   r
   
resend_otp]   s
    zOTPClient.resend_otpc                 C   s4   |   }| ||\}}tj|||d}t|}|S )a  Request to verify OTP with given mobile number
        Args:
            mobile(str): mobile number to verify otp
            otp_value(int): the otp value to verify against
        Returns:
             a response object with status and status message
        r.   r&   )r   r'   r0   r1   r   )r   r   r%   
verify_urlr"   r&   r3   r4   r	   r	   r
   
verify_otpj   s
    zOTPClient.verify_otpNr(   r)   r*   r+   r5   r7   r:   r	   r	   r	   r
   r,   G   s   r,   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	AsyncOTPClientzOAsynchronous OTP client
    Use this class for non-blocking request to API
    c              
      sX   |   }| j|f|}t 4 I d H }|j||dI d H }W 5 Q I d H R X t|}|S Nr-   )r   r#   r0   AsyncClientr1   r   )r   r    r!   r2   r"   clientr3   r4   r	   r	   r
   r5   }   s    $zAsyncOTPClient.send_otpc              
      sX   |   }| j|f|}t 4 I d H }|j||dI d H }W 5 Q I d H R X t|}|S r=   )r   Zget_resend_payloadr0   r>   r1   r   )r   r    r!   r6   r"   r?   r3   r4   r	   r	   r
   r7      s    $zAsyncOTPClient.resend_otpc           	   
      s\   |   }| ||\}}t 4 I d H }|j|||dI d H }W 5 Q I d H R X t|}|S )Nr8   )r   r'   r0   r>   r1   r   )	r   r   r%   r9   r"   r&   r?   r3   r4   r	   r	   r
   r:      s    &zAsyncOTPClient.verify_otpNr;   r	   r	   r	   r
   r<   y   s   r<   )	r0   Zmsg91_otp.country_coder   Zmsg91_otp.utilsr   r   r   r,   r<   r	   r	   r	   r
   <module>   s   ?2