a
    ie                     @   sH  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
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mZ d d
lmZ d dlmZ d dlmZ eddgdZeeef edddZ eeef edddZ!eeeef edddZ"e	eedddZ#eeef e$dddZ%e&deefe	eddd Z'dS )!    N)Any)parse_qs)	APIRouterDependsHTTPExceptionRequeststatus)select)AsyncSession)settings)get_session)LineEventRecordRoom)participants)reply_join_link)verify_line_signaturez/webhookline)prefixtags)eventreturnc                 C   s$   |  d}t|tr|r|S t| S )NZwebhookEventId)get
isinstancestrhashlib_fallback)r   Zwid r   NC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\routers\line_webhook.py	_event_id   s    
r   c                 C   s,   dd l }tj| ddd}||d S )Nr   TF)	sort_keysensure_asciiutf-8)hashlibjsondumpssha256encode	hexdigest)r   r!   rawr   r   r   r      s    r   )sessionr   r   c                    s   t |dpi dpd }|rPt|dd}|dp>dgd  }|rP|S t |dp^i d	phd }|r| t|I d H }|r|jS |d
r|ddd  S tj	 S )Npostbackdata T)keep_blank_valuesroom_idr   messagetextzroom::   )
r   r   stripr   r   id
startswithsplitr   line_default_room_id)r(   r   Zpostback_dataparsedZroom_from_postbackr/   roomr   r   r   _resolve_room_id"   s      
r9   )requesttokenr   c                 C   s6   t jpd d}|s(t| jd}| d| S )Nr+   /z/join?token=)r   app_base_urlr2   rstripr   base_url)r:   r;   baser   r   r   _build_join_url5   s    rA   c                 C   s   t | dpddv S )Ntyper+   >   r)   r.   follow)r   r   )r   r   r   r   _event_supports_join_reply<   s    rD   z/line)r:   r(   c                    s  t jsttjdd|  I d H }| jd}t||t jsJttj	ddzt
|d}W n  t
jy~   tdddY n0 |dpg }t|tsg }|D ]}t|tsqt|}|tttj|kI d H }| rqt|d	d
}	t
j|dd}
t
j|ddd d }d
}d
}d
}d}d
}|dp:i }t|dpLd
 }t|rDt||I d H }|r@tj|||d|	 dI d H }|j}|j }tj!|||d|	t"|dddI d H }t#| |j$}t|dpd
 }|r:t%|||dI d H }|drdnd}|dr*d
nt
j|dd}nd}nd}|&t||	||
|||||d d d	 q|' I d H  ddiS )Nz"LINE_CHANNEL_SECRET not configured)status_codedetailzX-Line-Signaturezinvalid signaturer    i  zinvalid jsoneventsrB   r+   F)r   i  Znot_attemptedsourceZuserIdZline_)r-   line_user_idrH   Zline_webhook_replyZ
replyToken)
event_typeZreply_token_present)participantevent_idrH   metadata)reply_tokenjoin_urlr-   okZfailedZskipped_no_reply_tokenZskipped_no_room_id)	rL   rJ   raw_previewraw_jsonr-   participant_idline_user_id_hashreply_statusreply_errorr   )(r   line_channel_secretr   r   HTTP_503_SERVICE_UNAVAILABLEbodyheadersr   r   HTTP_401_UNAUTHORIZEDr"   loadsdecodeJSONDecodeErrorr   listdictr   execr	   r   whererL   firstr   r#   r2   rD   r9   participants_svcget_or_create_participantr3   rT   issue_join_tokenboolrA   r;   r   addcommit)r:   r(   rY   sigpayloadrG   r   ZeidexistingrJ   rR   Zpreviewr-   rS   rT   rU   rV   rH   rI   rK   
join_tokenrO   rN   resultr   r   r   line_webhook@   s    


 

 
ro   )(r"   typingr   urllib.parser   fastapir   r   r   r   r   sqlmodelr	   sqlmodel.ext.asyncio.sessionr
   
app.configr   app.dbr   app.models.entitiesr   r   app.servicesr   rd   Zapp.services.line_messagingr   Zapp.services.line_verifyr   routerr`   r   r   r   r9   rA   rg   rD   postro   r   r   r   r   <module>   s.   