
    eTj                        d Z ddlmZ ddlZddlZddlZddlZej                  j                  dd      j                  d      ZdZddZddd	Zdd
ZddZddZddZddZddZddZddZdddZy)zSmartlead cold-email logic for the shared jarvis-tools service (Railway).
Key from env SMARTLEAD_API_KEY. Same behaviour as the Mac in-process tool, but
env-based so every device reaches it through the one connector.
    )annotationsNSMARTLEAD_URLz"https://server.smartlead.ai/api/v1/zuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36c                 T    t        t        j                  j                  dd            S )NSMARTLEAD_API_KEY )boolosenvironget     F/Users/ahmed/devFolder/Ultron/claude-voice/memory-service/smartlead.py
configuredr      s    

2B788r   c           
     $   t         j                  j                  dd      }|j                  d      sd|z   }d|v rdnd}t         | | d| }|#t        j                  |      j                         nd }t        j                  j                  |||       }|j                  dd	       |j                  d
t               |j                  dd	       	 t        j                  j                  ||      5 }	|	j                         }
d d d        
rt        j(                  |
      S i S # 1 sw Y   "xY w# t        j                  j                   $ rA}t#        d|j$                   d|j                         d d j'                  dd             d }~ww xY w)Nr   r   r   ?&zapi_key=)datamethodzContent-Typezapplication/jsonz
User-AgentAccept)timeoutzHTTP z: i  zutf-8ignore)r
   r   r   
startswith_BASEjsondumpsencodeurllibrequestRequest
add_header_UAurlopenreaderror	HTTPErrorRuntimeErrorcodedecodeloads)r   pathbodyr   keysepurlr   reqrrawes               r   _apir4      sV   
**..,b
1C??3Tz##CGD6#hse
,C(,(84::d""$dD
..
 
 4
 
?CNN>#56NN<%NN8/0X^^##C#9Q&&(C : "4::c?)r)	 :9<<!! XU166("QVVXds^-B-B78-T,UVWWXs0   !D1 3D%D1 %D.*D1 1F<F

Fc                   t        |       j                         } | sy | j                         r| S 	 t        dd      xs g }|D ]X  }t        |j	                  dd            j                         | j                         k(  s>t        |j	                  d            c S  |D ]W  }| j                         t        |j	                  dd            j                         v s=t        |j	                  d            c S  	 y # t        $ r Y y w xY w)NGET
/campaignsnamer   id)strstripisdigitr4   r   lower	Exception)refcampscs      r   _campaign_idrB   )   s    
c(..
C
{{}
	UL)/RA155$%++-<155;''  Ayy{c!%%"34::<<155;'' 
   s*   AC;  C; ?C; C; 8C; ;	DDc                 n    t        dd      } | syt        |        ddj                  d | D              z   S )Nr6   r7   z=No campaigns yet (sender inboxes are ready, nothing running).z campaign(s):

c           	   3     K   | ]<  }d |j                  d       d|j                  d      d|j                  d        > yw)z- [r9   z] r8   u    — statusNr   ).0rA   s     r   	<genexpr>zcampaigns.<locals>.<genexpr>@   sB      6UNS#aeeDk]"QUU6]-U155?2CDes   AA)r4   lenjoin)r@   s    r   	campaignsrL   <   sI    %EN%j\)DII 6UNS6U -U U Ur   c                    t        |       }|syt        dd| d      fd}dj                  d|       d |d	       d
 |d       d |d       d |d       d |d       dS )Nu,   Campaign not found — list campaigns first.r6   /campaigns/z
/analyticsc                (    j                  | d      S )Nr   rG   )kas    r   <lambda>z campaign_stats.<locals>.<lambda>I   s    !%%1+r   	Campaign r8   z: sent 
sent_countz	, opened 
open_countz
, replied reply_countz
, bounced bounce_countz, unsubscribed unsubscribed_count.)rB   r4   r   )campaigncidgrQ   s      @r   campaign_statsr]   D   s    
x
 C=Uk#j12AAfc*+71\?2C9z!M*:);: !3G1H0IL Mr   c                 Z   t        dd      } | syg }| D ]v  }|j                  d      xs i }|j                  d|j                  d       d|j                  dd	       d
