
    Pi%                       S SK Jr  S SKrS SKrS SK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KJr  S S	KJrJrJrJr  S S
KJr  SS jrSS jrSSSS.           SS jjr      SS jrSSS.         SS jjrSSSS.           S S jjrS!S jrS"S jr S#S$S jjr!SS jr"S%S jr#S%S jr$g)&    )annotationsN)	timedelta)AnyOptional)delete)select)AsyncSession)settings)AudienceSession	JoinTokenParticipantRoom)utc_nowc                    U =(       d    SR                  5       nU(       d  g[        R                  " UR                  S5      5      R	                  5       $ )N zutf-8)striphashlibsha256encode	hexdigest)line_user_idraws     OC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\services\participants.pyhash_line_user_idr      s<    2
$
$
&C>>#**W-.88::    c                   #    U R                  [        U5      I S h  vN nU(       a  U$ [        XS9nU R                  U5        U R                  5       I S h  vN   U$  NA N7f)N)idname)getr   addflush)sessionroom_idrooms      r   ensure_room_existsr%      sT     T7++D7)DKK
--/K ,
 s!   A"A:A"A A" A"r   )r   sourcedisplay_namec          
       #    [        U5      n[        X5      I S h  vN   S nU(       ah  U R                  [        [        5      R                  [        R                  U:H  [        R                  U:H  5      5      I S h  vN nUR                  5       nU(       aT  [        5       Ul
        U(       a  XFl        U(       a  X6l        U R                  U5        U R                  5       I S h  vN   U$ [	        S[        R                   " S5       3UU=(       d    S[        R                   " S5       3UU[        5       [        5       S9nU R                  U5        U R                  5       I S h  vN   U$  GNR N N N7f)Nzp-   z
anonymous:   )r   r#   line_user_id_hashr&   r'   	joined_atlast_seen_at)r   r%   execr   r   wherer#   r+   firstr   r-   r'   r&   r    r!   secrets	token_hex)r"   r#   r   r&   r'   r+   participantresults           r   get_or_create_participantr5   #   s=     *,7
W
...)-K||;%%##w.--1BB
 
 lln#*9 '3$!'K mmo!!!$%&+SG<M<Mb<Q;R/S!)YK KK
--/? /
 	 sH   E7E.A E7=E1>A(E7&E3'B E7'E5(E71E73E75E7c                  #    U(       d  g U R                  [        U5      I S h  vN nU(       d  g [        5       nUR                  U::  a2  U R	                  U5      I S h  vN   U R                  5       I S h  vN   g X2l        U[        [        R                  S9-   Ul        U R                  U5        U R                  5       I S h  vN   U$  N No NY N7fNseconds)r   r   r   
expires_atr   r!   r-   r   r
   audience_session_ttl_secondsr    )r"   
session_idrecnows       r   get_session_recordr?   N   s      OZ8
8C
)C
~~nnS!!!mmo9X-R-RSSCNKK
--/J 9
 	"
 sF   "CC:CC C7C8ACCCCCC)existing_session_idr&   c                 #    [        X5      I S h  vN n[        5       nU(       a  UR                  UR                  :X  aw  UR                  UR                  :X  a]  XTl        U[        [        R                  S9-   Ul	        U(       a  X4l
        U R                  U5        U R                  5       I S h  vN   U$ [        [        R                  " S5      UR                  UR                  UR                   UUUU[        [        R                  S9-   S9nU R                  U5        U R                  5       I S h  vN   U$  GN, N N7f)Nr8      )r<   participant_idr#   r+   r&   
created_atr-   r:   )r?   r   r#   rC   r   r-   r   r
   r;   r:   r&   r    r!   r   r1   token_urlsafer+   )r"   r3   r@   r&   existingr>   r=   s          r   create_or_reuse_sessionrG   c   s
     (EEH
)CH$$(;(;;@W@W[f[i[i@i #!Ih6[6[$\\$OHmmo
((,"~~##%778+P+PQQ	C KK
--/J/ F 	 s5   ED=BE1E 2BE6E7E EE)event_idr&   metadatac               f  #    [        5       n[        [        R                  " S5      UR                  UR
                  UR                  UU[        R                  " U=(       d    0 SS9UU[        [        R                  S9-   S9	nU R                  U5        U R                  5       I S h  vN   U$  N7f)N    F)ensure_asciir8   )	tokenrC   r#   r+   r&   rH   metadata_jsonrD   r:   )r   r   r1   rE   r   r#   r+   jsondumpsr   r
   join_token_ttl_secondsr    r!   )r"   r3   rH   r&   rI   r>   rM   s          r   issue_join_tokenrR      s      )C##B'"~~##%77jjReD8+J+JKK
E KK
--/L s   B&B1(B/)B1c                  #    U R                  [        U5      I S h  vN n[        5       nU(       a  UR                  U::  a  [	        S5      eU R                  [
        UR                  5      I S h  vN nU(       d  [	        S5      eX2l        U=R                  S-  sl        X4l	        U R                  U5        U R                  U5        U R                  5       I S h  vN   X$4$  N Nv N7f)Ninvalid_join_tokenparticipant_not_found   )r   r   r   r:   
ValueErrorr   rC   last_used_at	use_countr-   r    r!   )r"   token_valuerM   r>   r3   s        r   consume_join_tokenr[      s     ++i55E
)CE$$+-..K1E1EFFK011	OOqO"KKKK
--/ 6 G s5   C+C%AC+0C'1A,C+C)C+'C+)C+c                    [        5       nU[        [        R                  S9-
  nU[        R
                  U :H  [        R                  U:  [        R                  U:  /4$ r7   )r   r   r
   &audience_session_active_window_secondsr   r#   r:   r-   )r#   r>   active_cutoffs      r   _active_session_filtersr_      sZ    
)C)H,[,[\\M7*""S($$5  r   c                6  #    [        [        5      R                  [        R                  [	        5       :*  5      nU(       a"  UR                  [        R
                  U:H  5      nU R                  U5      I S h  vN   U R                  5       I S h  vN   g  N N7fN)r   r   r/   r:   r   r#   r.   r!   )r"   r#   	statements      r   purge_expired_sessionsrc      sl     '--o.H.HGI.UVIOOO$;$;w$FG	
,,y
!!!
--/ "s$   A5B7B8BBBBc                   #    U(       d  g U R                  [        U5      I S h  vN nU(       d  g U R                  U5      I S h  vN   U R                  5       I S h  vN   U$  N? N  N
7fra   )r   r   r   r!   )r"   r<   r=   s      r   delete_session_recordre      sW     OZ8
8C
..

--/J 9 s3   "A*A$ A*A&A*A(A*&A*(A*c                   #    [        X5      I S h  vN   [        U5      u  p#U R                  [        [        5      R
                  " U6 5      I S h  vN n[        UR                  5       5      $  N] N7fra   )rc   r_   r.   r   r   r/   lenallr"   r#   _filtersr4   s        r   count_room_sessionsrl      sY     
 
222(1JA<< 7 = =w GHHFvzz| 3Hs!   A3A/?A3A1A31A3c                  #    [        X5      I S h  vN   [        U5      u  p#U R                  [        [        R
                  5      R                  " U6 5      I S h  vN n[        [        UR                  5       5      5      $  Np N(7fra   )
rc   r_   r.   r   r   rC   r/   rg   setrh   ri   s        r   count_room_active_participantsro      sd     
 
222(1JA<<'E'E F L Lg VWWFs6::< !! 3Ws"   BBA	BB'BB)r   strreturnrp   )r"   r	   r#   rp   rq   r   )r"   r	   r#   rp   r   rp   r&   rp   r'   rp   rq   r   )r"   r	   r<   Optional[str]rq   zOptional[AudienceSession])
r"   r	   r3   r   r@   rr   r&   rp   rq   r   )r"   r	   r3   r   rH   rp   r&   rp   rI   zOptional[dict[str, Any]]rq   r   )r"   r	   rZ   rp   rq   ztuple[JoinToken, Participant])r#   rp   ra   )r"   r	   r#   rr   rq   None)r"   r	   r#   rp   rq   int)%
__future__r   r   rO   r1   datetimer   typingr   r   
sqlalchemyr   sqlmodelr   sqlmodel.ext.asyncio.sessionr	   
app.configr
   app.models.entitiesr   r   r   r   app.services.time_utilsr   r   r%   r5   r?   rG   rR   r[   r_   rc   re   rl   ro    r   r   <module>r      sF   "         5  M M +; (( ( 	(
 ( ( (V 2 *.  '	
  J )-  	
  ' 2""r   