U
    ccz                      @   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/flasktest/Project_env/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   Z
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   r@   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   rA   r   r'   r(   r   r   r   r   i   s    zstatement.__init__)r   r    r!   r   r#   r   r   r   r   rA   g   s   rA   c                       s$   e Zd Z fddZdd Z  ZS )questionc                    s   t t| | d| jd< d S )NFrB   )r   rC   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   rD   r   r   r   rD   t   s    
zquestion.reprompt)r   r    r!   r   rD   r#   r   r   r   r   rC   n   s   rC   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   rE   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.TrB   REPLACE_ALL
stream_urloffset	audioItemrG   )r'   _play_directive_audio_itemappendr   rJ   rK   	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)rJ   rK   push_bufferstreamZexpectedPreviousTokenrL   rG   )rM   rN   r   tokenr'   rO   )r   rJ   rK   rQ   
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_ENQUEUEDrI   rL   rG   rM   rN   r'   rO   rP   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 offsetrH   rL   rG   rX   )r   rQ   r   r   r   resume   s    
zaudio.resumec                 C   s   i }d|d< ||d< |S )NzAudioPlayer.Playr*   ZplayBehaviorr   )r   ZbehaviorrQ   r   r   r   rM      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_streamrT   urlrU   offsetInMillisecondsi'  i )	r   r[   rU   r\   strrandomrandintr   push)r   rJ   rK   rS   rV   rT   r   r   r   rN      s    


zaudio._audio_itemc                 C   s   | j d ddi | S )zDSends AudioPlayer.Stop Directive to stop the current stream playbackrG   r*   zAudioPlayer.Stopr'   rO   )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_ENQUEUEDrG   ra   )r   rb   rQ   r   r   r   clear_queue   s    	
zaudio.clear_queue)rF   )r   )r   )Nr   )Nr   T)F)r   r    r!   r"   r   rR   rW   rY   rZ   rM   rN   rb   rc   r#   r   r   r   r   rE   z   s   
	



rE   c                 C   s0   || kr,| | }|d k	r ||}t ||| d S r   )setattr)srcdestr   convertr   r   r   r   	_copyattr   s
    rh   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tag
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   rF   r   r^   r	   r   r
   objectr$   rA   rC   rE   rh   r&   r=   r   r   r   r   <module>   s   $7q

