U
    ÓZjz   ã                   @   sÌ   d dl Z d dlmZ d dlmZ d dlZddlmZmZm	Z	 ddl
mZ d dlZd dlm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G dd„ deƒZddd„Zdd„ Zddd„ZdS )é    N)Újson)ÚElementTreeé   )ÚsessionÚ_stream_bufferÚcurrent_stream)Úlogger)Úpprintc                       s4   e Zd ZdZi f‡ fdd„	Zdd„ Zdd„ Z‡  ZS )Ú_Fielda-  Container to represent Alexa Request Data.

    Initialized with request_json and creates a dict object with attributes
    to be accessed via dot notation or as a dict key-value.

    Parameters within the request_json that contain their data as a json object
    are also represented as a _Field object.

    Example:

    payload_object = _Field(alexa_josn_payload)

    request_type_from_keys = payload_object['request']['type']
    request_type_from_attrs = payload_object.request.type

    assert request_type_from_keys == request_type_from_attrs
    c                    s@   t t| ƒ |¡ | ¡ D ]"\}}t|tƒr2t|ƒ}|| |< qd S ©N)Úsuperr
   Ú__init__ÚitemsÚ
isinstanceÚdict)ÚselfZrequest_jsonÚkeyÚvalue©Ú	__class__© úS/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/flask_ask/models.pyr      s
    
z_Field.__init__c                 C   s"   d|krt  |  |¡¡S |  |¡S )NÚ	timestamp)Ú	aniso8601Zparse_datetimeÚget)r   Úattrr   r   r   Ú__getattr__&   s    z_Field.__getattr__c                 C   s   |   ||¡ d S r   )Ú__setitem__)r   r   r   r   r   r   Ú__setattr__,   s    z_Field.__setattr__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ú__classcell__r   r   r   r   r
      s   r
   c                   @   s8   e Zd Zdd„ Zddd„Zddd„Zdd	„ Zd
d„ ZdS )Ú	_Responsec                 C   s   d | _ dt|ƒi| _d S )NÚoutputSpeech)Z_json_defaultÚ_output_speechÚ	_response©r   Úspeechr   r   r   r   2   s     ÿz_Response.__init__Nc                 C   s   d||dœ}|| j d< | S )NZSimple)ÚtypeÚtitleÚcontentÚcard©r'   )r   r+   r,   r-   r   r   r   Úsimple_card8   s    ý
z_Response.simple_cardc                 C   sV   d||dœ}t ||fƒr i |d< |d k	r4||d d< |d k	rH||d d< || jd< | S )NZStandard)r*   r+   ÚtextÚimageZsmallImageUrlZlargeImageUrlr-   )Úanyr'   )r   r+   r0   Zsmall_image_urlZlarge_image_urlr-   r   r   r   Ústandard_cardA   s    ý
z_Response.standard_cardc                 C   s   ddi}|| j d< | S )Nr*   ZLinkAccountr-   r.   )r   r-   r   r   r   Úlink_account_cardR   s    
z_Response.link_account_cardc                 C   sX   d| j tjdœ}i }ttdƒr>tj}t |¡r2dnd}|||< t|f|Ž tj	|f|ŽS )Nz1.0)ÚversionÚresponseZsessionAttributesÚattributes_encoderÚclsÚdefault)
r'   r   Ú
attributesÚhasattrr7   ÚinspectÚisclassÚ_dbgdumpr   Údumps)r   Zresponse_wrapperÚkwZjson_encoderZ	kwargnamer   r   r   Úrender_responseW   s    ý
z_Response.render_response)NN)NNNN)r   r    r!   r   r/   r3   r4   rA   r   r   r   r   r$   0   s
   
	
r$   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú	statementc                    s   t t| ƒ |¡ d| jd< d S )NTÚshouldEndSession)r   rB   r   r'   r(   r   r   r   r   i   s    zstatement.__init__)r   r    r!   r   r#   r   r   r   r   rB   g   s   rB   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Úquestionc                    s   t t| ƒ |¡ d| jd< d S )NFrC   )r   rD   r   r'   r(   r   r   r   r   p   s    zquestion.__init__c                 C   s   dt |ƒi}|| jd< | S )Nr%   Úreprompt)r&   r'   )r   rE   r   r   r   rE   t   s    
zquestion.reprompt)r   r    r!   r   rE   r#   r   r   r   r   rD   n   s   rD   c                       sl   e Zd ZdZd‡ fdd„	Zddd„Zddd	„Zddd„Zdd„ Zdd„ Z	ddd„Z
dd„ Zddd„Z‡  ZS )Úaudioa\  Returns a response object with an Amazon AudioPlayer Directive.

    Responses for LaunchRequests and IntentRequests may include outputSpeech in addition to an audio directive

    Note that responses to AudioPlayer requests do not allow outputSpeech.
    These must only include AudioPlayer Directives.

    @ask.intent('PlayFooAudioIntent')
    def play_foo_audio():
        speech = 'playing from foo'
        stream_url = www.foo.com
        return audio(speech).play(stream_url)


    @ask.intent('AMAZON.PauseIntent')
    def stop_audio():
        return audio('Ok, stopping the audio').stop()
    Ú c                    s(   t t| ƒ |¡ |si | _g | jd< d S )NÚ
