o
    Rh:                     @   s  d dl Z d dlZ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mZ d dlmZmZ d dl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(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m: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jAeefZBdZCdd ZDdeEeFe
f fddZGG dd deHZIdd ZJdd ZKdS )    N)datetime	timedelta)AnyOptionalUnion)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determine_server_hostflagsgetremote_config)get_tags)
FeatureFlagFeatureFlagResultFlagMetadataFlagsAndPayloadsFlagsResponse	FlagValuenormalize_flags_responseto_flags_and_payloadsto_payloads	to_values)SizeLimitedDictcleanguess_timezoneremove_trailing_slash)VERSIONiP  c                  C   s   d} d}t j}|dr!d} ttdrt d }|r|}| |fS |dkr:d} ttdr6t d }|r6|}| |fS |d	rQd
} t }|d rM|d }| |fS |dred} ttdrat }| |fS |} ttdrpt }| |fS )zr
    Returns standardized OS name and version information.
    Similar to how user agent parsing works in JS.
     winWindows	win32_verr   darwinzMac OS Xmac_verlinuxLinuxversionfreebsdFreeBSDrelease)	sysplatform
startswithhasattrr-   r/   distroinfor5   )os_name
os_versionplatform_namewin_versionmac_version
linux_info rB   P/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/posthog/client.pyget_os_info<   s@   






rD   returnc                  C   s*   t  \} }t dtjd d  | |dS )Nz%s.%s.%s   )z$python_runtimez$python_versionz$osz$os_version)rD   r7   python_implementationr6   version_info)r<   r=   rB   rB   rC   system_contextg   s   
rI   c                   @   s   e Zd ZdZedZ													
																diddZedd Z	e	j
dd Z							djddZ				dkdeeeeef f fddZ				dkdeeef fddZ				dkdefddZ				dkdefddZ									dlddZ						djdd Z						djd!d"Z								dmd#d$Z						djd%d&Z							dnd'd(Z							dnd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3d4 Z!d5d6 Z"i i i dd7de#fd8d9Z$i i i dddd:d;d<Z%di i i dddd=d>e&e# de&e' fd?d@Z(i i i dddd:de&e' fdAdBZ)i i i dddd:de&e# fdCdDZ*dEedFedGeeef dHeeef dIeeef de&e# fdJdKZ+di i i ddddLdMe&e# fdNdOZ,dEedFedGeeef dHeeef dIeeef dPe&e de-e&e. e&e f fdQdRZ/dFedEedSe&e# dTe&e dUedGeeef dPe&e dVe&e dWe&e. fdXdYZ0dEefdZd[Z1dEedMe#de&e fd\d]Z2i i i ddd^de&eeeeef f  fd_d`Z3i i i ddd^defdadbZ4i i i dd7de-eef fdcddZ5dedf Z6dgdh Z7dS )oClientzCreate a new PostHog client.posthogNF'  Td         ?rF            c                 C   s  t || _ |p	|| _td| jt || _|| _|| _|| _|p!t	| _
t|| _|	| _|| _d | _d | _d | _d | _|| _|| _d | _ttt| _|| _|| _|| _|| _|| _|| _|| _ d | _!|| _"|d u rzzt#$ }W n t%yy   d }Y nw || _&|| _'|rt()  | j*+t(j, n| j*+t(j- |d urt.|r|| _/n| j*0d d | _/nd | _/| jrt1| | j d| _!|rd | _2d S |rt34| j5 t6|D ]"}g | _2t7| j | j| j||||	|
||d
}| j28| |r|9  qd S )Napi_keyz/before_send is not callable, it will be ignored)integrations)hoston_errorflush_atflush_intervalgzipretriestimeouthistorical_migration):queueQueuerR   requirer
   rU   debugsend	sync_moder   raw_hostr   rT   rX   rZ   _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log_captured_exceptions"exception_autocapture_integrationsexception_captureprivacy_modeosgetcwd	Exceptionproject_rootpersonal_api_keyloggingbasicConfiglogsetLevelDEBUGWARNINGcallablebefore_sendwarningr   	consumersatexitregisterjoinranger   appendstart)selfrR   rT   r_   max_queue_sizer`   rU   rV   rW   rX   max_retriesra   rZ   threadrg   ry   project_api_keyrm   rn   r[   rh   ro   rp   rq   rr   rx   rt   r   nconsumerrB   rB   rC   __init__w   s   



