
    ih#                     Z   d dl Z d dlZd dlZd dlmZ d dlmZ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mZ d d	lmZ d d
lmZ  e       Z e       Z G d de      Zdededede fdZ!dede"eef   dz  fdZ#d#dedede$dedef
dZ%dededefdZ&ejO                  d       edd       e
e      fdededefd       Z(ejO                  d       e	dd       edd       e
e      fdedededefd        Z)ejO                  d!       e
e      fdedefd"       Z*y)$    N)datetime)	APIRouterRequestHTTPExceptionQueryPathDepends)Session)and_)	BaseModel)get_db)CustomerTelegramBotTenantSettings)get_settings)choose_telegram_senderc                   ,    e Zd ZU eed<   dZedz  ed<   y)TelegramUpdate	update_idNmessage)__name__
__module____qualname__int__annotations__r   dict     3/var/www/notifications/app/api/telegram_webhooks.pyr   r      s    NGTD[r   r   secret	tenant_iddbreturnc                 D   | t         j                  k(  ry|j                  t              j	                  t        t        j                  |k(  t        j                  dk(              j                         }|r,|j                  r t        j                  | |j                        S y)u'   Проверить секрет webhookTactiveF)settings
SECRET_KEYqueryr   filterr   r!   statusfirstwebhook_secrethmaccompare_digest)r    r!   r"   bots       r   _verify_webhook_secretr0      s     $$$ ((;

&
&!!Y.(*	

 eg  s!!""63+=+=>>r   payloadc                    	 | j                  d      }t        |      dk7  ry|\  }}}}t        |      }t        |      }| d| d| }t        j                  t
        j                  j                         |j                         t        j                        j                         dd }	t        j                  ||	      sy||fS # t        t        f$ r Y yw xY w)uD   Парсить payload deeplink и проверить подпись:   N   )splitlenr   r-   newr&   r'   encodehashlibsha256	hexdigestr.   
ValueError
IndexError)
r1   partstenant_id_struser_id_strnonce	signaturer!   user_idexpected_payloadexpected_signatures
             r   _parse_deeplink_payloadrG   -   s    c"u:?7<4{E9&	k" (['!E7;!XX&&(##%NN
 )+cr	 ""9.@A'!!
# s   C BC  C CCchat_id	user_infoc                 f  K   d}|rt        |      }|r|\  }}|| k7  rddiS |j                  t              j                  t	        t        j
                  | k(  t        j                  |k(              j                         }|sut        | |dg|j                  d      |j                  d      |j                  d      t        j                         j                         dd	
      }|j                  |       n|j                  si |j                  |j                  d      |j                  d      |j                  d      t        j                         j                         t        j                         j                         d|_        d|_        |j                          d|j                   dS w)u*   Обработать команду /startNerrorzInvalid payload tenanttelegram_subscriberusername
first_name	last_nametelegram_start)telegram_usernametelegram_first_nametelegram_last_name
consent_atsource)r!   
tg_chat_idtagsmeta)rQ   rR   rS   rT   	last_seenFT)successcustomer_id)rG   r(   r   r)   r   r!   rV   r+   getr   utcnow	isoformataddopt_outrX   commitid)	r!   rH   rI   r"   r1   rD   parsedpayload_tenant_idcustomers	            r   _handle_start_commandrf   I   s     G(1)/&w I-!9:: xx!(()+7*	

 eg  '(%.]]:%>'0}}\'B&/mmK&@&oo/99;*	
 	x --%.]]:%>'0}}\'B&/mmK&@&oo/99;%__.88:HM HIIKHKK88s   F/F1c                 n  K   |j                  t              j                  t        t        j                  | k(  t        j
                  |k(              j                         }|rNd|_        i |j                  dt        j                         j                         i|_        |j                          ddiS w)u;   Обработать команду /stop или 'стоп'T
