o
    Thc                     @   s   d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZmZ eedr>d	d Znd
d ZG dd deZG dd deZG dd deZG dd deZdS )zlinebot.v3.webhook module.    N   )InvalidSignatureError)EventMessageEvent)UnknownEvent)LOGGERPY3safe_compare_digestcompare_digestc                 C   s   t | |S ah  compare_digest function.

        If hmac module has compare_digest function, use it.
        Or not, use linebot.v3.utils.safe_compare_digest.

        :param val1: string or bytes for compare
        :type val1: str | bytes
        :param val2: string or bytes for compare
        :type val2: str | bytes
        :rtype: bool
        :return: result
        )hmacr
   val1val2 r   S/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/linebot/v3/webhook.pyr
   !   s   c                 C   s
   t | |S r   )r	   r   r   r   r   r
   0   s   
c                   @   s    e Zd ZdZdd Zdd ZdS )SignatureValidatorzkSignature validator.

    https://developers.line.biz/en/reference/messaging-api/#signature-validation
    c                 C   s   | d| _dS )V__init__ method.

        :param str channel_secret: Channel secret (as text)
        utf-8N)encodechannel_secretselfr   r   r   r   __init__F   s   zSignatureValidator.__init__c                 C   s2   t | j|dtj }t|dt	|S )zCheck signature.

        :param str body: Request body (as text)
        :param str signature: X-Line-Signature value (as text)
        :rtype: bool
        r   )
r   newr   r   hashlibsha256digestr
   base64	b64encode)r   body	signaturegen_signaturer   r   r   validateM   s   zSignatureValidator.validateN)__name__
__module____qualname____doc__r   r#   r   r   r   r   r   @   s    r   c                   @   s   e Zd ZdZdddZdS )WebhookPayloadz_Webhook Payload.

    https://developers.line.biz/en/reference/messaging-api/#request-body
    Nc                 C   s   || _ || _dS )z__init__ method.

        :param events: Information about the events.
        :type events: list[T <= :py:class:`linebot.v3.webhooks.models.Event`]
        :param str destination: User ID of a bot that should receive webhook events.
        Neventsdestination)r   r*   r+   r   r   r   r   e   s   
zWebhookPayload.__init__)NN)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dZdS )	WebhookParserzWebhook Parser.c                 C   s   t || _dS r   N)r   signature_validatorr   r   r   r   r   s   s   zWebhookParser.__init__Fc              	   C   s   | j ||std| t|}g }|d D ]&}z
|t| W q ty>   t	
d|d   |t| Y qw |rJt||ddS |S )a  Parse webhook request body as text.

        :param str body: Webhook request body (as text)
        :param str signature: X-Line-Signature value (as text)
        :param bool as_payload: (optional) True to return WebhookPayload object.
        :rtype: list[T <= :py:class:`linebot.v3.webhooks.models.Event`]
            | :py:class:`linebot.v3.webhook.WebhookPayload`
        :return: Events list, or WebhookPayload instance
        zInvalid signature. signature=r*   zUnknown event type. type=typer+   r)   )r.   r#   r   jsonloadsappendr   	from_dict
ValueErrorr   infor   new_from_json_dictr(   get)r   r    r!   
as_payload	body_jsonr*   eventr   r   r   parsez   s    

zWebhookParser.parseN)F)r$   r%   r&   r'   r   r;   r   r   r   r   r,   p   s    r,   c                   @   sb   e Zd ZdZdd ZdddZdd Zd	d
 ZdddZe	dd Z
edd ZedddZdS )WebhookHandlerzaWebhook Handler.

    Please read https://github.com/line/line-bot-sdk-python#webhookhandler
    c                 C   s   t || _i | _d| _dS r-   )r,   parser	_handlers_defaultr   r   r   r   r      s   

zWebhookHandler.__init__Nc                    s    fdd}|S )a  Add handler method.

        :param event: Specify a kind of Event which you want to handle
        :type event: T <= :py:class:`linebot.v3.webhooks.models.Event` class
        :param message: (optional) If event is MessageEvent,
            specify kind of Messages which you want to handle
        :type: message: T <= :py:class:`linebot.v3.webhooks.models.message_content.MessageContent` class
        :rtype: func
        :return: decorator
        c                    s@   t ttfrD ]
}j|  |d q	| S j|  d | S N)message)
isinstancelisttuple_WebhookHandler__add_handler)funcitr:   rA   r   r   r   	decorator   s   z%WebhookHandler.add.<locals>.decoratorr   )r   r:   rA   rI   r   rH   r   add   s   	zWebhookHandler.addc                    s    fdd}|S )zUSet default handler method.

        :rtype: func
        :return: decorator
        c                    s
   |  _ | S N)r?   )rF   r   r   r   rI      s   z)WebhookHandler.default.<locals>.decoratorr   )r   rI   r   rL   r   default   s   zWebhookHandler.defaultc                 C   s   | j j||dd}|jD ]H}d}d}t|tr'| |j|jj}| j	|d}|du r8| |j}| j	|d}|du r?| j
}|du rMtd| d  q| ||| qdS )zHandle webhook.

        :param str body: Webhook request body (as text)
        :param str signature: X-Line-Signature value (as text)
        T)r8   NzNo handler of z and no default handler)r=   r;   r*   rB   r    _WebhookHandler__get_handler_key	__class__rA   r>   r7   r?   r   r5   _WebhookHandler__invoke_func)r   r    r!   payloadr:   rF   keyr   r   r   handle   s$   


zWebhookHandler.handlec                 C   s   | j ||d}|| j|< d S r@   )rN   r>   )r   rF   r:   rA   rR   r   r   r   __add_handler   s   zWebhookHandler.__add_handlerc                 C   sH   |  |\}}|s|dkr|||j d S |dkr|| d S |  d S )N   r   )_WebhookHandler__get_args_countr+   )clsrF   r:   rQ   has_varargs
args_countr   r   r   __invoke_func   s   
zWebhookHandler.__invoke_funcc                 C   s@   t rt| }|jd ut|jfS t| }|jd ut|jfS rK   )r   inspectgetfullargspecvarargslenargs
getargspec)rF   arg_specr   r   r   __get_args_count   s
   

zWebhookHandler.__get_args_countc                 C   s   |d u r| j S | j d |j  S )N_)r$   )r:   rA   r   r   r   __get_handler_key   s   z WebhookHandler.__get_handler_keyrK   )r$   r%   r&   r'   r   rJ   rM   rS   rE   classmethodrP   staticmethodrV   rN   r   r   r   r   r<      s    
	

	
r<   )r'   r   r   r   r[   r0   
exceptionsr   webhooksr   r   models.eventsr   utilsr   r   r	   hasattrr
   objectr   r(   r,   r<   r   r   r   r   <module>   s"   

'