o
    g                     @   sH  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl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m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#m$Z$m%Z%m&Z& d dl'm(Z( zd dl)Z)W n e*y   d dl+Z)Y nw ej,eefZ-dZ.G dd de/Z0dd Z1dd Z2dS )    N)datetime	timedelta)UUIDuuid4)tzutc)string_types)Consumer)ExceptionCapture)exc_info_from_errorexceptions_from_error_tuplehandle_in_app)InconclusiveMatchErrormatch_feature_flag_properties)Poller)DEFAULT_HOSTAPIError
batch_postdecidedetermine_server_hostget)SizeLimitedDictcleanguess_timezoneremove_trailing_slash)VERSIONiP  c                   @   s  e Zd ZdZedZ													
														dKddZdLddZ	dMddZ		dMddZ
	dMddZdMddZ									dNddZdLddZdLddZ								dOdd ZdLd!d"Z	dPd#d$Z							dPd%d&Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zi i i dd3d4d5Zi i i dddd6d7d8Zi i i dddd6d9d:Zdi i i dddd;d<d=Zd>d? Zi i i ddd@dAdBZi i i ddd@dCdDZ i i i dd3dEdFZ!dGdH Z"dIdJ Z#dS )QClientzCreate a new PostHog client.posthogNF'  Td         ?            c                 C   s  t || _ |p	|| _td| jt || _|| _|| _|| _|p!t	| _
t|| _|	| _|| _d | _d | _d | _d | _|| _|| _d | _ttt| _|| _|| _|| _|| _|| _|| _d | _ || _!|d u rwzt"# }W n t$yv   d }Y nw || _%|| _&|rt'(  | j)*t'j+ n| j)*t'j, | jrt-| | jd| _ |rd | _.d S |rt/0| j1 t2|D ]"}g | _.t3| j | j| j||||	|
||d
}| j.4| |r|5  qd S )Napi_key)integrations)hoston_errorflush_atflush_intervalgzipretriestimeouthistorical_migration)6queueQueuer$   requirer   r'   debugsend	sync_moder   raw_hostr   r&   r*   r,   feature_flagsfeature_flags_by_keygroup_type_mappingcohortspoll_interval%feature_flags_request_timeout_secondspollerr   MAX_DICT_SIZEset#distinct_ids_feature_flags_reporteddisableddisable_geoipr-   super_propertiesenable_exception_autocapture"exception_autocapture_integrationsexception_captureprivacy_modeosgetcwd	Exceptionproject_rootpersonal_api_keyloggingbasicConfiglogsetLevelDEBUGWARNINGr	   	consumersatexitregisterjoinranger   appendstart)selfr$   r&   r1   max_queue_sizer2   r'   r(   r)   r*   max_retriesr3   r,   threadr9   rJ   project_api_keyr?   r@   r-   r:   rA   rB   rC   rI   rE   nconsumer r_   E/var/www/visachat/venv/lib/python3.10/site-packages/posthog/client.py__init__$   s   



zClient.__init__c                 C   F   |pi }|pi }t d|t t d|t ||||d|d}| ||S )Ndistinct_id
propertiesz	$identify	timestampcontextrc   $seteventuuidr0   ID_TYPESdict_enqueuerX   rc   rd   rg   rf   rj   r@   msgr_   r_   r`   identify      	zClient.identifyc                 C      |  |||||}|d S )NfeatureFlags
get_deciderX   rc   groupsperson_propertiesgroup_propertiesr@   	resp_datar_   r_   r`   get_feature_variants      zClient.get_feature_variantsc                 C   rs   )NfeatureFlagPayloadsru   rw   r_   r_   r`   get_feature_payloads   r}   zClient.get_feature_payloadsc                 C   s$   |  |||||}|d |d dS )Nrt   r~   rt   r~   ru   rw   r_   r_   r`   get_feature_flags_and_payloads   s   z%Client.get_feature_flags_and_payloadsc                 C   s`   t d|t |d u r| j}|rt d|t ni }|||||d}t| j| jfd| ji|}|S )Nrc   rx   )rc   rx   ry   rz   r@   r,   )r0   rl   r@   rm   r   r$   r&   r:   )rX   rc   rx   ry   rz   r@   request_datar{   r_   r_   r`   rv      s   zClient.get_decidec
              
   C   s8  |pi }|pi }t d|t t d|t t d|t ||||||d}
|r1t d|t ||
d d< i }i }|r]z
| j|||	d}W n) ty\ } z| jd|  W Y d }~nd }~ww | jrk| j	||pfi |	d	d
}|
 D ]\}}||d| < qodd |
 D }|r||d< |ri ||
