+
    &j7                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ]P                  P                  RR4      P                  R4      t]P                  P                  RR4      t]P                  P                  R	R
4      t]! ]P                  P                  RR4      4      t]P                  P                  RR4      P%                  4       R%9   t]P                  P                  RR4      tR R ltR R ltR&R R lltR'R R llt]R8X  dk   ]! R]! 4        24       ]! R] 24       ]! R] 24       ]! R] 24       ]! R] 24       ]! 4        ]! R^4      t]! R ]R!R"7      w  tt]! R#] R$] 24       R# R# )(uS  
whatsapp_sender.py — Wrapper Evolution API pra enviar mensagens WhatsApp.

Stack stdlib-only (urllib, json) — sem dependências externas.

Variáveis de ambiente:
  EVOLUTION_BASE_URL       → URL base da Evolution API (ex: https://evo10169.hostoo.net.br)
  EVOLUTION_API_KEY        → API key do header `apikey`
  EVOLUTION_INSTANCE       → nome da instância (default: Dalton-Pessoal)
  BETA_MODE                → "true" ativa política beta: redireciona TODOS envios pra Caue
  BETA_WHATSAPP_TARGET     → número Caue (default: +5511947452497)
  EVOLUTION_TIMEOUT_SEC    → timeout HTTP (default: 15)

Política beta (cerebro/wiki/conceitos/beta-whatsapp-politica.md):
  Em modo beta, TODOS envios vão pro Caue independente do destinatário real.
  A mensagem original é prefixada com `[BETA · destinatário real: <email/phone>]`.
)annotationsN)TupleEVOLUTION_BASE_URLzhttps://evo10169.hostoo.net.br/EVOLUTION_API_KEY EVOLUTION_INSTANCEzDalton-PessoalEVOLUTION_TIMEOUT_SEC15	BETA_MODEtrueBETA_WHATSAPP_TARGETz+5511947452497c                    V ^8  d   QhRRRR/# )   phonestrreturn )formats   "'/opt/apps/studio-api/whatsapp_sender.py__annotate__r   $   s     4 4C 4C 4    c                2    RP                  R V  4       4      # )uC   Normaliza pra formato Evolution: sem +, sem espaços, só dígitos.r   c              3  T   "   T F  qP                  4       '       g   K  Vx  K   	  R # 5i)N)isdigit).0cs   & r   	<genexpr>#_normalize_phone.<locals>.<genexpr>&   s     3eyy{11es   (
()join)r   s   &r   _normalize_phoner    $   s    773e333r   c                   V ^8  d   QhRR/# )r   r   boolr   )r   s   "r   r   r   )   s     : :t :r   c                 <    \        \        ;'       d    \        4      # )uE   Retorna True se Evolution API está configurada (BASE_URL + API_KEY).)r"   r   r   r   r   r   is_configuredr$   )   s    "88'899r   c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   messagereal_recipientr   zTuple[bool, str]r   )r   s   "r   r   r   .   s/     F8 F8 F8s F8C F8IY F8r   c                d   \        4       '       g-   \        RV  24       \        RV 24       \        RV 24       R# \        '       d!   T p\        p RT;'       g    T R2pWA,           p\	        V 4      p\
         R\         2p\        P                  ! RVR	V/4      P                  R
4      p\        P                  P                  VVRRR\        /RR7      p \        P                  P                  V\        R7      ;_uu_ 4       p	V	P!                  4       P#                  R
4      p
V
'       d   \        P$                  ! V
4      M/ pVP'                  R/ 4      P'                  R4      ;'       g5    VP'                  R4      ;'       g    VP'                  R4      ;'       g    RpR\)        V4      3uuRRR4       #   + '       g   i     R# ; i  \        P*                  P,                   d\   pRp TP!                  4       P#                  R
RR7      R,          pM  \.         d     Mi ; iRRTP0                   RT 23u Rp?# Rp?i\        P*                  P2                   d   pRRTP4                   23u Rp?# Rp?i\.         d(   pRR\7        T4      P8                   RT 23u Rp?# Rp?ii ; i) uv  
Envia mensagem via Evolution API.

Args:
    phone: número destinatário (com ou sem +, vai ser normalizado)
    message: corpo da mensagem (texto, suporta markdown WhatsApp)
    real_recipient: identificador do destinatário real (email/phone) — usado
                    em modo beta no prefixo pra Caue saber pra quem era

Returns:
    (success, message_id_or_error)
z[MOCK WHATSAPP] Para: z [MOCK WHATSAPP] Real recipient: z[MOCK WHATSAPP] Mensagem:
Tu1   ⚠️ *[BETA · Six Hype]*
_Destinatário real: u1   _
━━━━━━━━━━━━━━━

z/message/sendText/numbertextzutf-8zContent-Typezapplication/jsonapikeyPOST)dataheadersmethod)timeoutkeyid	messageIdunknownNr   ignore)errors:Ni,  NFzHTTP z: z
URLError: zError: )Tzmock-no-evolution)r$   printr   r   r    r   r   jsondumpsencodeurllibrequestRequestr   urlopenr	   readdecodeloadsgetr   error	HTTPError	ExceptioncodeURLErrorreasontype__name__)r   r&   r'   original_phonebeta_prefixphone_normalizedurlpayloadreqrespbodyr-   msg_ideerr_bodys   &&&            r   send_whatsapprV   .   s    ??&ug./00@AB+G956(( y$$$2$D$Dn#E F@A 	
 ''.  23E2F
GCjj"  vg 
 ..
 
 .'
  ! C8^^##C1F#GG499;%%g.D'+4::d#D#''-  88K( 88D>  	  V$ HGGG <<!! 3	vvxwx@FH 		affXRz222<<   .
188*--- 8Q 0 01A37778s   -G A'F9-F9F9F9.
G 9G
	G 
G J/,I/(HIH&#I%H&&I<J/ J/#J/$I:4J/:J/J/J*$J/*J/c               $    V ^8  d   QhRRRRRR/# )r   magic_link_urlr   expires_minutesintr   r   )r   s   "r   r   r   w   s"      S 3 PS r   c                    RV  RV R2# )u*   Template canônico de magic link em PT-BR.u%   🔐 *Six Hype*

Seu link de acesso:
u   

_Válido por u0    minutos. Não foi você? Ignore essa mensagem._r   )rX   rY   s   &&r   build_magic_link_messager\   w   s&    	 
 '((X	Zr   __main__zis_configured: zBETA_MODE: zBETA_WHATSAPP_TARGET: zEVOLUTION_BASE_URL: zEVOLUTION_INSTANCE: z/https://hype.sixaesthetic.com.br/?token=TEST123z+5599999999zteste@example.com)r'   zResult: ok=z, info=)r   1yes)r   )   )__doc__
__future__r   r8   osurllib.errorr;   urllib.requesttypingr   environrB   rstripr   r   r   rZ   r	   lowerr   r   r    r$   rV   r\   rJ   r7   test_msgokinfor   r   r   <module>rm      sz  $ #  	   ZZ^^$8:Z[bbcfg JJNN#6; ZZ^^$8:JK BJJNN+BDIJ JJNN;/557;OO	zz~~&<>NO 4
:
F8R z	OMO,
-.	K	{
#$	"#7"8
9:	 !3 4
56	 !3 4
56	G'(Y[]^H]HEXYHB	Kt74&
)* r   