
    Uid                     p   d dl 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	 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mZ d d	lmZ d d
lmZ d dlmZmZmZ  e       Z e       Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de      Z' G d de      Z(de)de*fdZ+ejY                  de"        ee       ee      fd!e!d"ed#efd$       Z-ejY                  d%e$        ee       ee      fd!e#d"ed#efd&       Z.ejY                  d'       ee       ee      fd"ed#efd(       Z/ejY                  d)       ee       ee      fd"ed#efd*       Z0ejY                  d+       ee       ee      fd"ed#efd,       Z1d-e2d.e2de)fd/Z3eji                  d0e%        e	d1d23       ee       ee      fd.e2d"ed#efd4       Z5eji                  d5       ee      fd"efd6       Z6ejY                  d7e&        ee       ee      fd"ed#efd8       Z7eji                  d9       ee       ee      fd"ed#efd:       Z8eji                  d;       ee       ee      fd"ed#efd<       Z9ejY                  d=e(        ee      fd>e'd"efd?       Z:y)@    N)datetime)	APIRouterDependsHTTPExceptionQuery)Session)and_)	BaseModel)get_db)UserTelegramBotTenantSettingsCustomer)get_current_user)get_settings)encrypt_tokendecrypt_tokengenerate_webhook_secretc                       e Zd ZU eed<   y)CheckTokenRequest	bot_tokenN__name__
__module____qualname__str__annotations__     */var/www/notifications/app/api/telegram.pyr   r          Nr   r   c                   @    e Zd ZU eed<   dZedz  ed<   dZedz  ed<   y)CheckTokenResponseokNusernameerror)r   r   r   boolr   r%   r   r&   r   r   r    r#   r#      s#    HHcDjE3:r   r#   c                       e Zd ZU eed<   y)SetWebhookRequestr   Nr   r   r   r    r)   r)       r!   r   r)   c                   T    e Zd ZU eed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   y)SetWebhookResponser$   Nr%   webhook_urlr&   )	r   r   r   r'   r   r%   r   r,   r&   r   r   r    r+   r+   $   s1    HHcDj"Kt"E3:r   r+   c                   ,    e Zd ZU eed<   eed<   eed<   y)DeeplinkResponsedeeplinkqr_datar%   Nr   r   r   r    r.   r.   +   s    MLMr   r.   c                   6    e Zd ZU eed<   eed<   dZedz  ed<   y)SendTestResponsesuccessmessageNr&   r   r   r   r'   r   r   r&   r   r   r    r2   r2   1       MLE3:r   r2   c                   ,    e Zd ZU eed<   eed<   eed<   y)ChannelTestRequestchannel	recipientr4   Nr   r   r   r    r8   r8   7   s    LNLr   r8   c                   6    e Zd ZU eed<   eed<   dZedz  ed<   y)ChannelTestResponser3   r4   Nr&   r5   r   r   r    r<   r<   =   r6   r   r<   r   returnc                   K   	 t        j                         4 d{   }|j                  d|  dd       d{   }|j                  dk(  r|j	                         }|j                  d      rNd|d	   j                  d
      |d	   j                  d      |d	   j                  d      dcddd      d{    S |j                  dd      }dd| dcddd      d{    S 	 |j	                         }|j                  dd|j                         }dd| dcddd      d{    S 7 7 7 ~7 U#  d|j                   }Y 5xY w7 $# 1 d{  7  sw Y   yxY w# t         j
                  $ r dddcY S t         j                  $ r dddcY S t        $ r}ddt        |       dcY d}~S d}~ww xY ww)u>   Проверить токен бота через Telegram APINhttps://api.telegram.org/botz/getMe      $@timeout   r$   Tresultr%   