|j                  dd       d|j                  d      rdnd        x t        |        ddj	                  |      z   S )Nr6   z#/email-accounts/?offset=0&limit=100zNo sender inboxes configured.warmup_detailsz- 
from_emailu    — reputation warmup_reputationzn/az, message_per_dayr   z/day, warmup is_warmup_enabledonoffz inbox(es):
rD   )r4   r   appendrJ   rK   )accslinesr3   wus       r   sendersrj   O   s    <=D.EUU#$*r!%%-..>2E:;2/56 7'(uu-@'AtuMO 	P  $i[&5)999r   c                    t        |       j                         } | syt        ddd| i      }d| d|j                  d      xs |j                  d       d	S )
Nz$create_campaign failed: need a name.POSTz/campaigns/creater8   zCreated campaign z (id r9   campaign_idz).)r:   r;   r4   r   )r8   outs     r   create_campaignro   ]   sX    t9??D5
v*VTN
;CtheCGGDM,SSWW]=S+TTVWWr   c                    t        |       }|sy	 t        j                  |      }t        dd| dd|i       dt        |       d	| d
S # t        $ r}dt	        |      d d  cY d }~S d }~ww xY w)NCampaign not found.z sequence_json isn't valid JSON: x   rl   rN   z
/sequences	sequenceszSaved a z-step sequence on campaign rY   )rB   r   r*   r>   r:   r4   rJ   )rZ   sequence_jsonr[   seqsr3   s        r   set_sequencerv   e   s    
x
 C$Azz-( 	;se:.d0CDc$i[ ;C5BB  A1#a&#,@@As   A
 
	A.A)#A.)A.c           	     2   t        |       }|sy	 t        j                  |      }|syt        dd| dd|d d	 i      }|j                  d
|j                  dt        |                  }d| d| dS # t        $ r}dt	        |      d d  cY d }~S d }~ww xY w)Nrq   zleads_json isn't valid JSON: rr   zNo leads to add.rl   rN   z/leads	lead_listd   upload_counttotal_leadszAdded z lead(s) to campaign rY   )rB   r   r*   r>   r:   r4   r   rJ   )rZ   
leads_jsonr[   leadsr3   rn   ups          r   	add_leadsr   q   s    
x
 C$>

:& !
vSE0;ds2L
MC	E
!C	DBB4,SE33  >.s1vds|n==>s   A2 2	B;BBBc                    t        |       }|syddddj                  t        |      j                               }|syt	        dd| d	d
|i       d| d| dS )Nrq   STARTPAUSEDSTOPPED)startpausestopz%action must be start, pause, or stop.rl   rN   z/statusrF   rS   u    → rY   )rB   r   r:   r=   r4   )rZ   actionr[   rF   s       r   campaign_controlr      sn    
x
 C$9EIIFF6;se7+h-?@se5**r   c                @   d }|r	 t        j                  |      }t	        t        |       j                         t        |      |      }t        j                  |d      }|d d t        |      dkD  rdz   S dz   S # t        $ r}dt        |      d d  cY d }~S d }~ww xY w)Nzbody_json isn't valid JSON: rr   F)ensure_asciii  u    …[truncated]r   )r   r*   r>   r:   r4   upperr   rJ   )r   r+   	body_jsonr,   r3   rn   ss          r   r2   r2      s    D	A::i(D s6{  "CIt
4C

3U+AUd8CFTM(BBrBB	  	A1#a&#,@@	As   A9 9	BBBB)returnr	   )N   )r   r:   r+   r:   r   int)r?   r:   r   z
str | None)r   r:   )rZ   r:   r   r:   )r8   r:   r   r:   )rZ   r:   rt   r:   r   r:   )rZ   r:   r|   r:   r   r:   )rZ   r:   r   r:   r   r:   )r   )r   r:   r+   r:   r   r:   r   r:   )__doc__
__future__r   r   r
   urllib.errorr   urllib.requestr   r   rstripr   r"   r   r4   rB   rL   r]   rj   ro   rv   r   r   r2   r   r   r   <module>r      s    #  	  


;	==CVC[ <9*&&UM:X	C4	+	Cr   