o
    ><e!D                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlZd dlmZ d dlm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mZmZmZ d d
lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( G dd dZ)dS )    N)ListUnion)Decimal)guard)ConfirmationExecutor)SevenDaysHoldExceptionApiException)LoginExecutorInvalidCredentials)SteamMarket)AssetTradeOfferStateSteamUrlGameOptions)text_betweentexts_between,merge_items_with_descriptions_from_inventorysteam_id_to_account_id)merge_items_with_descriptions_from_offersget_description_key(merge_items_with_descriptions_from_offeraccount_id_to_steam_idget_key_value_from_url
ping_proxylogin_requiredc                   @   s:  e Zd Z					dldededededededdfd	d
ZdedefddZdeddfddZede	fddZ
dmdedededdfddZednddZdd Zdd ZedefddZ	dodedededed edejfd!d"Zed#ejdefd$d%Zedpd(ed)ed*e	defd+d,Ze	'dpd-ed(ed)ed*e	def
d.d/Zdefd0d1Zdefd2d3Zdqd)edefd4d5Zed6d7 Zdqd8ed)edefd9d:Z	;			&	&	&	&drd<e	d=ed>ed?ed@edefdAdBZedCefdDdEZed8edefdFdGZ d8edefdHdIZ!d8edefdJdKZ"d8edefdLdMZ#d8edefdNdOZ$e	PdsdQe%e& dRe%e& d-edSedef
dTdUZ'dVedefdWdXZ(dtdVedZedefd[d\Z)edQe%e& dRe%e& defd]d^Z*ed_ede	fd`daZ+e	P	&dudQe%e& dRe%e& d_edSedbedefdcddZ,ed8edefdedfZ-edvdhediede.ee/f fdjdkZ0dS )wSteamClientNapi_keyusernamepasswordsteam_guardlogin_cookiesproxiesreturnc                 C   sx   || _ t | _|r| | || _| jd urt| j| _nd | _d| _	|| _
|| _t| j| _|r:| | d S d S )NF)_api_keyrequestsSession_sessionset_proxiessteam_guard_stringr   load_steam_guardr   was_login_executedr   	_passwordr   marketset_login_cookies)selfr   r   r   r   r    r!    r/   9/usr/local/lib/python3.10/dist-packages/steampy/client.py__init__    s   	


zSteamClient.__init__c                 C   s,   t |ts	tdt|r| jj| |S )NzyProxy must be a dict. Example: \{"http": "http://login:password@host:port"\, "https": "http://login:password@host:port"\})
isinstancedict	TypeErrorr   r&   r!   update)r.   r!   r/   r/   r0   r'   =   s   
zSteamClient.set_proxiescookiesc                 C   sH   | j j| d| _| jd u rdt|  i| _| j| j| 	  d S )NTsteamid)
r&   r6   r5   r*   r   strget_steam_idr,   _set_login_executed_get_session_id)r.   r6   r/   r/   r0   r-   I   s
   
zSteamClient.set_login_cookiesc                 C   s@   t j}| j|}td|j }rt|dS t	d| )Nzg_steamID = "(\d+)";   zInvalid steam_id: )
r   COMMUNITY_URLr&   getresearchtextintgroup
ValueError)r.   urlresponsesteam_idr/   r/   r0   r9   R   s
   zSteamClient.get_steam_idc                 C   s   d | j | j| jfv }d |||fv }|r|rtd|r+|| _t| j| _|| _ || _| jr4|  r4d S | j	j
