
    kUOiC                     l    d dl Z d dlmZmZmZ d dlmZmZ d dlm	Z	 d dl
mZ  e	       Z G d de      Zy)    N)retrystop_after_attemptwait_exponential)NotificationChannelDeliveryResult)get_settings)choose_telegram_senderc                       e Zd ZdZedefd       Z e ed       e	ddd      	      d
edede
fd       ZdedefdZy)TelegramAdapterz9Telegram Bot API adapter with retry logic for rate limitsreturnc                      y)Ntelegram )selfs    //var/www/notifications/app/channels/telegram.pychannel_namezTelegramAdapter.channel_name   s                 
   )
multiplierminmax)stopwaittargetcontentc           	        K   |j                  d      }|st        dd      S |j                  dd      }ddlm} ddlm}  |       }	 |j                  |      j                  |j                  |k(        j                         }	|	r|	j                  d	k(  rd
}|j                          |s|j                  d      rfddlm}
m}m}m} ddlm}  |       }	 ddlm} |j                  |      j                  |j                  |k(        j                         }	d}|	r|	j$                  r|	j$                  }n |||       d{   }|r; |||       d{   r) |
|||j                  dd      ||       d{   \  }}n; |        d{   r' |
|||j                  dd             d{   \  }}nd\  }}|r t        d
d	dd	i      |j                          S |j                  d      r!t        d|xs d      |j                          S 	 |j                          t'        |       d{   }|s?ddlm}
m}m} ddlm} ddlm}  |       }	 |j                  |      j                  |j                  |k(        j                         }	d}|	r|	j$                  r|	j$                  }n |||       d{   }|r; |||       d{   r) |
|||j                  dd      ||       d{   \  }}n; |        d{   r' |
|||j                  dd             d{   \  }}nd\  }}|r t        d
d	dd	i      |j                          S 	 |j                          t        dd      S d| d}|||j                  dd      |j                  dd      d}	 t)        j*                  d      4 d{   }|j-                  ||        d{   }|j.                  d!k(  r_t1        |j3                         j                  d"i       j                  d#d$            }t)        j4                  d%| d&|j6                  |'      |j9                          |j3                         }|j                  d(      r1t        d
t;        |d)   d*         |d)         cddd      d{    S |j                  d+      }|j                  d,d-      }|d.v rd/|j=                         v sd0|j=                         v rnddlm}
m}m} ddlm} ddlm}  |       }	 |j                  |      j                  |j                  |k(        j                         }	d}|	r|	j$                  r|	j$                  }n |||       d{   }|r; |||       d{   r) |
|||j                  dd      ||       d{   \  }}n; |        d{   r' |
|||j                  dd             d{   \  }}nd\  }}|j                          |r!t        d
d	dd1i      cddd      d{    S | j?                  ||       d{    t        dd2| d
3      cddd      d{    S t        d|      cddd      d{    S # |j                          w xY w7 ]7 L7 *7 7 # |j                          w xY w7 7 
7 7 7 7 # |j                          w xY w7 )7 7 E7 s7 b7 @7 07 # |j                          w xY w7 7 7 7 # 1 d{  7  sw Y   yxY w# t(        j@                  $ rf}ddlm}
m}m} ddlm} ddlm}  |       }	 |j                  |      j                  |j                  |k(        j                         }	d}|	r|	j$                  r|	j$                  }n |||       d{  7  }|r= |||       d{  7  r* |
|||j                  dd      ||       d{  7  \  }}n= |        d{  7  r( |
|||j                  dd             d{  7  \  }}nd\  }}|j                          n# |j                          w xY w|r|rt        d
d	dd1i      cY d}~S t        dd4t;        |             cY d}~S d}~wtB        $ r#}t        dd5t;        |             cY d}~S d}~ww xY ww)6u  
        Send message via Telegram Bot API или Client API (MTProto)
        
        Args:
            target: chat_id (customer.tg_chat_id) или username (@username)
            content: message text
            kwargs: 
                - tenant_id (required)
                - parse_mode (default: Markdown)
                - disable_web_page_preview
                - use_mtproto (bool): принудительно использовать MTProto
        
        Тип отправки определяется из настроек тенанта (TenantSettings.tg_sender):
        - "system" или "brand" - использует Bot API
        - "mtproto" - использует MTProto (аккаунт из TenantSettings.mtproto_account_id)
        - "disabled" - отправка отключена
        
        Автоматически выбирает правильный MTProto аккаунт на основе номера телефона клиента.
        Если номер клиента совпадает с номером MTProto аккаунта, используется этот аккаунт.
        	tenant_idFz*tenant_id is required for Telegram sending)successerroruse_mtprotor   SessionLocal)TenantSettingsmtprotoT@)send_message_via_mtprotois_mtproto_availableget_default_mtproto_accountget_mtproto_account_by_phoneN)
