
    h=%                         d dl mZmZmZmZmZ ddlmZmZm	Z	 ddl
mZmZmZ d dlZdZdZdZd	Zd
Zg dZ G d de      Zy)    )DictAnyListOptionalTuple   )SocialProvider
OAuthToken	DateRange)http_get	http_post	clamp_intNz&https://twitter.com/i/oauth2/authorizez&https://api.twitter.com/2/oauth2/tokenzhttps://api.twitter.com/2zhttps://ap.bestbrain.ai/x/tokenz!https://ap.bestbrain.ai/x/refresh)z
tweet.readz
users.readzoffline.accessz	like.readc                      e Zd Zdedee   defdZdedefdZdedefdZdede	eef   fd	Z
d
edefdZd
edefdZdede	eef   dede	eef   fdZ	 ddede	eef   dedee	eef      deee	eef      ee	eef      f   f
dZy)TwitterXProviderstatescopesreturnc           
          dj                  |xs t              }t         d| j                   d| j                   d| d| d
S )Nz%20z?response_type=code&client_id=z&redirect_uri=z&scope=z&state=z7&code_challenge=plain_dummy&code_challenge_method=plain)joinTW_SCOPES_DEFAULTTW_OAUTH	client_idredirect_uri)selfr   r   scopes       N/var/www/html/hubwallet-dev/src/marketing/core/Analytics/providers/twitterx.pyauth_urlzTwitterXProvider.auth_url   sP    

66%67*:4>>:J !2!2 375'IK 	L    codec           
          t        t        ddid|| j                  | j                  dd      }t	        |d   |j                  d      	      S )
NContent-Type!application/x-www-form-urlencodedauthorization_codeplain_dummy)
grant_typer   r   r   code_verifierheadersdataaccess_tokenrefresh_tokenr*   r+   )r   TW_TOKENr   r   r
   get)r   r   r)   s      r   exchange_codezTwitterXProvider.exchange_code   sY    "02U!V+?%)-1->->*....; tN';(,(AC 	Cr   tokenc                     |j                   s|S t        t        ddid|j                   | j                  d      }t	        |d   |j                  d            S )Nr!   r"   r+   )r%   r+   r   r'   r*   r,   )r+   r   r-   r   r
   r.   )r   r0   r)   s      r   refreshzTwitterXProvider.refresh*   sa    ""L"02U!V+:.3.A.A*... tN';(,(AC 	Cr   c                 $    dd|j                    iS )NAuthorizationzBearer )r*   )r   r0   s     r   _headerszTwitterXProvider._headers7   s    75+=+=*>!?@@r   idc           	         	 t        t        d| z   ddid       }t        d| d|        |j                  di       j                  dd       rLt	        |d   d   t
        j
                  j                         t        j                  |d   d	   
      z         S t        d|        y # t        $ r$}t        d| dt        |              Y d }~y d }~ww xY w)N/r!   application/jsonr(   paramszToken exchange response for ID : 	tokenDatar*   
expires_insecondsr*   
expires_atz#No access token found in response: zError exchanging token for ID )
r   TW_TEMP_TOKENprintr.   r
   datetimenow	timedelta	Exceptionstr)r   r6   r)   es       r   exchange_token_tempz$TwitterXProvider.exchange_token_temp;   s   
	MatH4~Oa>bkopD3B4r$@AxxB'++NDA!tK/@/P]e]n]n]r]r]tw  xJ  xJ  SW  Xc  Sd  eq  Sr  xs  ^s  t  t;D6BC 	22$bQAB	   BB* B* *	C3CCc           	         	 d| i}t        t        ddii |      }t        d| d|        |j                  di       j                  dd       rLt	        |d   d   t
        j
                  j                         t        j                  |d   d	   
      z         S t        d|        y # t        $ r$}t        d| dt        |              Y d }~y d }~ww xY w)Napp_idr!   r9   )r(   r)   	json_bodyzToken refresh response for ID r<   r=   r*   r>   r?   rA   z+No access token found in refresh response: zError refreshing token for ID )
r   TW_TEMP_REFRESHrD   r.   r
   rE   rF   rG   rH   rI   )r   r6   payloadr)   rJ   s        r   refresh_token_tempz#TwitterXProvider.refresh_token_tempH   s   	B4*G_~GY6Z`bnuvD22$b?@xxB'++NDA!tK/@/P]e]n]n]r]r]tw  xJ  xJ  SW  Xc  Sd  eq  Sr  xs  ^s  t  tCD6JK 	22$bQAB	rL   account_ref