dd t| j | j| jd | j	  d| _| j| j|   d S )NzXYou have to pass username, password and steam_guard parameters when using "login" methodsteamRememberLogintrueshared_secretT)r   r+   r(   r
   r   r)   r   r*   is_session_aliver&   r6   setr	   loginr,   r:   r;   )r.   r   r   r   %invalid_client_credentials_is_present$invalid_login_credentials_is_presentr/   r/   r0   rM   [   s"   zSteamClient.loginc                 C   sB   t j d}d|  i}| jj||d |  rtdd| _d S )Nz/login/logout/	sessioniddatazLogout unsuccessfulF)r   	STORE_URLr;   r&   postrK   	Exceptionr*   )r.   rE   rR   r/   r/   r0   logouts   s   
zSteamClient.logoutc                 C   s   |  | j| j| j | S N)rM   r   r+   r(   r.   r/   r/   r0   	__enter__~   s   zSteamClient.__enter__c                 C   s   |    d S rW   )rV   )r.   exc_typeexc_valexc_tbr/   r/   r0   __exit__   s   zSteamClient.__exit__c                 C   s&   | j }| jtj}| |j v S rW   )r   r&   r>   r   r=   lowerrA   )r.   steam_loginmain_page_responser/   r/   r0   rK      s   zSteamClient.is_session_alivemethod	interface
api_methodversionparamsc                 C   sR   d tj|||f}|dkr| jj||dn| jj||d}| |r'td|S )N/GETre   rQ   zInvalid API key)joinr   API_URLr&   r>   rT   is_invalid_api_keyr
   )r.   ra   rb   rc   rd   re   rE   rF   r/   r/   r0   api_call   s
   (
zSteamClient.api_callrF   c                 C   s   d}|| j v S )NzVAccess is denied. Retrying will not help. Please verify your <pre>key=</pre> parameter)rA   )rF   msgr/   r/   r0   rk      s   
zSteamClient.is_invalid_api_keyT  gamemergecountc                 C   s   | j d }| ||||S )Nr7   )r   get_partner_inventory)r.   ro   rp   rq   rG   r/   r/   r0   get_my_inventory   s   
zSteamClient.get_my_inventorypartner_steam_idc                 C   sh   d tjd||j|jf}d|d}| jj||d }|d u s'|ddkr+td|r2t	||S |S )	Nrf   	inventoryenglish)lrq   rh   successr<   zSuccess value should be 1.)
ri   r   r=   app_id
context_idr&   r>   jsonr   r   )r.   rt   ro   rp   rq   rE   re   response_dictr/   r/   r0   rr      s   
z!SteamClient.get_partner_inventoryc                 C   s   | j j d S )NrP   )r&   r6   get_dictrX   r/   r/   r0   r;      s   zSteamClient._get_session_idc                 C   s    d| j i}| dddd| S )Nkeyrg   IEconServiceGetTradeOffersSummaryv1r#   rl   r{   )r.   re   r/   r/   r0   get_trade_offers_summary   s   
z$SteamClient.get_trade_offers_summaryc              	   C   sH   | j dddddddd}| dddd	| }| |}|r"t|S |S )
Nr<   rv   r    )r~   get_sent_offersget_received_offersget_descriptionslanguageactive_onlyhistorical_onlytime_historical_cutoffrg   r   GetTradeOffersr   )r#   rl   r{   _filter_non_active_offersr   )r.   rp   re   rF   r/   r/   r0   get_trade_offers   s   

zSteamClient.get_trade_offersc                 C   sX   | d  dg }| d  dg }ttdd || d d< ttdd || d d< | S )NrF   trade_offers_receivedtrade_offers_sentc                 S      | d t jkS Ntrade_offer_stater   Activeofferr/   r/   r0   <lambda>       z7SteamClient._filter_non_active_offers.<locals>.<lambda>c                 S   r   r   r   r   r/   r/   r0   r      r   )r>   listfilter)offers_responseoffers_receivedoffers_sentr/   r/   r0   r      s   z%SteamClient._filter_non_active_offerstrade_offer_idc                 C   sl   | j |dd}| dddd| }|r4d|d v r4d	d
 |d d D }|d d }t|||d d< |S )Nrv   )r~   tradeofferidr   rg   r   GetTradeOfferr   descriptionsrF   c                 S   s   i | ]}t ||qS r/   )r   ).0r   r/   r/   r0   
<dictcomp>       z/SteamClient.get_trade_offer.<locals>.<dictcomp>r   )r#   rl   r{   r   )r.   r   rp   re   rF   r   r   r/   r/   r0   get_trade_offer   s   zSteamClient.get_trade_offerd   
max_tradesr   navigating_backinclude_failedinclude_totalc           
   	   C   s2   | j |||||||d}| dddd| }	|	S )N)r~   r   start_after_timestart_after_tradeidr   r   r   r   rg   r   GetTradeHistoryr   r   )
r.   r   r   r   r   r   r   r   re   rF   r/   r/   r0   get_trade_history   s   
zSteamClient.get_trade_historytrade_idc                 C   s4   | j d| dj }dd t|ddD }|S )Nz!https://steamcommunity.com/trade/z/receiptc                 S   s   g | ]}t |qS r/   )r{   loads)r   itemr/   r/   r0   
<listcomp>   r   z1SteamClient.get_trade_receipt.<locals>.<listcomp>zoItem = z	;
	oItem)r&   r>   contentdecoder   )r.   r   htmlitemsr/   r/   r0   get_trade_receipt   s   zSteamClient.get_trade_receiptc           
      C   s   |  |}t|d d d }|tjur!td|j d|j d| |}|  }tj	 d| d}||d	|d
d}d| 
|i}| jj|||d }	|	ddrX| |S |	S )NrF   r   r   zInvalid trade offer state: z ()/tradeoffer/z/accept1r   )rP   r   serveridpartnercaptchaRefererrR   headersneeds_mobile_confirmationF)r   r   r   r   namevalue_fetch_trade_partner_idr;   r   r=   _get_trade_offer_urlr&   rT   r{   r>   _confirm_transaction)
r.   r   trader   r   
session_id
accept_urlre   r   rF   r/   r/   r0   accept_trade_offer   s$   



zSteamClient.accept_trade_offerc                 C   s4   |  |}| j|j}d|v rtdt|ddS )NzCYou have logged in from a new device. In order to protect the itemsz=Account has logged in a new device and can't trade for 7 dayszvar g_ulTradePartnerSteamID = 'z';)r   r&   r>   rA   r   r   )r.   r   rE   offer_response_textr/   r/   r0   r     s
   