opt_out_atrZ   )r(   r   r)   r   r!   rV   r+   r`   rX   r   r]   r^   ra   )r!   rH   r"   re   s       r   _handle_stop_commandri      s     xx!(()+7*	

 eg  
mm
(//+557
 			ts   B3B5z/system/webhook.zWebhook secret)descriptionrequestc           	        K   t        j                  |t        j                        st	        dd      	 | j                          d{   }t        j                  |      }t        di |}|j                  r|j                  }|j                  di       }|j                  di       }	|j                  d	d
      }
t        |j                  d            }|	j                  d      |	j                  d      |	j                  d      |	j                  d      d}d}|
j                  d      r%|
dd j                         }t        |      }|r|\  }}|r:|
j                  d      r)t!        |||||
dd j                                d{   }n|
j#                         dv rj|j%                  t&              j)                  t&        j*                  |k(        j-                         }|r t/        |j0                  ||       d{   }n	ddi}nddi}d|dS ddiS 7 # t        $ r}t	        ddt        |             d}~ww xY w7 7 Fw)u,   Webhook для системного бота  Invalid webhook secretstatus_codedetailN  Invalid webhook data: chatfromtext rb   rM   rN   rO   rM   rN   rO   rb   z/start    /startz/stopu   стопstoprK   zCustomer not foundr   Unknown commandTokresultr   r   )r-   r.   r&   r'   r   bodyjsonloadsr   	Exceptionstrr   r\   
startswithstriprG   rf   lowerr(   r   r)   rV   r+   ri   r!   )rk   r    r"   r   update_dataupdateer   rt   	from_userrv   rH   rI   r!   r1   rc   _r   re   s                      r   system_telegram_webhookr      s!     vx':':;4LMMW\\^#jj&.+.
 ~~..{{62&KK+	{{62&dhhtn%!j1#--5"{3--%	
	 	??9%12hnn&G,W5F%	120GYPRTXYZY[T\TbTbTdeeFZZ\::xx)00##w.eg  3H4F4FQSTT!#78!23Ff--$<[ $  W6LSQRVH4UVVW6 f UsZ   2IH H	$H -DIIA6I>I?IH 	I "H;;I  IIz/webhook/{tenant_id}z	Tenant IDc                 l  K   t        |||      st        dd      	 | j                          d{   }t        j                  |      }t        di |}|j                  r|j                  }|j                  di       }	|j                  di       }
|j                  d	d
      }t        |	j                  d            }|
j                  d      |
j                  d      |
j                  d      |
j                  d      d}|j                  d      r;t        |      dkD  r|dd j                         nd}t        |||||       d{   }n,|j                         dv rt        |||       d{   }nddi}d|dS ddiS 7 R# t        $ r}t        ddt        |             d}~ww xY w7 g7 Aw)u"   Webhook для бренд-ботаrm   rn   ro   Nrr   rs   rt   ru   rv   rw   rb   rM   rN   rO   rx   rz   ry   r{   r   r}   Tr~   r   r   )r0   r   r   r   r   r   r   r   r   r\   r   r7   r   rf   r   ri   )rk   r!   r    r"   r   r   r   r   r   rt   r   rv   rH   rI   r1   r   s                   r   brand_telegram_webhookr      s     "&)R84LMMW\\^#jj&.+.
 ~~..{{62&KK+	{{62&dhhtn%!j1#--5"{3--%	
	 ??8$*-d)a-d12hnn&TG0GYPRT[\\FZZ\::/	7BGGF!23Ff--$<? $  W6LSQRVH4UVVW( ]GsW   F4F F$F C2F4F0	'F40F21F4F 	F-F((F--F42F4z/test-webhookc                    K   	 | j                          d{   }t        j                  |      }d|dS 7 # t        $ r}dt	        |      dcY d}~S d}~ww xY ww)u=   Тестовый webhook для проверки работыNT)r   receivedF)r   rK   )r   r   r   r   r   )rk   r"   r   datar   s        r   test_webhookr     sW     .\\^#zz$-- $  .c!f--.s=   A8 68 A8 	AAAAAA)N)+r   r-   r:   r   fastapir   r   r   r   r   r	   sqlalchemy.ormr
   
sqlalchemyr   pydanticr   app.db.sessionr   app.db.modelsr   r   r   app.core.configr   app.services.telegram_senderr   routerr&   r   r   r   boolr0   tuplerG   r   rf   ri   postr   r   r   r   r   r   <module>r      s       K K "   ! ? ? ( ? 
> Y  
3 3 G  (S U38_t-C 8393 39 39 39SZ 39eh 39l#   (  )9:&/::: 	:  :z #$ #;7)9:&/	--- - 		- %-` _ &/
.
.
. 
.r   