first_nameid)r$   r%   rE   rF   descriptionUnknown errorFTelegram API error: r$   r&   HTTP u5   Ошибка подключения к Telegram API: u   Превышено время ожидания ответа от Telegram API. Проверьте интернет-соединение.uw   Не удалось подключиться к Telegram API. Проверьте интернет-соединение.u,   Ошибка проверки токена: )	httpxAsyncClientgetstatus_codejsonTimeoutExceptionConnectError	Exceptionr   )r   clientresponsedata
error_desc
error_dataes          r    _check_telegram_botrZ   C   s
     _$$& 	t 	t&#ZZ.yk@ (  H
 ##s*}}88D>"$(N$6$6z$B&*8n&8&8&F"8n006		t 	t 	t  "&-!IJ"'4H2UV#	t 	t 	t&@!)J!+xG[G[F\?]!^J $0efpeq.rs1	t 	t 	t	t 	t,@#()=)=(>!?J/	t 	t 	t 	t4 !! r  'q  r  	r a  '`  a  	a _(TUXYZU[T\&]^^_s  GE( D2E( ED5A0E,E( 8D79E( =G>EE( #D9$E( (G*/D;E E( ,E-E( 1G2E( 5E7E( 9E( ;EEE( E%EE%!E( $G%E( (F> GF>GF>#F93F>4G9F>>Gz/check-token)response_modelrequestcurrent_userdbc                    K   t        | j                         d{   }|d   rt        d|d         S t        d|d         S 7 )w)	u/   Проверить токен Telegram ботаNr$   Tr%   )r$   r%   Fr&   rJ   )rZ   r   r#   )r\   r]   r^   rD   s       r    check_telegram_tokenr`   h   sX      'w'8'899Fd|!J'
 	

 "/
 	
 :s   AA*Az/set-webhookc                 D  K   t        | j                         d{   }|j                  d      s|j                  dd      }t        d|      S t	               }t
        j                   d|j                   d| }	 t        j                         4 d{   }|j                  d	| j                   d
d|id       d{   }|j                  dk7  r+t        dd|j                         cddd      d{    S |j                         }	|	j                  d      s0t        dd|	j                  d             cddd      d{    S ddd      d{    	 t        | j                        }|j!                  t"              j%                  t"        j                  |j                  k(        j'                         }|rE||_        |j                  d      |_        ||_        d|_        t1        j2                         |_        n:t#        |j                  ||j                  d      |d      }|j7                  |       |j!                  t8              j%                  t8        j                  |j                  k(        j'                         }|r!d|_        t1        j2                         |_        n(t9        |j                  d      }|j7                  |       |j=                          t        d|j                  d      |      S 7 7 x7 O7 7 7 # 1 d{  7  sw Y   xY w# t        $ r#}
t        ddt        |
             cY d}
~
S d}
~
ww xY w# t        $ r3}
|j?                          t        ddt        |
             cY d}
~
S d}
~
ww xY ww)u7   Установить webhook для бренд-ботаNr$   r&   uH   Неизвестная ошибка при проверке токенаFrJ   z	/webhook/z?secret=r?   z/setWebhookurlr@   rP   rB   rC   zFailed to set webhook: HTTP rI   rG   zFailed to set webhook: r%   active)	tenant_idbot_token_encr%   webhook_secretstatusbrandre   	tg_senderT)r$   r%   r,   u4   Ошибка сохранения бота в БД: ) rZ   r   rN   r+   r   settingsTG_WEBHOOK_BASEre   rL   rM   postrO   rP   rS   r   r   queryr   filterfirstrf   r%   rg   rh   r   utcnow
updated_ataddr   rk   commitrollback)r\   r]   r^   bot_info	error_msgrg   r,   rT   rU   webhook_resultrY   encrypted_tokenexisting_botbotsettings_records                  r    set_telegram_webhookr~   }   s]     )):):;;H<<LL*tu	!
 	
 -.N --.i8N8N7OxXfWghK
$$& 	 	&#[[.w/@/@.AM[) )  H ##s*)89M9M8NO	 	 	 &]]_N!%%d+)01C1CM1R0ST	 	 	 	 	63
'(9(9: xx,33!!\%;%;;

%' 	 )8L&$,LL$<L!*8L'"*L&.oo&7L#&00-!j1-C FF3K ((>299$$(>(>>

%' 	 (/O%)1):O&,&00!O FF?#
		!\\*-#
 	