directives)r   rF   r   r'   r(   r   r   r   r   Ž   s    zaudio.__init__r   c                 C   s:   d| j d< |  d¡}| j||d�|d< | j d  |¡ | S )zRSends a Play Directive to begin playback and replace current and enqueued streams.TrC   ÚREPLACE_ALL©Ú
stream_urlÚoffsetÚ	audioItemrH   )r'   Ú_play_directiveÚ_audio_itemÚappend©r   rK   rL   Ú	directiver   r   r   Úplay”   s
    

z
audio.playc                 C   sD   |   d¡}| j||dd�}tj|d d< ||d< | jd  |¡ | S )zGAdds stream to the queue. Does not impact the currently playing stream.ZENQUEUEF)rK   rL   Úpush_bufferÚstreamZexpectedPreviousTokenrM   rH   )rN   rO   r   Útokenr'   rP   )r   rK   rL   rR   Ú
audio_itemr   r   r   Úenqueue�   s    
zaudio.enqueueNc                 C   s0   |   d¡}| j||d�|d< | jd  |¡ | S )zRReplace all streams in the queue but does not impact the currently playing stream.ZREPLACE_ENQUEUEDrJ   rM   rH   ©rN   rO   r'   rP   rQ   r   r   r   Ú	play_next§   s    
zaudio.play_nextc                 C   s*   |   d¡}|  ¡ |d< | jd  |¡ | S )z<Sends Play Directive to resume playback at the paused offsetrI   rM   rH   rY   )r   rR   r   r   r   Úresume¯   s    
zaudio.resumec                 C   s   i }d|d< ||d< |S )NzAudioPlayer.Playr*   ZplayBehaviorr   )r   ZbehaviorrR   r   r   r   rN   ¶   s    zaudio._play_directiveTc                 C   sj   di i}|d }|s4t j|d< t j|d< t j|d< n$||d< tt dd¡ƒ|d< ||d< |rft |¡ |S )zFBuilds an AudioPlayer Directive's audioItem and updates current_streamrU   ÚurlrV   ÚoffsetInMillisecondsi'  i † )	r   r\   rV   r]   ÚstrÚrandomÚrandintr   Úpush)r   rK   rL   rT   rW   rU   r   r   r   rO   ¼   s    


zaudio._audio_itemc                 C   s   | j d  ddi¡ | S )zDSends AudioPlayer.Stop Directive to stop the current stream playbackrH   r*   zAudioPlayer.Stop©r'   rP   )r   r   r   r   ÚstopÒ   s    z
audio.stopFc                 C   s6   i }d|d< |rd|d< nd|d< | j d  |¡ | S )a0  Clears queued streams and optionally stops current stream.

        Keyword Arguments:
            stop {bool}  set True to stop current current stream and clear queued streams.
                set False to clear queued streams and allow current stream to finish
                default: {False}
        zAudioPlayer.ClearQueuer*   Z	CLEAR_ALLZclearBehaviorZCLEAR_ENQUEUEDrH   rb   )r   rc   rR   r   r   r   Úclear_queue×   s    	
zaudio.clear_queue)rG   )r   )r   )Nr   )Nr   T)F)r   r    r!   r"   r   rS   rX   rZ   r[   rN   rO   rc   rd   r#   r   r   r   r   rF   z   s   
	



rF   c                 C   s0   || kr,| | }|d k	r ||ƒ}t |||ƒ d S r   )Úsetattr)ÚsrcÚdestr   Úconvertr   r   r   r   Ú	_copyattrë   s
    ri   c              
   C   sT   z$t  | ¡}|jdkr"d| dœW S W n$ t jk
rH } zW 5 d }~X Y nX d| dœS )NZspeakZSSML)r*   ZssmlZ	PlainText)r*   r0   )r   Ú
fromstringÚtagZ
ParseError)r)   ZxmldocÚer   r   r   r&   ó   s    

r&   é   c                 C   s    t j| |||d�}t |¡ d S )N)Úindentr9   r8   )r   r?   r   Údebug)Úobjrn   r9   r8   Úmsgr   r   r   r>   ý   s    r>   )N)rm   NN)r<   Zflaskr   Z	xml.etreer   r   Úcorer   r   r   rG   r   r_   r	   r   r
   Úobjectr$   rB   rD   rF   ri   r&   r>   r   r   r   r   Ú<module>   s   $7q