date_rangec                     |d   }	 t        t         d| j                  |      ddi      }	 |j                  di       j                  di       }t        d|       t        |j                  dd            }
|
dddS # t        $ r}t        |d      r|j                  dk(  rt        d	       | j                  |j                  d
            }|rk	 t        t         d| j                  |      ddi      }|j                  di       j                  di       }n0# t        $ r}	t        d|	        |	d}	~	ww xY wt        d       ||Y d}~d}~ww xY w# t        $ r}t        dt        |       d       |d}~ww xY w)z1
        account_ref: {'user_id': '...'}
        user_idz	/users/mezuser.fieldspublic_metricsr:   r)   status  6Unauthorized. Attempting to refresh token and retry...rN   Retry after refresh failed: NToken refresh failed.zPublic Metrics:followers_countr   )	followersnew_followersimpressionszError with /users/me endpoint: z. Trying with specific user ID)r   TW_APIr5   r.   rH   hasattrrX   rD   rR   r   rI   )r   r0   rS   rT   uidupmrJ   refreshed_tokene2r^   s              r   fetch_account_metricsz&TwitterXProvider.fetch_account_metricsV   s   
 )$&	F89- $e 4 -/?@BA
UU62&**+;R@. #R(!"&&):A">?I!*QqQQ3  1h'AHHORS&*&=&=kooh>W&XO&% (F89)=151O1>@P0Q!SA "#vr!2!6!67G!LB( %!$@"EF"$H% 56G 4  	3CF8;YZ[G	sf   &E "A= ,E =	EAEADE	D6!D11D66EE EE 	E=E88E=N
paginationc                    |d   }ddd|xs i }	 t        t         d| d| j                  |      |      }g }|j                  dg       D ]  }|d   }|j                  dd      xs dd d }|j                  di       }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }|j                  |d| d|dd||||z   ddddddddd        |j                  di       j                  d      }||rd|ifS d fS # t        $ r}t	        |d      r|j
                  d	k(  rt        d
       | j                  |j                  d            }	|	rJ	 t        t         d| d| j                  |	      |      }n0# t        $ r}
t        d|
        |
d }
~
ww xY wt        d       ||Y d }~d }~ww xY w) NrV   d   zcreated_at,public_metrics)max_resultsztweet.fieldsz/users/z/tweetsr:   rX   rY   rZ   rN   r[   r\   r)   r6   
created_at 
   rW   
like_countr   reply_countretweet_countquote_countz!https://twitter.com/i/web/status/tweet)r`   reachlikescommentssharessaveslink_clicksvideo_viewsvideo_completions	unfollowshidesreports)external_post_id	permalink	post_typedatemetricsmeta
next_tokenpagination_token)r   ra   r5   rH   rb   rX   rD   rR   r.   r   append)r   r0   rS   rT   ri   rc   r;   tweetsrJ   rf   rg   itemsttiddtre   rv   repliesretweetsquotesr   s                        r   fetch_post_metricsz#TwitterXProvider.fetch_post_metrics   sE    )$7
 R
	uG<&*mmE&:6KF0 ')FB' 	AD'C%%b)/R"5B',Bbff\156E}a 89G !;<HrvvmQ78FLL$'@F$#$" '&/#$#$)*!"  	< ZZ+//=
:*J7PP4PPm  	q(#CNO"&"9"9+//(:S"T"!!)VHGC5*H26--2PY_"a$ ! <RDAB ! 12G 	s<   'E 	G9AG4'F>=G4>	GGGG44G9)N)__name__
__module____qualname__rI   r   r   r
   r/   r2   r   r5   rK   rR   r   r   rh   r   r   r    r   r   r   r      s@   Lc L49 L LC# C* CCZ CJ CAj AT#s(^ Ac j S Z ,: ,DcN ,*3,8<S#X,f Z^CQ
 CQc3h CQ'0CQ>FtCQTH~>VCQ %d4S>&:HT#s(^<T&T UCQr   r   )typingr   r   r   r   r   baser	   r
   r   utilsr   r   r   rE   r   r-   ra   rC   rP   r   r   r   r   r   <module>r      sK    3 3 7 7 1 1 33&15 vQ~ vQr   