i < 		 	 	 	 	 	(  
!+CF84
 	

j  

!HQQ
 	

s  N L
A N =L2 LL2 (LL,L.L2 :L;L2 ?N  ?L?L2 LL2 N L2 LL2 "F'M! 	N L2 LL2 L2 L2 L/"L%#L/*L2 2	M;MMN MN !	N*(NNN NN z/disable-brandc                 `  K   |j                  t              j                  t        j                  | j                  k(        j	                         }|r	 t        |j                        }|rLt        j                         4 d{   }|j                  d| dd       d{    ddd      d{    d|_        t        j                         |_        |j                  t              j                  t        j                  | j                  k(        j	                         }|r!d|_        t        j                         |_        n(t        | j                  d      }|j#                  |       |j%                          d	d
dS 7 7 7 # 1 d{  7  sw Y   xY w# t        $ r Y w xY ww)uR   Отключить бренд-бот и вернуться к системномуNr?   z/deleteWebhookr@   rA   disabledsystemrj   Tz*Brand bot disabled, switched to system botr$   r4   )ro   r   rp   re   rq   r   rf   rL   rM   rn   rS   rh   r   rr   rs   r   rk   rt   ru   )r]   r^   r|   decrypted_tokenrT   r}   s         r    disable_brand_botr      s     ((;

&
&!7!77eg  		+C,=,=>O ,,.  & ++66G~V $ &      
!* hh~.55  L$:$::eg  $,!%-__%6"(",,
 	IIK#OPP;   
  		s   AF./F FF F
!F"F
&F 1F2F 6CF.F F
F 
FFFF 	F+(F.*F++F.z/enable-brandc                 h  K   |j                  t              j                  t        t        j                  | j                  k(  t        j
                  dk(              j                         }|st        dd      |j                  t              j                  t        j                  | j                  k(        j                         }|r!d|_	        t        j                         |_        n(t        | j                  d      }|j                  |       |j                          dd|j                  d	S w)
uR   Активировать бренд-бот (если он уже настроен)rd   i  ur   Бренд-бот не настроен. Сначала добавьте бота через /telegram/set-webhookrO   detailri   rj   TzBrand bot enabled)r$   r4   r%   )ro   r   rp   r	   re   rh   rq   r   r   rk   r   rr   rs   rt   ru   r%   )r]   r^   r|   r}   s       r    enable_brand_botr     s     ((;

&
&!!\%;%;;(*	

 eg   H
 	
 hh~.55  L$:$::eg  $+!%-__%6"(",,
 	IIK#6CLLQQs   D0D2z/disable-telegramc                 d  K   |j                  t              j                  t        j                  | j                  k(        j	                         }|r!d|_        t        j                         |_        n(t        | j                  d      }|j                  |       |j                          dddS w)uz   Полностью отключить Telegram для тенанта (не использовать в рассылках)r   rj   Tz!Telegram disabled for this tenantr   )ro   r   rp   re   rq   rk   r   rr   rs   rt   ru   )r]   r^   r}   s      r    disable_telegramr   A  s      hh~.55  L$:$::eg  $.!%-__%6"(",, 
 	IIK#FGGs   B.B0re   user_idc                    t        j                  d      }|  d| d| }t        j                  t        j
                  j                         |j                         t        j                        j                         dd }| d| S )uI   Генерировать payload для deeplink с HMAC подписью   :N)
secretstoken_urlsafehmacnewrl   
SECRET_KEYencodehashlibsha256	hexdigest)re   r   noncepayload	signatures        r    _generate_deeplink_payloadr   \  s    !!"%E1WIQug.G ""$ ik#2	I Ya	{##r   z	/deeplink.zUser ID for deeplink)rG   c                   K   |j                  t              j                  t        j                  |j                  k(        j	                         }|r|j
                  dk(  r|j                  t              j                  t        t        j                  |j                  k(  t        j                  dk(              j	                         }|r|j                  }nAt        j                  j                  dd      }n t        j                  j                  dd      }t        |j                  |       }d| d| }|}t        ||d|       S w)uH   Получить deeplink для подписки на Telegram ботаri   rd   @ zhttps://t.me/z?start=)r/   r0   r%   )ro   r   rp   re   rq   rk   r   r	   rh   r%   rl   SYSTEM_TG_BOT_USERNAMEreplacer   r.   )	r   r]   r^   r}   r|   r%   r   r/   r0   s	            r    get_telegram_deeplinkr   k  s-     hh~.55  L$:$::eg  ?44?hh{#**%%)?)??""h.

 %' 	 ||H  66>>sBGH 22::3C ))?)?IG xjy9H GXJ s   EE
z/test-clientc                 ~    | j                   dk7  rt        dd      t        j                  }|sdddS |dd	| d
ddS )ui   Получить тестового Telegram клиента из env (только для админов)admini  uI   Доступ разрешен только администраторамr   NF)chat_id	availableTu   Тестовый клиент ())r   r   labelis_test)roler   rl   TEST_TELEGRAM_CHAT_ID)r]   test_chat_ids     r    get_test_telegram_clientr     sa     G#^
 	
 11Le44  2<.B	 r   z