z#SteamClient._fetch_trade_partner_idc                 C   s$   t | jd | jd | j}||S )Nidentity_secretr7   )r   r   r&   send_trade_allow_request)r.   r   confirmation_executorr/   r/   r0   r     s   
z SteamClient._confirm_transactionc                 C   ,   d| d}| j j|d|  id }|S )N&https://steamcommunity.com/tradeoffer/z/declinerP   rQ   r&   rT   r;   r{   r.   r   rE   rF   r/   r/   r0   decline_trade_offer"     zSteamClient.decline_trade_offerc                 C   r   )Nr   z/cancelrP   rQ   r   r   r/   r/   r0   cancel_trade_offer'  r   zSteamClient.cancel_trade_offerr   items_from_meitems_from_themmessagec                 C   s   |  ||}|  }tj d}d}||||t|ddd}	t|}
tj d|
 tjd}| jj||	|d }|	d	rI|
| |d
  |S )N/tradeoffer/new/sendr<   r   z{}rP   r   r   tradeoffermessagejson_tradeofferr   trade_offer_create_paramsz/tradeoffer/new/?partner=r   Originr   r   r   )_create_offer_dictr;   r   r=   r{   dumpsr   r&   rT   r>   r5   r   )r.   r   r   rt   r   r   r   rE   	server_idre   partner_account_idr   rF   r/   r/   r0   
make_offer,  s(   	
zSteamClient.make_offerrG   c                 C   s6   || j d}| dddd|}| }|d d d S )	N)steamidsr~   rg   
ISteamUserGetPlayerSummariesv0002rF   playersr   r   )r.   rG   re   rF   rR   r/   r/   r0   get_profileI  s   zSteamClient.get_profileallrelationship_filterc                 C   s4   | j ||d}| dddd|}| }|d d S )N)r~   r7   relationshiprg   r   GetFriendListr   friendslistfriendsr   )r.   rG   r   re   resprR   r/   r/   r0   get_friend_listO  s   zSteamClient.get_friend_listc                 C   s2   dddd | D g dddd |D g dddS )	NT   c                 S      g | ]}|  qS r/   to_dictr   assetr/   r/   r0   r   Z      z2SteamClient._create_offer_dict.<locals>.<listcomp>F)assetscurrencyreadyc                 S   r   r/   r   r   r/   r/   r0   r   [  r   )
newversionrd   methemr/   )r   r   r/   r/   r0   r   U  s
   zSteamClient._create_offer_dicttrade_offer_urlc                 C   sZ   t j t|j t jd}| jj||dj}tt|dd}tt|dd}t	||S )Nr   )r   zvar g_daysMyEscrow = ;zvar g_daysTheirEscrow = )
r   r=   urlparsepathr&   r>   rA   rB   r   max)r.   r  r   rF   my_escrow_durationtheir_escrow_durationr/   r/   r0   get_escrow_duration^  s   
zSteamClient.get_escrow_durationcase_sensitivec              	   C   s   t |d|}t |d|}t|}| ||}	|  }
tj d}d}d|i}|
|||t|	dt|d}tj t|j	 tjd}| j
j|||d	 }|d
r_|| |d  |S )Ntokenr   r   r<   trade_offer_access_tokenr   r   r   r   r   r   )r   r   r   r;   r   r=   r{   r   r  r  r&   rT   r>   r5   r   )r.   r   r   r  r   r	  r
  r   rt   r   r   rE   r   r   re   r   rF   r/   r/   r0   make_offer_with_urlk  s.   	
zSteamClient.make_offer_with_urlc                 C   s   t j d|  S )Nr   )r   r=   )r   r/   r/   r0   r     s   z SteamClient._get_trade_offer_urlFconvert_to_decimalon_holdc                 C   sl   | j tj d}td|j}|r|d}t	|}nt
d|r&dnd}|r2t|| d S || S )Nz/marketzvar g_rgWalletInfo = (.*?);r<   z)Unable to get wallet balance string matchwallet_delayed_balancewallet_balancer   )r&   r>   r   r=   r?   r@   rA   rC   r{   r   rU   r   )r.   r  r  rF   wallet_info_matchbalance_dict_strbalance_dictbalance_dict_keyr/   r/   r0   get_wallet_balance  s   
zSteamClient.get_wallet_balance)NNNNN)NNN)r"   NrW   )Trn   )T)r   NNTTTT)r   )r   )r   T)TF)1__name__
__module____qualname__r8   r3   r1   r'   r-   r   rB   r9   rM   rV   rY   r]   boolrK   r$   Responserl   staticmethodrk   r   rs   rr   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r  r/   r/   r/   r0   r      s   
	


	
	 %&r   )*r?   bs4r{   urllib.parseparser  typingr   r   decimalr   r$   steampyr   steampy.confirmationr   steampy.exceptionsr   r   steampy.loginr	   r
   steampy.marketr   steampy.modelsr   r   r   r   steampy.utilsr   r   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s    4