zClient.__init__c                 C      | j S )z9
        Get the local evaluation feature flags.
        )rc   r   rB   rB   rC   feature_flags   s   zClient.feature_flagsc                 C   s2   |pg | _ dd | j D | _| jdusJ ddS )z9
        Set the local evaluation feature flags.
        c                 S   s$   i | ]}| d dur|d  |qS )keyNr   ).0flagrB   rB   rC   
<dictcomp>  s
    z(Client.feature_flags.<locals>.<dictcomp>NDfeature_flags_by_key should be initialized when feature_flags is set)rc   rd   )r   r   rB   rB   rC   r      s   
c                 C   T   |d urt jdtdd |pi }td|t td|t |||d|d}| ||S )NNThe 'context' parameter is deprecated and will be removed in a future version.   
stackleveldistinct_id
propertiesz	$identify	timestampr   $seteventuuidwarningswarnDeprecationWarningr^   ID_TYPESdict_enqueuer   r   r   contextr   r   rn   msgrB   rB   rC   identify      	zClient.identifyrE   c                 C      |  |||||}t|pi S )zP
        Get feature flag variants for a distinct_id by calling decide.
        )get_flags_decisionr$   r   r   groupsperson_propertiesgroup_propertiesrn   	resp_datarB   rB   rC   get_feature_variants,     
zClient.get_feature_variantsc                 C   r   )zP
        Get feature flag payloads for a distinct_id by calling decide.
        )r   r#   r   rB   rB   rC   get_feature_payloads<  r   zClient.get_feature_payloadsc                 C   s   |  |||||}t|S )zU
        Get feature flags and payloads for a distinct_id by calling decide.
        )r   r"   )r   r   r   r   r   rn   resprB   rB   rC   get_feature_flags_and_payloadsL  s   
z%Client.get_feature_flags_and_payloadsc                 C   sd   t d|t |du r| j}|rt d|t ni }|||||d}t| j| jfd| ji|}t|S )zd
        Get feature flags decision, using either flags() or decide() API based on rollout.
        r   Nr   )r   r   r   r   geoip_disablerZ   )	r^   r   rn   r   r   rR   rT   rh   r!   )r   r   r   r   r   rn   request_datar   rB   rB   rC   r   \  s*   zClient.get_flags_decisionc
              
   C   st  |d urt jdtdd i |pi t }td|t td|t td|t t }
|
r1|	|
 |||||d}|rGtd|t ||d d	< i }i }|rsz
| j
|||	d
}W n- tyr } z| jd|  W Y d }~nd }~ww | jr|dkr| j||pi |	dd}|pi  D ]\}}||d| < qdd |pi  D }|r||d< |ri ||d |d< | ||	S )Nr   r   r   r   r   r   )r   r   r   r   r   r   z$groups)rn   z0[FEATURE FLAGS] Unable to get feature variants: $feature_flag_calledT)r   rn   only_evaluate_locally	$feature/c                 S   s   g | ]
\}}|d ur|qS )FrB   )r   r   valuerB   rB   rC   
<listcomp>  s
    z"Client.capture.<locals>.<listcomp>z$active_feature_flags)r   r   r   rI   r^   r   r   r
   r   updater   rw   r|   	exceptionr   get_all_flagsitemsr   )r   r   r   r   r   r   r   r   send_feature_flagsrn   context_tagsr   extra_propertiesfeature_variantsefeaturevariantactive_feature_flagsrB   rB   rC   capture  sh   


zClient.capturec                 C   r   )Nr   r   r   r   r   r   r   r   r   rB   rB   rC   rk     r   z
Client.setc                 C   r   )Nr   r   r   r   r   	$set_once)r   r   r   r   r   r   r   rB   rB   rC   set_once  r   zClient.set_oncec	           
      C   s   |d urt jdtdd |pi }td|t td|t td|t |r+td|t nd||}d	|||d
