
    hD7                     T   S SK r S SKrS SKrS SKJrJr  S SK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  S	S
KJrJr  S	SKJr  S	SKJr  S SKrS SKrS	SKJr  S SKJr  S SKJ r!  \RD                  " \#5      r$\%" \SS5      r&\%" \SS5      r'\%" \SS5      r(S SK)r)S SK)r)S r*S SKJr  S SK+J,r,  \S 5       r-\
S 5       r.\
S 5       r/\S 5       r0\S 5       r1\
S 5       r2\\
S 5       5       r3\S 5       r4\\
S  5       5       r5\
S! 5       r6S" r7\
S# 5       r8\\
\S$ 5       5       5       r9g)%    N)datetime	timedelta)renderredirectget_object_or_404)login_required)timezone)JsonResponse)csrf_exempt)settings   )ReuniaoSolicitacaoEntrada)ReuniaoForm)gerar_token_reuniao)gerar_token_admin)require_POST)logoutLIVEKIT_API_KEYAPIJK8nTcNANfTXLIVEKIT_API_SECRET,cRwOxXlflTc1THe4Y1rp0v8ZBvznzvU4ynTS5fvdzDIBLIVEKIT_URLz"wss://rtc.agenda.grfgraph.com:4443c           	          [         S[        [        R                  " 5       5      S-   S.n[        R                  " U[
        SS9n[        R                  SS5       S3nS	U 3S
S.nU UUSSS.S.n[        R                  " XVUS9nUR                  5         [        R                  SU SU  SU 35        UR                  5       $ ! [         a.  n	[        R                  SU S[!        U	5       35         Sn	A	gSn	A	ff = f)u7   Atualiza permissões de um participante via API LiveKitlivekit<   issaudexpHS256	algorithmwss://https://z,/twirp/livekit.RoomService/UpdateParticipantBearer zapplication/json)AuthorizationzContent-TypeT)
canPublishcanSubscribecanPublishData)roomidentity
permission)headersjsonu   Permissões atualizadas para  em z: can_publish=u#   Erro ao atualizar permissões para : N)r   inttimejwtencoder   r   replacerequestspostraise_for_statusloggerinfor/   	Exceptionerrorstr)
	room_nameparticipant_identitycan_publishpayload	jwt_tokenurlr.   dataresponsees
             )/var/www/html/quickmeet/reunioes/views.pyupdate_participant_permissionsrI   %   s   "tyy{#b(

 JJw(:gN	$$Xz:;;gh&yk2.

 ,) $"&
 ==DA!!#34H3Ii[Xfgrfstu}} :;O:PPRSVWXSYRZ[\s   C C 