/send-testc           	      ~  K   | j                   st        ddd      S |j                  t              j	                  t        t        j                  | j                  k(  t        j                   | j                   k(              j                         }|sZt        | j                  | j                   ddgddd	      }|j                  |       |j                          |j                  |       |j                  st        dd
d
      S ddlm}  || j                         d{   }|st        ddd      S dt        j                   d}	 t!        j"                         4 d{   }|j%                  d| d|j                  |ddd       d{   }|j&                  dk(  r|j)                         }|j+                  d      rt        dd      cddd      d{    S t        dd|j+                  d       d|j+                  d             cddd      d{    S t        dd|j&                   d|j&                         cddd      d{    S 7 ?7 7 7 7 G7 # 1 d{  7  sw Y   yxY w# t,        $ r0}	t        ddt/        |	       dt/        |	             cY d}	~	S d}	~	ww xY ww)uB   Отправить тестовое сообщение в TelegramFzUser email not foundr3   r4   r&   Ntestz	Test Usertelegram_test)namesource)re   email
tg_chat_idtagsmetazHUser not subscribed to Telegram. Please use deeplink to subscribe first.r   )choose_telegram_senderzNo Telegram bot configuredu2   🎉 Тестовое уведомление от uM   !

Система уведомлений работает корректно.r?   z/sendMessageMarkdown)r   text
parse_moder@   rc   rC   r$   TzTest message sent successfullyr3   r4   rI   rG   rK   zFailed to send message: )r   r2   ro   r   rp   r	   re   rq   rt   ru   refreshr   app.services.telegram_senderr   rl   APP_NAMErL   rM   rn   rO   rP   rN   rS   r   )
r]   r^   test_customerr   r   test_messagerT   rU   rD   rY   s
             r    send_telegram_testr     s     *(
 	
 HHX&--,"8"88NNl000	

 eg   ",,$$%A
 	}
		


=!##^\
 	
 D,\-C-CDDI0.
 	
 HHYHYGZ  [j  kL%
$$& 	 	&#[[.ykF,77(",
  )  H ##s*!::d#+ $ @	 	 	& , %"6vzz-7P6Q R 4VZZ5N4OP'	 	 	2 (!#H$8$8#9:!("6"6!783	 	 	 E		 	 	 	 	 	>  
.s1vh7,SVH5
 	

s   DJ= I!(J=
J "I"#J &*I,I$A I,J I&J "J=#1I,J  I(!J %J=&'I,J I*J J="J $I,&J (J *J ,I>2I53I>:J =J=>J 	J:
%J5/J:0J=5J::J=z/botsc                 b  K   |j                  t              j                  t        j                  | j                  k(        j	                         }d}|r#|j
                  dk(  rd}n|j
                  dk(  rd}ddt        j                  dd|dk(  |j                  t              j                  t        t        j                  | j                  k(  t        j                  j                  d      t        j                  dk(              j                         d}g }|j                  t              j                  t        j                  | j                  k(        j	                         }|r|j                  |j                   d	|j"                  rd
|j"                   ndd|j$                  |dk(  xr |j$                  dk(  |j&                  r|j&                  j)                         nd|j*                  r|j*                  j)                         ndd       |g}|r|j-                  |       |||dk(  dS w)ud   Получить список всех Telegram ботов (системный + кастомные)r   ri   r   u   Системный ботrd   NF)rF   r   r%   typerh   	is_activesubscribers_countu   Мой бренд-ботr   )rF   r   r%   r   rh   r   
created_atrs   )botscurrent_senderis_disabled)ro   r   rp   re   rq   rk   rl   r   r   r	   r   isnotopt_outcountr   appendrF   r%   rh   r   	isoformatrs   extend)r]   r^   r}   rk   
system_botcustom_bots	brand_botr   s           r    get_telegram_botsr     s     hh~.55  L$:$::eg  I$$/I&&*4"I +33(*XXh/66""l&<&<<##))$/  E)
 %'J" K%,,!7!77eg  ,,.4=4F4F!I../0D&&"g-N)2B2Bh2N>G>R>R)..88:X\>G>R>R)..88:X\	
 		 <DK IiS]F]^^s   H-H/z/statusc                   K   |j                  t              j                  t        j                  | j                  k(        j	                         }d}t
        j                  }d}d}|r|j                  dk(  rtd}|j                  t              j                  t        j                  | j                  k(        j	                         }|r!|j                  dk(  rd|j                   }d}nd}|j                  t              j                  t        t        j                  | j                  k(  t        j                  j                  d      t        j                  dk(              j!                         }||||d	S w)