d |
d< | |
|	S )Nrc   rd   ri   )rd   rf   rg   rc   ri   rj   rx   z$groups)r@   z0[FEATURE FLAGS] Unable to get feature variants: T)rx   r@   only_evaluate_locally	$feature/c                 S   s   g | ]
\}}|d ur|qS )Fr_   ).0keyvaluer_   r_   r`   
<listcomp>  s    z"Client.capture.<locals>.<listcomp>z$active_feature_flags)r0   rl   rm   r   r|   rH   rM   	exceptionr5   get_all_flagsitemsrn   )rX   rc   ri   rd   rg   rf   rj   rx   send_feature_flagsr@   rp   extra_propertiesfeature_variantsefeaturevariantactive_feature_flagsr_   r_   r`   capture   sH   	zClient.capturec                 C   rb   )Nrc   rd   rh   re   rk   ro   r_   r_   r`   r=   
  rr   z
Client.setc                 C   rb   )Nrc   rd   	$set_once)rf   rg   rc   r   ri   rj   rk   ro   r_   r_   r`   set_once  rr   zClient.set_oncec	           
      C   sx   |pi }|pi }t d|t t d|t t d|t |r#t d|t nd||}d|||d||||d}	| |	|S )	N
group_type	group_keyrd   rc   z${}_{}z$groupidentify)z$group_type
$group_keyz
$group_set)ri   rd   rc   rf   rg   rj   )r0   rl   rm   formatrn   )
rX   r   r   rd   rg   rf   rj   r@   rc   rp   r_   r_   r`   group_identify,  s&   zClient.group_identifyc                 C   sB   |pi }t d|t t d|t ||d||d|d}| ||S )Nprevious_idrc   )rc   aliasz$create_alias)rd   rf   rg   ri   rc   )r0   rl   rn   )rX   r   rc   rg   rf   rj   r@   rp   r_   r_   r`   r   Q  s   zClient.aliasc           	      C   sZ   |pi }|pi }t d|t t d|t t d|t ||d< d|||||d}| ||S )Nrc   rd   urlz$current_urlz	$pageview)ri   rd   rf   rg   rc   rj   )r0   rl   rm   r   rn   )	rX   rc   r   rd   rg   rf   rj   r@   rp   r_   r_   r`   paged  s   	zClient.pagec              
   C   s,  zy|pi }|d u rd|d< t  }td|t td|t |d ur%t|}nt }|d u s1|dkr:| jd W d S t	|}	t
dd|	ii| jd	}
|
d d }|d
 d|d
 d|t| j d| j d| d|}| |d|||||W S  ty } z| jd|  W Y d }~d S d }~ww )NFz$process_person_profilerc   rd   )NNNz"No exception information availabler   values)rI   r   typer   z	/project/z/person/)z$exception_typez$exception_messagez$exception_listz$exception_personURLz
$exceptionzFailed to capture exception: )r   r0   rl   rm   r
   sysexc_inforM   warningr   r   rI   r   r   r4   r$   r   rH   r   )rX   r   rc   rd   rg   rf   rj   rx   r   all_exceptions_with_traceri   $all_exceptions_with_trace_and_in_appr   r_   r_   r`   capture_exception{  sD   
 zClient.capture_exceptionc                 C   s  | j rdS |d }|du rtjt d}td|t td|d t t|}| |d< d|v r=|d}|r=t	||d< |
dsFi |d< d|d d	< t|d d
< |du rY| j}|rad|d d< | jroi |d | j|d< t	|
dd|d< t|}| jd| | jsd|fS | jr| jd|d  t| j| j| j| j|g| jd d|fS z| jj|dd | jd|d  d|fW S  tjy   | jd d|f Y S w )z8Push a new `msg` onto the queue, return `(success, msg)`)Fr?   rf   Ntzrg   rj   rd   zposthog-pythonz$libz$lib_versionTz$geoip_disablerc   zqueueing: %szenqueued with blocking %s.ri   )r*   r,   batchr-   F)blockzenqueued %s.zanalytics-python queue is full)r?   r   nowr   r0   rm   r   	isoformatpopstringify_idr   r   r@   rA   r   rM   r1   r2   r3   r   r$   r&   r*   r,   r-   r.   putFullr   )rX   rp   r@   rf   rj   r_   r_   r`   rn     s^   

	
zClient._enqueuec                 C   s(   | j }| }|  | jd| dS )z4Forces a flush from the internal queue to the serverz$successfully flushed about %s items.N)r.   qsizerT   rM   r1   )rX   r.   sizer_   r_   r`   flush  s   zClient.flushc              	   C   sJ   | j D ]}|  z|  W q ty   Y qw | jr#| j  dS dS )zbEnds the consumer thread once the queue is empty.
        Blocks execution until finished
        N)rQ   pauserT   RuntimeErrorr;   stop)rX   r^   r_   r_   r`   rT     s   
zClient.joinc                 C   s(   |    |   | jr| j  dS dS )z2Flush all messages and cleanly shutdown the clientN)r   rT   rD   closerX   r_   r_   r`   shutdown  s
   zClient.shutdownc              
   C   s  z/t | jd| j d| jdd}|d pg | _dd | jD | _|d p%i | _|d	 p,i | _W nP ty_ } z$|j	d