|||d}	| |	|S )Nr   r   r   
group_type	group_keyr   r   z${}_{}z$groupidentify)z$group_type
$group_keyz
$group_set)r   r   r   r   r   )r   r   r   r^   r   r   formatr   )
r   r   r   r   r   r   r   rn   r   r   rB   rB   rC   group_identify  s.   zClient.group_identifyc                 C   sP   |d urt jdtdd td|t td|t ||d|d|d}| ||S )	Nr   r   r   previous_idr   )r   aliasz$create_alias)r   r   r   r   )r   r   r   r^   r   r   )r   r   r   r   r   r   rn   r   rB   rB   rC   r   6  s    	
zClient.aliasc           	      C   sh   |d urt jdtdd |pi }td|t td|t td|t ||d< d||||d	}| ||S )
Nr   r   r   r   r   urlz$current_urlz	$pageview)r   r   r   r   r   )r   r   r   r^   r   r   r
   r   )	r   r   r   r   r   r   r   rn   r   rB   rB   rC   pageU  s$   
zClient.pagec              
   K   s  |d urt jdtdd z|pi }|d ur#t|dr#| jd W d S |d u r.d|d< t }td|t td	|t	 |d urCt
|}	nt }	|	d u sO|	d
krX| 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|}| jr| jj||d | |d|||||}|d urt|trt|dd |W S  ty } z| jd|  W Y d }~d S d }~ww )Nr   r   r   __posthog_exception_capturedz$Exception already captured, skippingFz$process_person_profiler   r   )NNNz"No exception information availabler   values)rx   r   typer   z	/project/z/person/)z$exception_typez$exception_messagez$exception_listz$exception_personURL)extraz
$exceptionTzFailed to capture exception: )r   r   r   r9   r|   r_   r   r^   r   r   r   r6   exc_infor   r   r   rx   r   r(   rb   rR   rq   r   r   
isinstanceBaseExceptionsetattrrw   )r   r   r   r   r   r   r   r   kwargsr   all_exceptions_with_tracer   $all_exceptions_with_trace_and_in_appresr   rB   rB   rC   capture_exceptionw  sl   


 zClient.capture_exceptionc              
   C   s  | j rdS |d }|du rtjt d}td|t t|}| |d< d|v r5|d}|r5t||d< |	ds>i |d< d|d d< t
|d d	< |du rQ| j}|rYd
|d d< | jrgi |d | j|d< t|	dd|d< t|}| jrz| |}|du r| jd W dS |}W n ty } z| jd|  W Y d}~nd}~ww | 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)`)Frm   r   Ntzr   r   zposthog-pythonz$libz$lib_versionTz$geoip_disabler   z%Event dropped by before_send callback)TNzError in before_send callback: zqueueing: %szenqueued with blocking %s.r   )rX   rZ   batchr[   F)blockzenqueued %s.zanalytics-python queue is full)rm   r   nowr	   r^   r'   	isoformatpopstringify_idr   r)   rn   ro   r&   r   r|   r_   rw   r   r`   ra   r   rR   rT   rX   rZ   r[   r\   putFullr   )r   r   rn   r   r   modified_msgr   rB   rB   rC   r     sr   


	
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\   qsizer   r|   r_   )r   r\   sizerB   rB   rC   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)r   pauser   RuntimeErrorri   stop)r   r   rB   rB   rC   r   $  s   
zClient.joinc                 C   s(   |    |   | jr| j  dS dS )z2Flush all messages and cleanly shutdown the clientN)r   r   rs   closer   rB   rB   rC   shutdown3  s
   zClient.shutdownc              
   C   s>  z&t | jd| j d| jdd}|d pg | _|d pi | _|d p#i | _W nn tyt } zB|jdkrC| j	
d	 | jrBtdd
dn'|jdkra| j	d g | _i | _i | _| jr`t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
   rZ   r   re   rf   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messagei  z[FEATURE FLAGS] PostHog feature flags quota limited, resetting feature flag data.  Learn more about billing limits at https://posthog.com/docs/billing/limits-alertsz#PostHog feature flags quota limitedz-[FEATURE FLAGS] Error loading feature flags: z`[FEATURE FLAGS] Fetching feature flags failed with following error. We will retry in %s seconds.r   )r   ry   rR   rT   r   re   rf   r   r   r|   errorr_   r   rw   rg   r   r   r	   _last_feature_flag_poll)r   responser   rB   rB   rC   _load_feature_flags;  s\   

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)ry   r|   r   r   r  ri   is_aliver   r   rg   r   r   rB   rB   rC   load_feature_flagsm  s   
zClient.load_feature_flagsr   r   r   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   re   strr|   r   r_   r   rf   )r   feature_flagr   r   r   r   r  flag_filtersr  
group_namefocused_group_propertiesrB   rB   rC   _compute_flag_locally}  s<   




