o
    tBhF                     @   sx  d Z ddlZddlmZ ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 d	Zg d
Ze	jZe	jZe	jZe	jZe	jZe	jZe	jZe	jZe	jZe	jZe	jZejZejZe	jZe	jZe	jZe	jZe	jZe	jZe	j Z e	j!Z!e	j"Z"dd Z#d"ddZ$d"ddZ%d"ddZ&d#ddZ'd#ddZ(G dd dZ)G dd dZ*G dd dZ+G dd dZ,G d d! d!Z-dS )$z Firebase Cloud Messaging module.    N)http)_auth)_http_client)_messaging_encoder)_messaging_utils)_utils
_messaging)AndroidConfigAndroidFCMOptionsAndroidNotification
APNSConfigAPNSFCMOptionsAPNSPayloadApsApsAlertBatchResponseCriticalSound	ErrorInfo
FCMOptionsLightSettingsMessageMulticastMessageNotificationQuotaExceededErrorSenderIdMismatchErrorSendResponseThirdPartyAuthErrorTopicManagementResponseUnregisteredErrorWebpushConfigWebpushFCMOptionsWebpushNotificationWebpushNotificationActionsendsend_allsend_multicastsubscribe_to_topicunsubscribe_from_topicc                 C   s   t | ttS N)r   get_app_service_MESSAGING_ATTRIBUTE_MessagingService)app r-   o/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/firebase_admin/messaging.py_get_messaging_service^   s   r/   Fc                 C      t || |S )a  Sends the given message via Firebase Cloud Messaging (FCM).

    If the ``dry_run`` mode is enabled, the message will not be actually delivered to the
    recipients. Instead FCM performs all the usual validations, and emulates the send operation.

    Args:
        message: An instance of ``messaging.Message``.
        dry_run: A boolean indicating whether to run the operation in dry run mode (optional).
        app: An App instance (optional).

    Returns:
        string: A message ID string that uniquely identifies the sent message.

    Raises:
        FirebaseError: If an error occurs while sending the message to the FCM service.
        ValueError: If the input arguments are invalid.
    )r/   r#   )messagedry_runr,   r-   r-   r.   r#   a      r#   c                 C   r0   )a  Sends the given list of messages via Firebase Cloud Messaging as a single batch.

    If the ``dry_run`` mode is enabled, the message will not be actually delivered to the
    recipients. Instead FCM performs all the usual validations, and emulates the send operation.

    Args:
        messages: A list of ``messaging.Message`` instances.
        dry_run: A boolean indicating whether to run the operation in dry run mode (optional).
        app: An App instance (optional).

    Returns:
        BatchResponse: A ``messaging.BatchResponse`` instance.

    Raises:
        FirebaseError: If an error occurs while sending the message to the FCM service.
        ValueError: If the input arguments are invalid.
    )r/   r$   )messagesr2   r,   r-   r-   r.   r$   u   r3   r$   c                    s6   t  ts	td fdd jD }t|||S )a  Sends the given mutlicast message to all tokens via Firebase Cloud Messaging (FCM).

    If the ``dry_run`` mode is enabled, the message will not be actually delivered to the
    recipients. Instead FCM performs all the usual validations, and emulates the send operation.

    Args:
        multicast_message: An instance of ``messaging.MulticastMessage``.
        dry_run: A boolean indicating whether to run the operation in dry run mode (optional).
        app: An App instance (optional).

    Returns:
        BatchResponse: A ``messaging.BatchResponse`` instance.

    Raises:
        FirebaseError: If an error occurs while sending the message to the FCM service.
        ValueError: If the input arguments are invalid.
    z@Message must be an instance of messaging.MulticastMessage class.c                    s.   g | ]}t  j j j j j j|d qS ))datanotificationandroidwebpushapnsfcm_optionstoken)r   r5   r6   r7   r8   r9   r:   ).0r;   multicast_messager-   r.   