krL| j
d | jrKtd
ddn	| j
d|  W Y d }~n%d }~w ty } z| j
d| j  | j
| W Y d }~nd }~ww tjt d| _d S )Nz*/api/feature_flag/local_evaluation/?token=z&send_cohorts
   )r,   flagsc                 S   s$   i | ]}| d dur|d  |qS )r   Nr   )r   flagr_   r_   r`   
<dictcomp>"  s    z.Client._load_feature_flags.<locals>.<dictcomp>r7   r8   i  z[FEATURE FLAGS] Error loading feature flags: To use feature flags, please set a valid personal_api_key. More information: https://posthog.com/docs/api/overviewzYou are using a write-only key with feature flags. To use feature flags, please set a personal_api_key More information: https://posthog.com/docs/api/overview)statusmessagez-[FEATURE FLAGS] Error loading feature flags: z`[FEATURE FLAGS] Fetching feature flags failed with following error. We will retry in %s seconds.r   )r   rJ   r$   r&   r5   r6   r7   r8   r   r   rM   errorr1   rH   r   r9   r   r   r   _last_feature_flag_poll)rX   responser   r_   r_   r`   _load_feature_flags  sH   
zClient._load_feature_flagsc                 C   s^   | j s| jd g | _d S |   | jr| j s-tt| j	d| jd| _| j
  d S d S )NzL[FEATURE FLAGS] You have to specify a personal_api_key to use feature flags.)seconds)intervalexecute)rJ   rM   r   r5   r   r;   is_aliver   r   r9   rW   r   r_   r_   r`   load_feature_flags?  s   zClient.load_feature_flagsrx   ry   rz   warn_on_unknown_groupsc                C   s   | ddr
td| dsdS | dpi }| d}|d urk| j t|}	|	s=| jd| d|d	   td
|	|vr_|rQ| jd|d	  d dS | jd|d	  d dS ||	 }
t|||	 |
S t|||| jS )Nensure_experience_continuityFz&Flag has experience continuity enabledactivefiltersaggregation_group_type_indexz)[FEATURE FLAGS] Unknown group type index z for feature flag r   z!Flag has unknown group type indexz2[FEATURE FLAGS] Can't compute group feature flag: z without group names passed in)	r   r   r7   strrM   r   r1   r   r8   )rX   feature_flagrc   rx   ry   rz   r   flag_filtersr   
group_namefocused_group_propertiesr_   r_   r`   _compute_flag_locallyJ  s4   


zClient._compute_flag_locallyrx   ry   rz   r   send_feature_flag_eventsr@   c          
   
   C   s.   | j ||||||||d}	|	d u rd S t|	S )Nr   )get_feature_flagbool)
rX   r   rc   rx   ry   rz   r   r   r@   r   r_   r_   r`   feature_enabledx  s   zClient.feature_enabledc                C   s  t d|t t d|t t d|t | jrd S | ||||\}}| jd u r-| jr-|   d }	| jr| jD ]Y}
|
d |krz| j	|
||||d}	| j
d| d|	  W q5 tys } z| j
d| d|  W Y d }~q5d }~w ty } z| j
d	|  W Y d }~q5d }~ww q5|	d u}|s|sz#| j|||||d
}||}	|	d u rd}	| j
d| d|	  W n ty } z| j
d|  W Y d }~nd }~ww | dt|	 }|| j| vr|r| j|dd|d|	d|d| |	i||d | j| | |	S )Nr   rc   rx   rx   ry   rz   z$Successfully computed flag locally: z -> zFailed to compute flag z
 locally: z7[FEATURE FLAGS] Error while computing variant locally: rx   ry   rz   r@   Fz&Successfully computed flag remotely: #z -> #z-[FEATURE FLAGS] Unable to get flag remotely: _$feature_flag_called$feature_flag$feature_flag_responselocally_evaluatedr   rx   r@   )r0   r   rl   rm   r?   &_add_local_person_and_group_propertiesr5   rJ   r   r   rM   r1   r   rH   r   r|   r   r   r>   r   add)rX   r   rc   rx   ry   rz   r   r   r@   r   r   r   flag_was_locally_evaluatedr5   feature_flag_reported_keyr_   r_   r`   r     s   