zClient._compute_flag_locallyr   r   r   r   send_feature_flag_eventsrn   c          
   
   C   s.   | j ||||||||d}	|	d u rd S t|	S )Nr  )get_feature_flagbool)
r   r   r   r   r   r   r   r  rn   r  rB   rB   rC   feature_enabled  s   zClient.feature_enabledoverride_match_valuer   r   r   r   r  rn   r  c                C   sL  t d|t t d|t t d|t | jrd S | ||||\}}d }
d }d }| |||||}|d u}|rL|p9|}|rB| ||nd }t	|||}
n>|sz | 
||||||	\}}t||}
| jd| d|
  W n ty } z| jd|  W Y d }~nd }~ww |r| |||
r|
 nd |
r|
jnd |||	||	 |
S )Nr   r   r   z&Successfully computed flag remotely: #z -> #z-[FEATURE FLAGS] Unable to get flag remotely: )r^   r
   r   r   rm   &_add_local_person_and_group_properties_locally_evaluate_flag_compute_payload_locallyr   from_value_and_payload%_get_feature_flag_details_from_decidefrom_flag_detailsr|   r_   rw   r   _capture_feature_flag_called	get_valuepayload)r   r   r   r  r   r   r   r   r  rn   flag_resultflag_details
request_id
flag_valueflag_was_locally_evaluatedlookup_match_valuer&  r   rB   rB   rC   _get_feature_flag_result  st   
zClient._get_feature_flag_resultc          	   
   C   s   | j ||||||||dS )aL  
        Get a FeatureFlagResult object which contains the flag result and payload for a key by evaluating locally or remotely
        depending on whether local evaluation is enabled and the flag can be locally evaluated.

        This also captures the $feature_flag_called event unless send_feature_flag_events is False.
        r  )r-  )	r   r   r   r   r   r   r   r  rn   rB   rB   rC   get_feature_flag_result  s   zClient.get_feature_flag_resultc          
   
   C   s*   | j ||||||||d}	|	r|	 S dS )a#  
        Get a feature flag value for a key by evaluating locally or remotely
        depending on whether local evaluation is enabled and the flag can be
        locally evaluated.

        This also captures the $feature_flag_called event unless send_feature_flag_events is False.
        r  N)r.  r%  )
r   r   r   r   r   r   r   r  rn   feature_flag_resultrB   rB   rC   r  6  s   
zClient.get_feature_flagr   r   r   r   r   c           	   
   C   s   | j d u r| jr|   d }| j rv| jd usJ d| j|}|rvz| j|||||d}| jd| d|  W |S  tyZ } z| jd| d|  W Y d }~|S d }~w t	yu } z| j
d|  W Y d }~|S d }~ww |S )Nr   r   r   r   z$Successfully computed flag locally: z -> zFailed to compute flag z
 locally: z7[FEATURE FLAGS] Error while computing variant locally: )r   ry   r
  rd   r   r  r|   r_   r   rw   r   )	r   r   r   r   r   r   r  r   r   rB   rB   rC   r  U  sB   	"zClient._locally_evaluate_flag)match_valuer   r   r   r   r  rn   r1  c                C   s*   | j |||||||||	d	}
|
r|
jS d S )Nr  )r-  r&  )r   r   r   r1  r   r   r   r   r  rn   r/  rB   rB   rC   get_feature_flag_payload{  s   zClient.get_feature_flag_payloadrn   c                 C   s@   |  |||||}|d}|d}	|	r|	|nd}
|
|fS )zK
        Calls /decide and returns the flag details and request id
        	requestIdr   N)r   r   )r   r   r   r   r   r   rn   r   r)  r   r(  rB   rB   rC   r"    s   


z,Client._get_feature_flag_details_from_decider  r&  r+  r)  r(  c
                 C   s   | d|d u r	dnt | }