<listcomp>   s    
z"send_multicast.<locals>.<listcomp>)
isinstancer   
ValueErrortokensr/   r$   )r>   r2   r,   r4   r-   r=   r.   r%      s   

	r%   c                 C      t || |dS )a4  Subscribes a list of registration tokens to an FCM topic.

    Args:
        tokens: A non-empty list of device registration tokens. List may not have more than 1000
            elements.
        topic: Name of the topic to subscribe to. May contain the ``/topics/`` prefix.
        app: An App instance (optional).

    Returns:
        TopicManagementResponse: A ``TopicManagementResponse`` instance.

    Raises:
        FirebaseError: If an error occurs while communicating with instance ID service.
        ValueError: If the input arguments are invalid.
    ziid/v1:batchAddr/   make_topic_management_requestrB   topicr,   r-   r-   r.   r&         r&   c                 C   rC   )a<  Unsubscribes a list of registration tokens from an FCM topic.

    Args:
        tokens: A non-empty list of device registration tokens. List may not have more than 1000
            elements.
        topic: Name of the topic to unsubscribe from. May contain the ``/topics/`` prefix.
        app: An App instance (optional).

    Returns:
        TopicManagementResponse: A ``TopicManagementResponse`` instance.

    Raises:
        FirebaseError: If an error occurs while communicating with instance ID service.
        ValueError: If the input arguments are invalid.
    ziid/v1:batchRemoverD   rF   r-   r-   r.   r'      rH   r'   c                   @   s0   e Zd ZdZdd Zedd Zedd ZdS )	r   zBAn error encountered when performing a topic management operation.c                 C   s   || _ || _d S r(   )_index_reason)selfindexreasonr-   r-   r.   __init__   s   
zErrorInfo.__init__c                 C      | j S )zBIndex of the registration token to which this error is related to.)rI   rK   r-   r-   r.   rL         zErrorInfo.indexc                 C   rO   )z*String describing the nature of the error.)rJ   rP   r-   r-   r.   rM      rQ   zErrorInfo.reasonN)__name__
__module____qualname____doc__rN   propertyrL   rM   r-   r-   r-   r.   r      s    
r   c                   @   <   e Zd ZdZdd Zedd Zedd Zedd	 Zd
S )r   z8The response received from a topic management operation.c                 C   s   t |tr	d|vrtd|d| _d| _g | _t|d D ]"\}}d|v r:|  jd7  _| jt	||d  q|  jd7  _qd S )Nresultsz*Unexpected topic management response: {0}.r   error   )
r@   dictrA   format_success_count_failure_count_errors	enumerateappendr   )rK   resprL   resultr-   r-   r.   rN      s   z TopicManagementResponse.__init__c                 C   rO   )zCNumber of tokens that were successfully subscribed or unsubscribed.r]   rP   r-   r-   r.   success_count   rQ   z%TopicManagementResponse.success_countc                 C   rO   )zLNumber of tokens that could not be subscribed or unsubscribed due to errors.)r^   rP   r-   r-   r.   failure_count   rQ   z%TopicManagementResponse.failure_countc                 C   rO   )z;A list of ``messaging.ErrorInfo`` objects (possibly empty).)r_   rP   r-   r-   r.   errors   rQ   zTopicManagementResponse.errorsN)	rR   rS   rT   rU   rN   rV   re   rf   rg   r-   r-   r-   r.   r      s    

r   c                   @   rW   )r   z:The response received from a batch request to the FCM API.c                 C   s   || _ tdd |D | _d S )Nc                 S   s   g | ]}|j r|qS r-   )success)r<   rb   r-   r-   r.   r?     s    z*BatchResponse.__init__.<locals>.<listcomp>)
_responseslenr]   )rK   	responsesr-   r-   r.   rN     s   zBatchResponse.__init__c                 C   rO   )z>A list of ``messaging.SendResponse`` objects (possibly empty).)ri   rP   r-   r-   r.   rk     rQ   zBatchResponse.responsesc                 C   rO   r(   rd   rP   r-   r-   r.   re     s   zBatchResponse.success_countc                 C   s   t | j| j S r(   )rj   rk   re   rP   r-   r-   r.   rf     s   zBatchResponse.failure_countN)	rR   rS   rT   rU   rN   rV   rk   re   rf   r-   r-   r-   r.   r     s    