account_iddb
parse_modeMarkdown)	recipientmessager/   r-   r.   )r1   r2   r/   )Fu   MTProto не настроенmethod)r!   
message_idresponse_metau   Отправка по username (@username) требует настройки Telegram Client API (MTProto). Проверьте настройки.)r)   r*   r+   )FNz*No Telegram bot configured for this tenantzhttps://api.telegram.org/botz/sendMessagedisable_web_page_preview)chat_idtextr/   r6   g      >@)timeout)jsoni  
parametersretry_after   zRate limited, retry after s)requestresponseokresultr4   
error_codedescriptionzUnknown error)i  i  blockedzchat not foundmtproto_fallbackz$User blocked bot or chat not found: )r!   r"   opt_outzHTTP error: zUnexpected error: )"getr   app.db.sessionr%   app.db.modelsr&   queryfilterr    first	tg_senderclose
startswithapp.services.telegram_mtprotor)   r*   r+   r,   mtproto_account_idr	   httpxAsyncClientpoststatus_codeintr:   HTTPStatusErrorr?   raise_for_statusstrlower_mark_user_opt_out	HTTPError	Exception)r   r   r   kwargsr    r#   r%   r&   db_settingstenant_settingsr)   r*   r+   r,   r.   r-   r!   r"   	bot_tokendb_fallbackurlpayloadclientr@   r<   datarC   error_descriptiones                                r   sendzTelegramAdapter.send   s:	    2 JJ{+	!B 
 jj6 	00"n		 )//?FF((I5eg 
 ?#<#<	#I" &++C0  4 B08 #%((>":"A"A",,	9#%'   "
"'I'I!0!C!CJ (C9b'Q!QJ(<
WY(Z"Z"Z+C"( '#)::lJ#G#-, &NGU 0111+C"( '#)::lJ#G, &NGU &LNGU) $#,'/&; 
 $$S)) %#  |  (| 
 * 
 1;;	 
 44&.K$$"-"3"3N"C"J"J",,	9#%'   "
"'I'I!0!C!CJ'B9k'Z!ZJ(<
Wb(c"c"c+C"( '#)::lJ#G#-&, &NGU 0111+C"( '#)::lJ#G, &NGU &1NGU) $#,'/&; !!#  !!#!B 
 -YK|D **\:>(.

3Mu(U	
U	((6 X X&!'Sw!??''3."%hmmo&9&9,&K&O&OP]_`&a"bK//4[MC ( 0 0!)  ))+}}88D>) $#&tH~l'C#D&*8n!X X X. "&,!7J(,(P% "Z/YBSBYBYB[5[_o  tE  tK  tK  tM  `M 
 @@&2n0.9.?.?.O.V.V . 8 8I E/#eg , *.J.?3U3U-<-O-O
3NyZe3f-f
)4HT^cn4o.o.o7O.4,3/5zz,
/S/9'28" 2" (<'=!=!=7O.4,3/5zz,
/S8" 2" 2='--/"#1(,+4/79K.L$MX X XZ #55iHHH-$)$HIZH["\$( _X X Xj * %/kX X XC 8 "R"Z& 2&. 
 <, "["c& 2& !!# X?X` .g.o2" ">2" (--/GXZ I[X X X X Xt  5	 
 44&.K$"-"3"3N"C"J"J",,	9#%'   "
"'I'I!0!C!CJ'B9k'Z!Z!ZJ(<
Wb(c"c"c+C"( '#)::lJ#G#-&, & &NGU 0111+C"( '#)::lJ#G, & &NGU &1NGU!!#!!#) $#,'/1C&D  "$SVH-   	!*3q6(3 	s2  Ac	AZ =cA*Z+ ?Z Z+ Z$Z+ 8Z"9Z+ Z%"Z+ .Z(/Z+ c!Z+ ?cc/[ 0$cA$[ 9[:[ [$[ 2[	3[ ["[ ([)[ cA
c$\1 >['?\1 \[*C\\1 ([-)\1 -c.A*\A$[?=[0>[?[3$[?6[67[?	[9
"[?,[<-[?:!\\1 '\(\1 ,c-\\\\1 #\$\1 (c)\5\1 \\1 cZcZ+ Z+ "Z+ %Z+ (Z+ +Z==c[ [ 	[ [ [ [$$c'\1 *\-\1 0[?3[?6[?9[?<[??\\\1 \\1 \1 \."\%#\.*\1 -c.\1 1cb&#A$a_
a_%a`a`#a:`=;a	b&a,,b&ccb& c!c&c2c
ccccr    r7   c                 b  K   	 ddl m} ddlm}  |       }	 |j	                  |      j                  |j                  |k(  |j                  |k(        j                         }|rd|_	        |j                          |j                          y# |j                          w xY w# t        $ r Y yw xY ww)u8   Пометить пользователя как opt_outr   r$   )CustomerTN)rI   r%   rJ   rl   rK   rL   r    
tg_chat_idrM   rG   commitrO   r^   )r   r    r7   r%   rl   r.   customers          r   r\   z"TelegramAdapter._mark_user_opt_outW  s     	3.B88H-44&&)3''72 %' 
 '+H$IIK

 		s@   B/B  A"B :B  
B/BB   	B,)B/+B,,B/N)__name__
__module____qualname____doc__propertyrZ   r   r   r   r   r   rj   rW   r\   r   r   r   r   r   
   sy    Cc   "r:@ @s @ @	@D
#  r   r   )rS   tenacityr   r   r   app.channels.baser   r   app.core.configr   app.services.telegram_senderr	   settingsr   r   r   r   <module>rz      s-     @ @ A ( ?>b) br   