|
| j| vrod|d|d|d| |i}|r)||d< |r/||d< t|	tr[|	jrA|	jjrA|	jj|d	< t|	jtr[|	jjrQ|	jj|d
< |	jj	r[|	jj	|d< | j
|d|||d | j| |
 d S d S )N_z::null::z$feature_flagz$feature_flag_responselocally_evaluatedr   z$feature_flag_payloadz$feature_flag_request_idz$feature_flag_reasonz$feature_flag_versionz$feature_flag_idr   )r   rn   )r  rl   r   r   reasondescriptionmetadatar   r2   idr   add)r   r   r   r  r&  r+  r   rn   r)  r(  feature_flag_reported_keyr   rB   rB   rC   r$    sD   


z#Client._capture_feature_flag_calledc              
   C   sv   | j rd S | jd u r| jd d S zt| j| j|| jdW S  ty: } z| jd|  W Y d }~d S d }~ww )Nz`[FEATURE FLAGS] You have to specify a personal_api_key to fetch decrypted feature flag payloads.r   z>[FEATURE FLAGS] Unable to get decrypted feature flag payload: )	rm   ry   r|   r   r   rT   rh   rw   r   )r   r   r   rB   rB   rC   get_remote_config_payload  s(   
z Client.get_remote_config_payloadc                 C   sh   d }| j d u r	|S | j |}|r2|dpi }|dpi }t|tr(|r(dnt|}||d }|S )Nr  payloadstrue)rd   r   r   r  r  )r   r   r1  r&  flag_definitionr  flag_payloadslookup_valuerB   rB   rC   r     s   
zClient._compute_payload_locallyr   r   r   r   rn   c                C   s   | j ||||||d}|d S )NrB  featureFlags)get_all_flags_and_payloads)r   r   r   r   r   r   rn   r  rB   rB   rC   r     s   
	zClient.get_all_flagsc             
   C   s   | j rd d dS | ||||\}}| j||||d\}}|rM|sMz| j|||||d}	t|	W S  tyL }
 z| jd|
  W Y d }
~
|S d }
~
ww |S )NrC  featureFlagPayloadsr0  )r   r   r   rn   z:[FEATURE FLAGS] Unable to get feature flags and payloads: )rm   r  #_get_all_flags_and_payloads_locallyr   r"   rw   r|   r   )r   r   r   r   r   r   rn   r  fallback_to_decidedecide_responser   rB   rB   rC   rD  !  s<   



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}||d|fS )	Nr   r   Fr  r   Tz;[FEATURE FLAGS] Error while computing variant and payload: rE  )r^   r   r   r   ry   r
  r  r   r   rw   r|   r   )r   r   r   r   r   r  r   r=  rH  r   matched_payloadr   rB   rB   rC   rG  L  sP   	
z*Client._get_all_flags_and_payloads_locallyc                 C   r   N)r   r   rB   rB   rC   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 )Nr   r   r   )r   r   r   r   r   all_person_propertiesall_group_propertiesr  rB   rB   rC   r    s   
z-Client._add_local_person_and_group_properties)NNFrL   TNrM   rN   FrF   FrO   rP   rQ   NNFTFrF   NFFNNFN)NNNNNN)NNNN)	NNNNNNNFN)NNNNNNNN)NNNNNNN)8__name__
__module____qualname____doc__rz   	getLoggerr|   r   propertyr   setterr   r   r  r   r  r   r   r   r   r   r   r   rk   r   r   r   r   r   r   r   r   r   r  r
  r    r  r  r   r   r-  r.  r  r  r2  tupler   r"  r$  r<  r   r   rD  rG  rL  r  rB   rB   rB   rC   rJ   r   s   

 


!




(
Q
 
 
+
!
$
WN2	
7 
T
"




+





	

7
	
	
/

3rJ   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)r   r   AssertionError)namefield	data_typer   rB   rB   rC   r^     s   
r^   c                 C   s"   | d u rd S t | tr| S t| S rK  )r   r
   r  )valrB   rB   rC   r     s
   
r   )Lr   rz   numbersru   r7   r6   r   r   r   typingr   r   r   r   r   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   r   posthog.scopesr   posthog.typesr   r   r   r   r   r    r!   r"   r#   r$   posthog.utilsr%   r&   r'   r(   posthog.versionr)   r\   ImportErrorr]   Numberr   rj   rD   r   r  rI   objectrJ   r^   r   rB   rB   rB   rC   <module>   sZ    $	0+          -