r   c                   @   rW   )r   zHThe response received from an individual batched request to the FCM API.c                 C   s&   || _ d | _|r|dd | _d S d S )Nname)
_exception_message_idget)rK   rb   	exceptionr-   r-   r.   rN     s
   zSendResponse.__init__c                 C   rO   )z9A message ID string that uniquely identifies the message.)rn   rP   r-   r-   r.   
message_id  rQ   zSendResponse.message_idc                 C   s   | j duo| j S )z3A boolean indicating if the request was successful.N)rn   rm   rP   r-   r-   r.   rh   $  s   zSendResponse.successc                 C   rO   )zTA ``FirebaseError`` if an error occurs while sending the message to the FCM service.)rm   rP   r-   r-   r.   rp   )  rQ   zSendResponse.exceptionN)	rR   rS   rT   rU   rN   rV   rq   rh   rp   r-   r-   r-   r.   r     s    

r   c                   @   s   e Zd ZdZdZdZdZddiZe	 Z
eeeeedZdd	 Zed
d Zd$ddZd$ddZdd Zdd Zdd Zdd Zdd Zdd Zedd Zedd  Zed!d" Zd#S )%r+   zKService class that implements Firebase Cloud Messaging (FCM) functionality.z8https://fcm.googleapis.com/v1/projects/{0}/messages:sendz https://fcm.googleapis.com/batchzhttps://iid.googleapis.comaccess_token_authtrue)APNS_AUTH_ERRORQUOTA_EXCEEDEDSENDER_ID_MISMATCHTHIRD_PARTY_AUTH_ERRORUNREGISTEREDc                 C   sp   |j }|s	tdtj|| _ddtjd| _|j	
dtj}tj|j |d| _t|j | _d S )NzProject ID is required to access Cloud Messaging service. Either set the projectId option, or use service account credentials. Alternatively, set the GOOGLE_CLOUD_PROJECT environment variable.2zfire-admin-python/{0})zX-GOOG-API-FORMAT-VERSIONzX-FIREBASE-CLIENThttpTimeout)
credentialtimeout)
project_idrA   r+   FCM_URLr\   _fcm_urlfirebase_admin__version___fcm_headersoptionsro   r   DEFAULT_TIMEOUT_SECONDSJsonHttpClientr{   get_credential_clientr   authorized_http
_transport)rK   r,   r}   r|   r-   r-   r.   rN   @  s   

z_MessagingService.__init__c                 C   s   t |ts	td| j|S )Nz7Message must be an instance of messaging.Message class.)r@   r   rA   JSON_ENCODERdefault)clsr1   r-   r-   r.   encode_messageQ  s   
z _MessagingService.encode_messageFc              
   C   sV   |  ||}z| jjd| j| j|d}W |d S  tjjy* } z| |d}~ww )z2Sends the given message to FCM via the FCM v1 API.post)urlheadersjsonNrl   )	_message_datar   bodyr   r   requests
exceptionsRequestException_handle_fcm_error)rK   r1   r2   r5   rb   rY   r-   r-   r.   r#   W  s   	
z_MessagingService.sendc           	   
      s   t |ts	tdt|dkrtdg   fdd}tj|tjd}|D ]}t	
