o
    ˷eG                     @   s  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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)_gapic_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/ideatree/venv/lib/python3.10/site-packages/firebase_admin/messaging.py_get_messaging_service_   s   r0   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.
    )r0   r$   )messagedry_runr-   r.   r.   r/   r$   b      r$   c                 C   r1   )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.
    )r0   r%   )messagesr3   r-   r.   r.   r/   r%   v   r4   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   r6   r7   r8   r9   r:   r;   ).0r<   multicast_messager.   r/   
<listcomp>   s    
z"send_multicast.<locals>.<listcomp>)
isinstancer   
ValueErrortokensr0   r%   )r?   r3   r-   r5   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r0   make_topic_management_requestrC   topicr-   r.   r.   r/   r'         r'   c                 C   rD   )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:batchRemoverE   rG   r.   r.   r/   r(      rI   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.)rJ   rL   r.   r.   r/   rM         zErrorInfo.indexc                 C   rP   )z*String describing the nature of the error.)rK   rQ   r.   r.   r/   rN      rR   zErrorInfo.reasonN)__name__
__module____qualname____doc__rO   propertyrM   rN   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   )
rA   dictrB   format_success_count_failure_count_errors	enumerateappendr   )rL   resprM   resultr.   r.   r/   rO      s   z TopicManagementResponse.__init__c                 C   rP   )zCNumber of tokens that were successfully subscribed or unsubscribed.r^   rQ   r.   r.   r/   success_count   rR   z%TopicManagementResponse.success_countc                 C   rP   )zLNumber of tokens that could not be subscribed or unsubscribed due to errors.)r_   rQ   r.   r.   r/   failure_count   rR   z%TopicManagementResponse.failure_countc                 C   rP   )z;A list of ``messaging.ErrorInfo`` objects (possibly empty).)r`   rQ   r.   r.   r/   errors   rR   zTopicManagementResponse.errorsN)	rS   rT   rU   rV   rO   rW   rf   rg   rh   r.   r.   r.   r/   r      s    

r   c                   @   rX   )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=   rc   r.   r.   r/   r@     s    z*BatchResponse.__init__.<locals>.<listcomp>)
_responseslenr^   )rL   	responsesr.   r.   r/   rO     s   zBatchResponse.__init__c                 C   rP   )z>A list of ``messaging.SendResponse`` objects (possibly empty).)rj   rQ   r.   r.   r/   rl   	  rR   zBatchResponse.responsesc                 C   rP   r)   re   rQ   r.   r.   r/   rf     s   zBatchResponse.success_countc                 C   s   t | j| j S r)   )rk   rl   rf   rQ   r.   r.   r/   rg     s   zBatchResponse.failure_countN)	rS   rT   rU   rV   rO   rW   rl   rf   rg   r.   r.   r.   r/   r     s    

r   c                   @   rX   )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)rL   rc   	exceptionr.   r.   r/   rO     s
   zSendResponse.__init__c                 C   rP   )z9A message ID string that uniquely identifies the message.)ro   rQ   r.   r.   r/   
message_id   rR   zSendResponse.message_idc                 C   s   | j duo| j S )z3A boolean indicating if the request was successful.N)ro   rn   rQ   r.   r.   r/   ri   %  s   zSendResponse.successc                 C   rP   )zTA ``FirebaseError`` if an error occurs while sending the message to the FCM service.)rn   rQ   r.   r.   r/   rq   *  rR   zSendResponse.exceptionN)	rS   rT   rU   rV   rO   rW   rr   ri   rq   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   sn   |j }|s	tdtj|| _ddtjd| _|j	
dtj}|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_idrB   r,   FCM_URLr]   _fcm_urlfirebase_admin__version___fcm_headersoptionsrp   r   DEFAULT_TIMEOUT_SECONDSr|   get_credential_credentialJsonHttpClient_clientr   authorized_http_build_transport)rL   r-   r~   r}   r.   r.   r/   rO   A  s   
z_MessagingService.__init__c                 C   s   t |ts	td| j|S )Nz7Message must be an instance of messaging.Message class.)rA   r   rB   JSON_ENCODERdefault)clsr2   r.   r.   r/   encode_messageR  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jsonNrm   )	_message_datar   bodyr   r   requests
exceptionsRequestException_handle_fcm_error)rL   r2   r3   r6   rc   rZ   r.   r.   r/   r$   X  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}j	}|D ]}t
||}tj|jjd|jd}|| q,z	|  W t S  tye }	 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   rb   )_responserZ   rq   send_responserl   rL   r.   r/   batch_callbackp  s
   

z2_MessagingService.send_all.<locals>.batch_callback)callback	batch_uriPOST)r   postprocurimethodr   r   N)rA   listrB   rk   r   BatchHttpRequestr,   FCM_BATCH_URLr   r   r   dumpsr   HttpRequest	_postprocr   r   addexecute	Exceptionr   r   )
rL   r5   r3   r   batch	transportr2   r   reqrZ   r.   r   r/   r%   g  s8   


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.   )rA   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)rA   r   r   rB   
startswithr]   r,   IID_URLr   r   IID_HEADERSr   r   r   _handle_iid_errorr   )	rL   rC   rH   	operationinvalid_strr6   r   rc   rZ   r.   r.   r/   rF     s6   


	
z/_MessagingService.make_topic_management_requestc                 C   s   dt |i}|rd|d< |S )Nr2   Tvalidate_only)r,   r   )rL   r2   r3   r6   r.   r.   r/   r     s   z_MessagingService._message_datac                 C   s   t | S )z'Handle response from batch API request.)r   loadsdecode)rL   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rL   rZ   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.NrZ   z(Error while calling the IID service: {0}z4Unexpected HTTP response with status: {0}; body: {1})r   r   handle_requests_errorr   rA   r\   rB   rp   r]   status_codecontentr   )rL   rZ   r6   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   rZ   r2   
error_dictexc_typer.   r.   r/   r     s   
z+_MessagingService._build_fcm_error_requestsc                 C   s    |  |}|r||||dS dS r   )r   )r   rZ   r2   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)rp   r,   FCM_ERROR_TYPES)r   r   fcm_codedetailr.   r.   r/   r     s   
z"_MessagingService._build_fcm_errorN)F)rS   rT   rU   rV   r   r   r   r   r   MessageEncoderr   r   r   r   r   r   rO   classmethodr   r$   r%   rF   r   r   r   r   r   r   r   r   r.   r.   r.   r/   r,   0  s<    


&

r,   )FNr)   )/rV   r   googleapiclientr   r   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   r0   r$   r%   r&   r'   r(   r   r   r   r   r,   r.   r.   r.   r/   <module>   s\   $




 