
    ie                        S SK r S SKJr  S SKJr  S SKJrJrJrJ	r	J
r
  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJr  S SKJr  \" SS/S9rS\\\4   S\4S jr S\\\4   S\4S jr!S\S\\\4   S\4S jr"S\	S\S\4S jr#S\\\4   S\$4S jr%\RM                  S5      \" \5      4S\	S\4S jj5       r'g)    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                 v    U R                  S5      n[        U[        5      (       a	  U(       a  U$ [        U 5      $ )NwebhookEventId)get
isinstancestrhashlib_fallback)r   wids     NC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\routers\line_webhook.py	_event_idr       s0    
))$
%C#s
E""    c                     SS K n[        R                  " U SSS9nUR                  UR	                  S5      5      R                  5       $ )Nr   TF)	sort_keysensure_asciiutf-8)hashlibjsondumpssha256encode	hexdigest)r   r&   raws      r   r   r      s8    
**Ud
?C>>#**W-.88::r!   sessionc                   #    [        UR                  S5      =(       d    0 R                  S5      =(       d    S5      R                  5       nU(       a?  [        USS9nUR                  S5      =(       d    S/S   R                  5       nU(       a  U$ [        UR                  S5      =(       d    0 R                  S	5      =(       d    S5      R                  5       nU(       aj  U R                  [        U5      I S h  vN nU(       a  UR
                  $ UR                  S
5      (       a#  UR                  SS5      S   R                  5       $ [        R                  R                  5       $  Nn7f)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   postback_dataparsedroom_from_postbackr5   rooms          r   _resolve_room_idrA   "   s    :.4"99&AGRHNNPM-4@$jj3;tQ?EEG%%		)$*//7=2>DDFD[[t,,77N??7##::c1%a(..00((..00 -s   C9E,;E*<A/E,requesttokenc                     [         R                  =(       d    SR                  5       R                  S5      nU(       d$  [	        U R
                  5      R                  S5      nU SU 3$ )Nr1   /z/join?token=)r   app_base_urlr8   rstripr   base_url)rB   rC   bases      r   _build_join_urlrJ   5   sU    !!'R..077<D7##$++C0V<w''r!   c                 N    [        U R                  S5      =(       d    S5      S;   $ )Ntyper1   >   followr4   r/   )r   r   )r   s    r   _event_supports_join_replyrN   <   s!    uyy &B'+LLLr!   z/linec                   #    [         R                  (       d  [        [        R                  SS9eU R                  5       I S h  vN nU R                  R                  S5      n[        X#[         R                  5      (       d  [        [        R                  SS9e [        R                  " UR                  S5      5      nUR                  S5      =(       d    / n[        U[        5      (       d  / nU GH  n[        U[         5      (       d  M  [#        U5      nUR%                  ['        [(        5      R+                  [(        R,                  U:H  5      5      I S h  vN nUR/                  5       (       a  M  [1        UR                  S	S
5      5      n	[        R2                  " USS9n
[        R2                  " USS9S S nS
nS
nS
nSnS
nUR                  S5      =(       d    0 n[1        UR                  S5      =(       d    S
5      R5                  5       n[7        U5      (       Ga>  [9        X5      I S h  vN nU(       Ga!  [:        R<                  " UUUSU	 3S9I S h  vN nUR>                  nUR@                  n[:        RB                  " UUUSU	[E        UR                  S5      5      S.S9I S h  vN n[G        U URH                  5      n[1        UR                  S5      =(       d    S
5      R5                  5       nU(       a[  [K        UUUS9I S h  vN nUR                  S5      (       a  SOSnUR                  S5      (       a  S
O[        R2                  " USS9nOSnOSnURM                  [)        UU	UU
UUUUUS S S9	5        GM     URO                  5       I S h  vN   SS0$  GNc! [        R                   a    [        SSS9ef = f GNq GN GNu GN% N N;7f)Nz"LINE_CHANNEL_SECRET not configured)status_codedetailzX-Line-Signaturezinvalid signaturer%   i  zinvalid jsoneventsrL   r1   F)r$   i  not_attemptedsourceuserIdline_)r3   line_user_idrT   line_webhook_reply
replyToken)
event_typereply_token_present)participantevent_idrT   metadata)reply_tokenjoin_urlr3   okfailedskipped_no_reply_tokenskipped_no_room_id)	r]   rZ   raw_previewraw_jsonr3   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   wherer]   firstr   r(   r8   rN   rA   participants_svcget_or_create_participantr9   rh   issue_join_tokenboolrJ   rC   r   addcommit)rB   r-   rm   sigpayloadrR   r   eidexistingrZ   rf   previewr3   rg   rh   ri   rj   rT   rW   r\   
join_tokenr`   r_   results                           r   line_webhookr   @   sj    
 '';;7
 	

 D
//

0
1C H,H,HII(D(DM`aaD**T[[12 [["(bFfd##%&& f_&=&C&COD\D\`cDc&dee>>62./
::e%8**U7=&8$*6::h/526<<>%e,,,W<<G$4$N$N#!-":,/	%  "-$/$A$A!#3#D#D + /&0/3EIIl4K/L	$ 	
 +7J4D4DE!%))L"9"?R@FFH#2$/!) '$ F
 ,2::d+;+;4L(.

4(8(8"djj^c>dK#;L3%#!-"3)'-
	
m H ..
dg    DNCCD f =	4 s   AON&AO%N)  BOOCO2O3)OOAO/O0A OOBOO	O)OOOOOOO)(r'   typingr   urllib.parser   fastapir   r   r   r   r	   sqlmodelr
   sqlmodel.ext.asyncio.sessionr   
app.configr   app.dbr   app.models.entitiesr   r   app.servicesr   rx   app.services.line_messagingr   app.services.line_verifyr   routerrt   r   r    r   rA   rJ   r{   rN   postr    r!   r   <module>r      s     ! F F  5   5 9 7 :	*F8	4#T#s(^ # #;DcN ;s ;1L 1c3h 1C 1&(W (S (S (Md38n M M W $K0]]] ]r!   