u;   Получить статус Telegram интеграцииr   r   ri   rd   r   r   NF)senderbot_usernamewebhook_statusr   )ro   r   rp   re   rq   rl   r   rk   r   rh   r%   r   r	   r   r   r   r   )r]   r^   r}   rk   r   r   r   r|   s           r    get_telegram_statusr   P  sQ     hh~.55  L$:$::eg  I22LN?44?	 hh{#**!!\%;%;;

%' 	 3::)s||n-L%N'N *11,"8"88%%d+%	
 eg  $(.	 s   E6E8z/channels/testrV   c                 D  K   	 | j                   dk(  rddlm}  |       }| j                  j	                  d      }|j                  | j                  | j                  |j                  d|       d{   }|j                  rO|j                  r|j                  j                  dd	      nd	}|j	                  d
      rdnd}t        dd|       S t        d|j                  xs d|j                  xs d      S | j                   dk(  rddlm}  |       }|j                  | j                  | j                  d|j                         d{   }|j                  rt        dd      S t        dd|j                   t        |j                              S | j                   dk(  rddlm}	  |	       }|j                  | j                  | j                  |j                         d{   }|j                  rt        dd      S t        dd|j                   t        |j                              S t        dd| j                    d | j                          S 7 7 7 y# t$        $ r-}
t        dd!t        |
       t        |
            cY d}
~
S d}
~
ww xY ww)"uO   Отправить тестовое сообщение в любой каналtelegramr   )TelegramAdapterr   r   )targetcontentre   r   use_mtprotoNmethodbot_apimtprotou(   через Telegram Client API (MTProto)u   через Telegram Bot APITuT   Тестовое сообщение успешно отправлено в Telegram r   Fu)   Ошибка отправки в TelegramrH   r   r   )EmailAdapteru#   Тестовое сообщение)r   r   subjectre   uR   Тестовое сообщение успешно отправлено на emailu%   Ошибка отправки email: vk)	VKAdapter)r   r   re   uM   Тестовое сообщение успешно отправлено в VKu"   Ошибка отправки VK: u-   Неподдерживаемый канал: zUnsupported channel: u   Ошибка отправки: )r9   app.channels.telegramr   r:   
startswithsendr4   re   r3   response_metarN   r<   r&   app.channels.emailr   r   app.channels.vkr   rS   )rV   r]   r   adapterr   rD   r   method_textr   r   rY   s              r    test_channelr     s    Y
<<:%=%'G ..33C8K"<<~~&00%' (  F ~~JPJ^J^--11(IFdmLRL]L]^gLhH  oL* rs~r  A 
 +!"LLW,W ,,9/  \\W$7"nG"<<~~=&00	 (  F ~~* p 
 +!CFLL>Rfll+  \\T!1kG"<<~~&00 (  F ~~* k 
 +!@Ofll+  'G~V-dll^< I4.2  
"5c!fX>a&
 	

s   J A.I' 2I3AI' J )I' ;J <AI' I"I' +J ,-I' J AI' +I%,I' J 	-I' 6J 7'I' J I' "I' %I' '	J0"JJJ JJ );rL   r   r   r   r   fastapir   r   r   r   sqlalchemy.ormr   
sqlalchemyr	   pydanticr
   app.db.sessionr   app.db.modelsr   r   r   r   app.api.depsr   app.core.configr   app.utils.encryptionr   r   r   routerrl   r   r#   r)   r+   r.   r2   r8   r<   r   dictrZ   rn   r`   r~   r   r   r   intr   rN   r   r   r   r   r   r   r   r   r    <module>r      s        < < "   ! E E ) ( V V 
>	  	  y y  ) "_ "_ "_J ^,>? !!12&/


 	
 @
( ^,>? !!12&/f
f
f
 	f
 @f
R  !12&/-Q-Q-Q -Q` _ !12&/%R%R%R %RP  ! !12&/HHH "H4$# $ $ $ K(89*@A !12&/+++ 	+ :+\ N !12 0 \*:; !12&/\
\
\
 <\
~ G !12&/9_9_9_ 9_x I !12&/,,, ,^ .AB !!12_

_
_
 C_
r   