zClient.get_feature_flag)match_valuerx   ry   rz   r   r   r@   c                C   s4  | j rd S |d u r| j|||||dd|	d}d }
d }|d ur$| ||}|d u}|sg|sgz| |||||	}|d |d }
|d t| d }W n tyf } z| j	d|  W Y d }~nd }~ww | dt|
 }|| j
| vr|r| j|dd	|d
|
d|d|d| |
i||	d | j
| | |S )NFT)rx   ry   rz   r   r   r@   rt   r~   :[FEATURE FLAGS] Unable to get feature flags and payloads: r   r   r   r   z$feature_flag_payloadr   r   r   )r?   r   _compute_payload_locallyr   r   r   lowerrH   rM   r   r>   r   r   )rX   r   rc   r   rx   ry   rz   r   r   r@   r   payloadr   responses_and_payloadsr   r   r_   r_   r`   get_feature_flag_payload  s^   

zClient.get_feature_flag_payloadc                 C   sV   d }| j d u r	|S | j |pi }|dpi }|dpi }|t| d }|S )Nr   payloads)r6   r   r   r   )rX   r   r   r   flag_definitionr   flag_payloadsr_   r_   r`   r   -  s   
zClient._compute_payload_locallyrx   ry   rz   r   r@   c                C   s   | j ||||||d}|d S )Nr   rt   )get_all_flags_and_payloads)rX   rc   rx   ry   rz   r   r@   r   r_   r_   r`   r   9  s   
zClient.get_all_flagsc             
   C   s   | j rd d dS | ||||\}}| j||||d\}}}	||d}
|	rS|sSz| j|||||d}|}
W |
S  tyR } z| jd|  W Y d }~|
S d }~ww |
S )Nr   r   r   r   )r?   r   #_get_all_flags_and_payloads_locallyrv   rH   rM   r   )rX   rc   rx   ry   rz   r   r@   r   r   fallback_to_decider   flags_and_payloadsr   r_   r_   r`   r   M  s4   


z!Client.get_all_flags_and_payloadsc                C   s   t d|t t d|t | jd u r| jr|   i }i }d}| jrt| jD ]N}	z%| j|	|||||d||	d < | |	d ||	d  }
|
rJ|
||	d < W q$ tyV   d}Y q$ t	yr } z| j
d|  d}W Y d }~q$d }~ww nd}|||fS )Nrc   rx   Fr   r   Tz;[FEATURE FLAGS] Error while computing variant and payload: )r0   rl   rm   r5   rJ   r   r   r   r   rH   rM   r   )rX   rc   rx   ry   rz   r   r   r   r   r   matched_payloadr   r_   r_   r`   r   r  s@   

z*Client._get_all_flags_and_payloads_locallyc                 C   s   | j S N)r5   r   r_   r_   r`   feature_flag_definitions  s   zClient.feature_flag_definitionsc                 C   sH   d|i|pi }i }|r |D ]}d|| i| |pi ||< q||fS )Nrc   r   r   )rX   rc   rx   ry   rz   all_person_propertiesall_group_propertiesr   r_   r_   r`   r     s   
z-Client._add_local_person_and_group_properties)NNFr   TNr   r   Fr    Fr!   r"   r#   NNFTFr    NFNNF)NNNNNN)NNNN)	NNNNNNNFN)NNNNNNNN)NNNNNNN)$__name__
__module____qualname____doc__rK   	getLoggerrM   ra   rq   r|   r   r   rv   r   r=   r   r   r   r   r   rn   r   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r_   r_   r`   r      s    


q



	

9


%

;C'3 YF&&r   c                 C   s$   t ||sd| ||}t|dS )z8Require that the named `field` has the right `data_type`z{0} must have {1}, got: {2}N)
isinstancer   AssertionError)namefield	data_typerp   r_   r_   r`   r0     s   
r0   c                 C   s"   | d u rd S t | tr| S t| S r   )r   r   r   )valr_   r_   r`   r     s
   
r   )3rR   rK   numbersrF   r   r   r   rj   r   r   dateutil.tzr   sixr   posthog.consumerr   posthog.exception_capturer	   posthog.exception_utilsr
   r   r   posthog.feature_flagsr   r   posthog.pollerr   posthog.requestr   r   r   r   r   r   posthog.utilsr   r   r   r   posthog.versionr   r.   ImportErrorr/   Numberrl   r<   objectr   r0   r   r_   r_   r_   r`   <module>   sD            