C;$C66C;)AnonymousUserc           	          [        [        US9nU R                  R                  (       a  U R                  R                  nO?U R
                  R                  SS[        R                  " 5       R                  S S  35      n[        UR                  USS9n[        SU05      $ ! [         aF  n[        R                  SU S	[!        U5       35        [        S
S[!        U5       30SS9s S nA$ S nAff = f)Ncodigonome_convidado
Convidado_   Tr+   userrA   tokenzErro ao gerar token novo para r1   r=   Erro interno:   status)r   r   rR   is_authenticatedusernamesessiongetuuiduuid4hexr   rM   r
   r<   r:   r=   r>   )requestrM   reuniaousuariorS   rG   s         rH   obter_token_convidadorb   I   s    N#GF; <<((ll++Goo))*:jIYIYZ\[\I]H^<_`G#

 We,-- N5fXRAxHIWs1vh&?@MMNs   B B# #
C3-;C.(C3.C3c                 D   [         R                  R                  U R                  [        R
                  " 5       [        SS9-
  S9R                  S5      n[        R                  SU R                  R                   SUR                  5        S35        [        U SS	U05      $ )
N   )hours)hostdata_hora__gtez
-data_horazCarregando dashboard para r1   u    reuniões encontradaszreunioes/dashboard.htmlreunioes)r   objectsfilterrR   r	   nowr   order_byr:   debugrY   countr   )r_   rh   s     rH   	dashboardro   _   s    %%\\||~	(;; &  h|  LL-gll.C.C-DBx~~GWFXXnop'4z86LMM    c                 R   U R                   S:X  a  [        U R                  5      nUR                  5       (       a  UR	                  SS9nU R
                  Ul        [        R                  " 5       R                  S S Ul
        UR	                  5         [        R                  SU R
                  R                   SUR                   35        [        S5      $ [        R                  SU R
                  R                   S	UR                    35        O
[        5       n[#        U S
SU05      $ )NPOSTF)commit
   u   Reunião agendada por z	: codigo=ro   u'   Erro no formulário de agendamento por r1   zreunioes/agendar.htmlform)methodr   rr   is_validsaverR   rf   r\   r]   r^   rM   r:   r;   rY   r   warningerrorsr   )r_   ru   r`   s      rH   agendar_reuniaor{   h   s    ~~7<<(==??iiui-G"<<GL!ZZ\--cr2GNLLNKK01F1F0GyQXQ_Q_P`abK((NNDW\\EZEZD[[]^b^i^i]jkl}'2VTNCCrp   c           
          [         R                  R                  US9nU R                  R                  (       a5  U R                  R                  nU R                  UR                  :X  a  SOSnOOU R                  R                  SS	[        R                  " 5       R                  S S
  35      nX0R                  S'   Sn[        UR                   USS9n[        R#                  SU SU SU 35        [        U SUU[$        R'                  SS5      UUS.5      $ ! [         R                   a&    [        R                  SU 35        [        U SSS9s $ f = f)NrL   u(   Tentativa de acessar reunião expirada: zreunioes/reuniao_expirada.htmli  rV   rf   	convidadorN   rO   rP   TrQ   u	   Usuário u    entrando na reunião z como zreunioes/reuniao.htmlr%   r$   )r`   rS   ws_urlra   papel)r   ri   r[   DoesNotExistr:   ry   r   rR   rX   rY   rf   rZ   r\   r]   r^   r   rM   r;   r   r6   )r_   rM   r`   rR   r   rS   s         rH   entrar_reuniaor   y   sB   M//%%V%4
 ||$$||$$!,,',,6K""#3z$**,BRBRSUTUBVAW5XY,0()^^E KK)D6!7xveWMN'2%%j(;5  '  MA&JKg?LLMs   D 7EEc           
         U R                   S:X  GaJ   [        R                  " U R                  R	                  S5      5      nUR                  S5      nUR                  S5      nU(       dU  U R                  R                  S5      nU(       d3  S[        R                  " 5       R                  S S  3nX0R                  S'   U(       d!  [        R                  S5        [        S	S
0SS9$ [        [        US9n[        R                   R#                  UUSS0S9u  pV[        R%                  SU SU SU SUR&                   35        [        SXeR&                  S.5      $ [        R                  SU R                    35        [        S	S0SS9$ ! [(         aC  n[        R+                  S[-        U5       35        [        S	S[-        U5       30SS9s S nA$ S nAff = f)Nrr   zutf-8rM   nomerN   rO   rP   u2   Tentativa de solicitação sem código da reuniãor=   u   Código da reunião ausente  rV   rL   
autorizadoF)r`   r   defaultsu   Solicitação de entrada: nome=	, codigo=z
, created=z, id=T)okcreatedidu,   Erro ao processar solicitação de entrada: rT   rU   u1   Método inválido para solicitação de entrada:    Método inválido  )rv   r/   loadsbodydecoder[   rZ   r\   r]   r^   r:   ry   r
   r   r   r   ri   update_or_creater;   r   r<   r=   r>   )r_   rE   rM   r   r`   objr   rG   s           rH   solicitar_entradar      s   ~~	R::gll11':;DXXh'F88F#D**+;<'

(8(8!(<'=>D8<OO$45ST#W.K$LUXYY'?G-55FF&. G LC
 KK9$yPZ[bZcchilioiohpqrtvv NOO NNFw~~FVWX"56sCC	  	RLLGAxPQN3q6(*C DSQQ	Rs%   CF
 (A3F
 

G8GGGc                 4    [        [        XR                  S9nUR                  R	                  SS9nU Vs/ s H6  nUR
                  UR                  UR                  R                  S5      S.PM8     nn[        R                  SU S[        U5       SU Vs/ s H  oDS	   PM	     sn 35        [        S
U05      $ s  snf s  snf ! [         aF  n[        R                  SU S[        U5       35        [        SS[        U5       30SS9s S nA$ S nAff = f)NrM   rf   F)r   z%H:%M:%S)r   r   rE   u   Solicitações pendentes para r1   z encontradas - r   solicitacoesu#   Erro ao listar solicitações para r=   u   Erro ao listar solicitações: rU   rV   )r   r   rR   r   rj   r   r   data_solicitacaostrftimer:   r;   lenr
   r<   r=   r>   )r_   rM   r`   	pendentessr   rG   s          rH   listar_solicitacoesr      sE   _#GFN((//5/A	 !

 !! dd**33J? ! 	 
 	4VHBs<?P>QQ`  vB  bC  vBpqdjbk  vB  bC  aD  E  	F^\:;;
 bC _:6("SVHMNW(GAx&PQZ]^^_s:   5C =B=4%C C'C =
C 
D;DDDc                    U R                   S:w  a  [        SS0SS9$  [        R                  " U R                  5      nUR                  S5      nUR                  S5      nU(       a  US;  a  [        SS	0S
S9$ [        R                  R                  US9nUR                  nU R                  UR                  :w  a  [        SS0SS9$ US:X  af  SUl        UR                  5         [        UR                  UR                  SS9  [         R#                  SUR                   SUR                   35        O?UR%                  5         [         R#                  SUR                   SUR                   35        [        SS05      $ ! [        R&                   a    [        SS0SS9s $ [(         a1  n[         R+                  SU 35        [        SSU 30SS9s S nA$ S nAff = f)Nrr   r=   r   r   rV   r   acao)permitirnegaru   ID ou ação inválidosr   )r   u   Permissão negadai  r   T)r?   r@   rA   u&   Permissão de publish habilitada para r0   u   Solicitação de z negada e removida de r   u   Solicitação não encontradai  zErro ao autorizar entrada: rT   rU   )rv   r
   r/   r   r   r[   r   ri   r`   rR   rf   r   rx   rI   rM   r   r:   r;   deleter   r<   r=   )r_   rE   sidr   solicitacaor`   rG   s          rH   autorizar_entradar      s    ~~W&9:3GG!Izz',,'hhtnxxd"66*C DSQQ(00444<%% <<7<<'*= >sKK:%)K"*!..%0%5%5 
 KK@AQAQ@RRVW^WeWeVfgh KK+K,<,<+==ST[TbTbScdeT4L))** TW&EFsSS I21#67Wqc&:;CHHIs2   AF  9AF  B7F    G"	G+&GGGc           	          U R                   R                  S5      nU(       d$  [        R                  SU 35        [	        SS0SS9$ [        [        US9n[        R                  R                  UUSS	9R                  5       n[        R                  S
U SU SU 35        [	        SU05      $ ! [         aF  n[        R                  SU S[        U5       35        [	        SS[        U5       30SS9s S nA$ S nAff = f)Nra   uA   Tentativa de verificação de autorização sem usuário: codigo=r=   u   Usuário não especificador   rV   rL   T)r`   r   r   u(   Verificação de autorização: usuario=r   z, autorizado=r   u%   Erro ao verificar autorização para r1   rT   rU   )GETr[   r:   ry   r
   r   r   r   ri   rj   existsrm   r<   r=   r>   )r_   rM   ra   r`   r   rG   s         rH   check_autorizacaor      s   N++//),NN^_e^fgh*F GPSTT#GF;'//66 7 
 &(	 	 	?y	RXQYYfgqfrst\:677 N<VHBs1vhOPWs1vh&?@MMNs%   AB. A%B. .
C>8;C93C>9C>c                    [        [        XR                  S9n[        R                  " [
        S[        [        R                  " 5       5      S-   S.[        SS9n [        R                  " [         S3SS	U 30S
U0SS9nUR                  5         UR!                  5         [        R#                  SXR                  R$                  5        ['        SS05      $ ! [         a   n[        R                  SX5         SnANlSnAff = f)u{   
• Autorizado somente ao host da sala
• Fecha a sala no LiveKit (DeleteRoom)
• Remove registro da reunião no Django
r   r      r   r!   r"   z%/twirp/livekit.RoomService/DeleteRoomr'   r&   r+      r.   r/   timeoutzDeleteRoom falhou para %s: %sNu   Reunião %s encerrada por %sr   T)r   r   rR   r4   r5   r   r2   r3   r   r7   r8   LIVEKIT_RESTr9   r<   r:   r=   r   r;   rY   r
   )r_   rM   r`   rC   respexcs         rH   encerrar_reuniaor     s      \\JG 

	#diik:JR:OPI
C}}nAB$	{&;<&!	
 	 NN
KK.8M8MNt%%  C4fBBCs   5C 
D!C<<Dc           	          [        [        US9n[        UR                  U R                  R
                  U R                  UR                  :H  S9n[        R                  SU R                  R
                   SU 35        [        SU05      $ ! [         aF  n[        R                  SU S[        U5       35        [        SS	[        U5       30S
S9s S nA$ S nAff = f)NrL   rQ   Token gerado para u    na reunião rS   Erro ao gerar token para r1   r=   rT   rU   rV   )r   r   r   rM   rR   rY   rf   r:   rm   r
   r<   r=   r>   )r_   rM   r`   rS   rG   s        rH   obter_tokenr   7  s    N#GF;#&& 5

 	)',,*?*?)@fXVWWe,-- N03q6(CDWs1vh&?@MMNs   B	B 
C;CCCc           	          U R                   R                  (       a  U R                   R                  O$S[        R                  " 5       R
                  S S  3n[        XS9n[        R                  SU SU 35        [        SU05      $ ! [         aF  n[        R                  SU S[        U5       35        [        S	S
[        U5       30SS9s S nA$ S nAff = f)NAnon_rP   )r+   rR   r   z	 na sala rS   r   r1   r=   rT   rU   rV   )rR   rX   rY   r\   r]   r^   r   r:   rm   r
   r<   r=   r>   )r_   codigo_salara   rS   rG   s        rH   gerar_tokenr   F  s    N+2<<+H+H',,''PUVZV`V`VbVfVfgihiVjUkNl#C)')K=IJWe,-- N0RAxHIWs1vh&?@MMNs   BB	 	
C;CCCc                 b    U R                   R                  5         [        U 5        [        S5      $ )uW   
• Limpa dados da sessão (inclui 'nome_convidado')
• Desfaz autenticação Django
login)rZ   flush	dj_logoutr   )r_   s    rH   sairr   S  s'     OOgGrp   c           	          [         R                  " U R                  5      nUR                  S5      nUR                  S5      nU(       a  U(       d  [	        SS0SS9$ [
        R                  " [        S[        [        R                  " 5       5      S-   S	.[        S
S9n[        R                  " [        R                  SS5       S3SSU 30X#S.SS9nUR                  5         [         R#                  SU SU 35        [	        SS05      $ ! [$         a=  n[         R'                  SW SW SU 35        [	        S[)        U5      0SS9s S nA$ S nAff = f)Nr+   r,   r=   u   Parâmetros ausentesr   rV   r   r   r   r!   r"   r$   r%   z,/twirp/livekit.RoomService/RemoveParticipantr'   r&   )r+   r,   r   r   zParticipante z removido da sala r   TzErro ao remover participante z	 da sala r1   rU   )r/   r   r   r[   r
   r4   r5   r   r2   r3   r   r7   r8   r   r6   r9   r:   r;   r<   r=   r>   )r_   rE   r+   r,   rC   rF   rG   s          rH   expulsar_participanter   `  s;   ;zz',,'xx88J'8*@ A#NNJJ#Ic$))+>NQS>ST
	 ==""8Z899ef$	{&;<5	
 	!!#mH:-?vFGT4L)) ;4XJivRPQsSTWc!f-c::;s%   AD B-D 
E2EEE):r/   r4   r7   r   r   django.shortcutsr   r   r   django.contrib.auth.decoratorsr   django.utilsr	   django.httpr
   django.views.decorators.csrfr   django.confr   modelsr   r   formsr   utils.livekitr   r\   loggingr   django.views.decorators.httpr   django.contrib.authr   r   	getLogger__name__r:   getattrr   r   r   r3   rI   django.contrib.auth.modelsrJ   rb   ro   r{   r   r   r   r   r   r   r   r   r   r    rp   rH   <module>r      s    
  ( @ @ 9 ! $ 4   /  .   , 5 3			8	$ ($57HIX';24 h/ST  B 5 4N N* N N D D   @ D DB _ _& $I  $IR N N* &  &H N NN   ;   ;rp   