||}tjjjjd|jd}|| q&z	|  W t S  ty` } z|d	}~ww )
z2Sends the given messages to FCM via the batch API.z7messages must be a list of messaging.Message instances.i  z1messages must not contain more than 500 elements.c                    s*   d }|r	 |}t||} | d S r(   )_handle_batch_errorr   ra   )_responserY   rp   send_responserk   rK   r-   r.   batch_callbacko  s
   

z2_MessagingService.send_all.<locals>.batch_callback)callback	batch_uriPOST)r   postprocurimethodr   r   N)r@   listrA   rj   r   BatchHttpRequestr+   FCM_BATCH_URLr   dumpsr   HttpRequestr   	_postprocr   r   addexecute	Exceptionr   r   )	rK   r4   r2   r   batchr1   r   reqrY   r-   r   r.   r$   f  s6   


z_MessagingService.send_allc           	   
   C   s   t |tr|g}t |tr|stddd |D }|r tdt |tr'|s+td|ds5d|}||d}d	tj|}z| jj	d
||tj
d}W t|S  tjjyd } z| |d}~ww )z;Invokes the IID service for topic management functionality.z7Tokens must be a string or a non-empty list of strings.c                 S   s   g | ]}t |tr|s|qS r-   )r@   str)r<   tr-   r-   r.   r?     s    zC_MessagingService.make_topic_management_request.<locals>.<listcomp>z!Tokens must be non-empty strings.z!Topic must be a non-empty string.z/topics/z/topics/{0})toregistration_tokensz{0}/{1}r   )r   r   r   N)r@   r   r   rA   
startswithr\   r+   IID_URLr   r   IID_HEADERSr   r   r   _handle_iid_errorr   )	rK   rB   rG   	operationinvalid_strr5   r   rb   rY   r-   r-   r.   rE     s6   


	
z/_MessagingService.make_topic_management_requestc                 C   s   dt |i}|rd|d< |S )Nr1   Tvalidate_only)r+   r   )rK   r1   r2   r5   r-   r-   r.   r     s   z_MessagingService._message_datac                 C   s   t | S )z'Handle response from batch API request.)r   loadsdecode)rK   r   r   r-   r-   r.   r     s   z_MessagingService._postprocc                 C      t |tjS )z)Handles errors received from the FCM API.)r   #handle_platform_error_from_requestsr+   _build_fcm_error_requestsrK   rY   r-   r-   r.   r        z#_MessagingService._handle_fcm_errorc                 C   s   |j du r
t|i }z|j  }t|tr|}W n	 ty#   Y nw |d}d}|r3d|}nd|j j	|j j
 }t||S )z1Handles errors received from the Instance ID API.NrY   z(Error while calling the IID service: {0}z4Unexpected HTTP response with status: {0}; body: {1})r   r   handle_requests_errorr   r@   r[   rA   ro   r\   status_codecontentr   )rK   rY   r5   parsed_bodycodemsgr-   r-   r.   r     s&   




z#_MessagingService._handle_iid_errorc                 C   r   )zMHandles errors received from the googleapiclient while making batch requests.)r   *handle_platform_error_from_googleapiclientr+    _build_fcm_error_googleapiclientr   r-   r-   r.   r     r   z%_MessagingService._handle_batch_errorc                 C   s"   |  |}|r||||jdS dS zfParses an error response from the FCM API and creates a FCM-specific exception if
        appropriate.)causehttp_responseN)_build_fcm_errorr   )r   rY   r1   
error_dictexc_typer-   r-   r.   r     s   
z+_MessagingService._build_fcm_error_requestsc                 C   s    |  |}|r||||dS dS r   )r   )r   rY   r1   r   r   r   r-   r-   r.   r     s   
z2_MessagingService._build_fcm_error_googleapiclientc                 C   sF   |sd S d }| dg D ]}| ddkr| d} nqtj |S )Ndetailsz@typez3type.googleapis.com/google.firebase.fcm.v1.FcmError	errorCode)ro   r+   FCM_ERROR_TYPES)r   r   fcm_codedetailr-   r-   r.   r     s   
z"_MessagingService._build_fcm_errorN)F)rR   rS   rT   rU   r~   r   r   r   r   MessageEncoderr   r   r   r   r   r   rN   classmethodr   r#   r$   rE   r   r   r   r   r   r   r   r   r-   r-   r-   r.   r+   /  s<    


%

r+   )FNr(   ).rU   r   googleapiclientr   r   r   r   r   r   r   r   r*   __all__r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r   r   r   r   r/   r#   r$   r%   r&   r'   r   r   r   r   r+   r-   r-   r-   r.   <module>   sZ   $




 