o
    EfLJ                     @   sV  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	Z	G dd dZ
G dd	 d	Zd
d Zdd Zdd Zdd Zdd Zd6ddZdd Z	 dd Zd7ddZdd Z	 d ZG d!d" d"ZG d#d$ d$ZG d%d& d&ZG d'd( d(Z	 d)ZG d*d+ d+ZG d,d- d-ZG d.d/ d/ZG d0d1 d1ZG d2d3 d3Z G d4d5 d5Z!dS )8z
This file contains all api requests and functions to initialize the program
Coded by Tyler Bowers
Github: https://github.com/tylerebowers/Schwab-API-Python
    N)terminal)datetime)load_dotenvc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )tokensN   i  )
__name__
__module____qualname__refreshTokenaccessTokenidTokenrefreshTokenIssuedaccessTokenIssuedrefreshTokenTimeoutaccessTokenTimeout r   r   3/home/seba/projects/VPS_Streaming_CS/modules/api.pyr      s    r   c                   @   s    e Zd ZdZdZdZdZdZdS )credentialsN)r   r   r	   appKey	appSecretcallbackUrlaccountHashaccountNumberr   r   r   r   r      s    r   c                  C   s^  t   tdt_tdt_tdt_ttjdks#ttjdkr,tj	
d t  td tj	tjdd	tjt tj j  d
  tj	tjdd	tjt tj j  d  t  tj	jddd t } | jrtd |  d dd t_|  d dd t_ ntd tj	
d tj	
d tj	
|   tj	d d S )Nr   r   r          zXNo app key or app secret found, please add your app key and app secret in the .env file.initz,Access token last updated: %Y-%m-%d %H:%M:%Sz (expires in z	 seconds)z-Refresh token last updated: %Y-%m-%d %H:%M:%Sz days)z+Filling account number and account hash ->  )endDoner   r   	hashValueErrorz/Could not get account numbers and account hash.gPlease make sure that your app status is "Ready For Use" and that the app key and app secret are valid.zInitialization Complete)!r   osgetenvr   r   r   r   lenr   
colorPrinterrorquit_TokenManagerinfor   r   strftimer   r   nowsecondsr   r   days_updateTokensManualaccountsaccountNumbersokprintjsongetr   r   )respr   r   r   
initialize!   s@   r6   c                   C   sx   t  tj jtjd krtjd t	  d S t  tj
 jdks/t  tj
 jtjd kr:tjd t  d S d S )N   z-The refresh token has expired, please update!<   z5The access token has expired, updating automatically.)r   r+   r   r   r-   r   r   r%   user_RefreshTokenUpdater   r,   r   r)   _AccessTokenUpdater   r   r   r   r.   H   s   

r.   c                  C   s   dd } t j| dd  d S )Nc                  S   s   dd l } 	 t  | d q)Nr   Tr8   )timer.   sleep)r<   r   r   r   checkerV   s
   
z&updateTokensAutomatic.<locals>.checkerT)targetdaemon)	threadingThreadstart)r>   r   r   r   updateTokensAutomaticU   s   rD   c                  C   sf   t d\} }}td|d}|jr+| }t dt || tj	dt
j  d S tjd d S )NgetFilerefresh_tokensetzAccess token updated: zCould not get new access token.)r(   _PostAccessTokenAutomatedr4   r1   r3   r   r+   r   r%   r)   r   r   r&   )accessTokenFileTimerefreshTokenFileTimetokenDictionaryresponsenewTokenDictionaryr   r   r   r;   _   s   r;   c                  C   s   dd l } tjd dtj dtj }tjd|  tjd | | tj	d}||
dd	 |
d
  d}td|}|jr^| }tdt t | tjd d S tjd tjd d S )Nr   z<Please authorize this program to access your schwab account.z7https://api.schwabapi.com/v1/oauth/authorize?client_id=z&redirect_uri=zClick to authenticate: zOpening browser...zMAfter authorizing, wait for it to load (<1min) and paste the WHOLE url here: zcode=   z%40@authorization_coderG   z!Refresh and Access tokens updatedz,Could not get new refresh and access tokens.r!   )
webbrowserr   r%   r9   r   r   r   r)   openinputindexrH   r1   r3   r(   r   r+   r&   )rQ   authUrlresponseURLcoderL   rM   r   r   r   r:   n   s"   
"
r:   r   c              
      s   d dd } fdd} fdd}zF| dkr| W S | d	krC|d ur:|d ur:|d ur:|||| |||| W d S t jd
 W d S | dkrV| \}}}|||| W d S W d S  ty{ } zt jd t d  t  W Y d }~d S d }~ww )Nztokens.jsonc                 S   s4   | dt_| dt_| dt_| t_|t_d S )NrF   access_tokenid_token)r4   r   r
   r   rY   r   r   )natnrtntdr   r   r   writeTokenVars   s
   
z%_TokenManager.<locals>.writeTokenVarsc                    s^   |   |  |d}t d}tj||ddd |  W d    d S 1 s(w   Y  d S )N)r   r   rK   wF   )ensure_asciiindent)	isoformatrR   r3   dumpflush)atIssuedrtIssuedrK   toWriteffileNamer   r   writeTokenFile   s   
"z%_TokenManager.<locals>.writeTokenFilec                     s`   t  d!} t| }t|dt|d|dfW  d    S 1 s)w   Y  d S )Nrr   r   rK   )rR   r3   loadr   fromisoformatr4   )rh   dri   r   r   readTokenFile   s   
$z$_TokenManager.<locals>.readTokenFilerE   rG   z/Error in setting token file, null values given.r   z=Error in reading/writing token file, creating new token file.r^   )r   r%   r&   	ExceptionrR   closer:   )actionatrttdr]   rk   rp   er   ri   r   r(      s,   r(   c                 C   s   dd l }d|ttj dtj dd dd}| dkr(d|tjd}n| d	kr2d	|d
}ntj	
d d S tjd||dS )Nr   zBasic :zutf-8z!application/x-www-form-urlencoded)AuthorizationContent-TyperP   )
grant_typerW   redirect_urirF   )r{   rF   zInvalid grant typez(https://api.schwabapi.com/v1/oauth/token)headersdata)base64	b64encodebytesr   r   r   decoder   r   r%   r&   requestspost)r{   rW   r   r}   r~   r   r   r   rH      s   (rH   c                 C   s(   t |  D ]}| | d u r| |= q| S N)listkeys)paramskeyr   r   r   _ParamsParser   s   r   8601c                 C   sd   | d u rd S | t u r| S |dkr|  d d  dS |dkr't|  d S |dkr0| dS | S )Nr   Zepochi  
YYYY-MM-DDz%Y-%M-%d)strrb   int	timestampr*   )dtformr   r   r   _TimeConvert   s   
r   c                 C   s.   | d u rd S | t   u rtkr| S  d| S )N,)r   r   join)lr   r   r   
formatList   s   
r   z#https://api.schwabapi.com/trader/v1c                   @   s4   e Zd Zedd ZedddZed	ddZdS )
r/   c                   C       t jt dddtj idS )Nz/accounts/accountNumbersry   Bearer r}   r   r4   atp_urlr   r   r   r   r   r   r0      s   zaccounts.accountNumbersNc                 C   *   t jt dddtj itd| idS N
/accounts/ry   r   fieldsr}   r   )r   r4   r   r   r   r   )r   r   r   r   getAllAccounts      
zaccounts.getAllAccountsc                 C   s<   |d u rt j}tjt d| ddtj itd| idS r   )r   r   r   r4   r   r   r   r   )r   r   r   r   r   
getAccount   s
   
zaccounts.getAccountr   NN)r   r   r	   staticmethodr0   r   r   r   r   r   r   r/      s    
r/   c                   @   s`   e Zd ZedddZedddZedddZeddd	Zedd
dZedddZ	dS )ordersNc              	   C   sN   |d u rt j}tjt d| dddtj dt| t|t||ddS )Nr   /ordersapplication/jsonr   Acceptry   
maxResultsfromEnteredTimetoEnteredTimestatusr   	r   r   r   r4   r   r   r   r   r   )r   r   r   r   r   r   r   r   	getOrders   s   zorders.getOrdersc                 C   s:   |d u rt j}tjt d| dddtj dd| dS )Nr   r   r   r   r   ry   rz   r}   r3   )r   r   r   r   r   r   r   )orderr   r   r   r   
placeOrder  s   zorders.placeOrderc                 C   8   |d u rt j}tjt d| d|  ddtj idS Nr   /orders/ry   r   r   r   r   r   r4   r   r   r   orderIdr   r   r   r   getOrder     zorders.getOrderc                 C   r   r   )r   r   r   deleter   r   r   r   r   r   r   cancelOrder  r   zorders.cancelOrderc                 C   s>   |d u rt j}tjt d| d|  ddtj dd|dS )Nr   r   r   r   r   r   )r   r   r   putr   r   r   )r   r   r   r   r   r   replaceOrder  s   zorders.replaceOrderc              	   C   s:   t jt dddtj dt| t|t||ddS )Nr   r   r   r   r   r   )r   r4   r   r   r   r   r   r   r   r   r   getAllOrders  s   zorders.getAllOrdersr   r   )
r   r   r	   r   r   r   r   r   r   r   r   r   r   r   r      s    r   c                   @   s(   e Zd ZedddZedddZdS )transactionsNc              
   C   sN   |d u rt j}tjt d| dddtj it|t| t|||ddS )Nr   z/transactionsry   r   )r   	startDateendDatesymboltypesr   r   )r   r   r   r   r   r   r   r   r   3  s   ztransactions.transactionsc                 C   s@   |d u rt j}tjt d| d|  ddtj i|| ddS )Nr   z/transactions/ry   r   )r   transactionIdr   r   )r   r   r   r   r   details;  s
   ztransactions.detailsr   r   )r   r   r	   r   r   r   r   r   r   r   r   2  s
    r   c                   @   s   e Zd Zedd ZdS )userPreferencec                   C   r   )Nz/userPreferencery   r   r   r   r   r   r   r   r   D  s    zuserPreference.userPreferenceN)r   r   r	   r   r   r   r   r   r   r   C  s    r   z'https://api.schwabapi.com/marketdata/v1c                   @   s(   e Zd ZedddZedddZdS )	quotesNFc                 C   s2   t jt dddtj itt| ||ddS )N/quotesry   r   symbolsr   
indicativer   )r   r4   mkt_urlr   r   r   r   r   r   r   r   getListP  s
   zquotes.getListc                 C   s0   t jt d|  dddtj itd|idS )N/r   ry   r   r   r   r   r4   r   r   r   r   )	symbol_idr   r   r   r   	getSingleV  s    
zquotes.getSingle)NNFr   )r   r   r	   r   r   r   r   r   r   r   r   O  s
    r   c                   @   s,   e Zd Ze			dddZedd ZdS )optionsNc                 C   s   t jt dddtj iti d| d|d|d|d|d	|d
|d|d|d|	d|
d|d|d|d|d|d|dS )Nz/chainsry   r   r   contractTypestrikeCountincludeUnderlyingQuotesstrategyintervalstrikerangefromDatetoDate
volatilityunderlyingPriceinterestRatedaysToExpirationexpMonth
optionTypeentitlementr   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   chains]  sB   zoptions.chainsc                 C   r   )Nz/expirationchainry   r   r   r   r   )r   r   r   r   expirationChainj  r   zoptions.expirationChain)NNNNNNNNNNNNNNNN)r   r   r	   r   r   r   r   r   r   r   r   \  s    r   c                   @   s   e Zd Ze		dddZdS )priceHistoryNc	           	      C   sF   t jt dddtj it| ||||t|dt|d||d	dS )Nz/pricehistoryry   r   r   	r   
periodTypeperiodfrequencyType	frequencyr   r   needExtendedHoursDataneedPreviousCloser   r   r4   r   r   r   r   r   r   r   r   r   bySymbolq  s   zpriceHistory.bySymbol)NNNNNNNN)r   r   r	   r   r   r   r   r   r   r   p  s
    r   c                   @   s   e Zd ZedddZdS )moversNc                 C   s0   t jt d|  ddtj it||ddS )Nz/movers/ry   r   )sortr   r   r   )r   r   r   r   r   r   	getMovers~  s   zmovers.getMoversr   )r   r   r	   r   r   r   r   r   r   r   }  s    r   c                   @   s(   e Zd ZedddZedddZdS )marketHoursNc                 C   s2   t jt dddtj it| t|dddS )Nz/marketsry   r   r   )marketsdater   r   )r   r   r   r   r   	byMarkets  s   zmarketHours.byMarketsc                 C   s4   t jt d|  ddtj itdt|didS )Nz	/markets/ry   r   r   r   r   r   )	market_idr   r   r   r   byMarket  s   zmarketHours.byMarketr   )r   r   r	   r   r   r   r   r   r   r   r     s
    r   c                   @   s$   e Zd Zedd Zedd ZdS )instrumentsc                 C   s(   t jt dddtj i| |ddS )Nz/instrumentsry   r   r   
projectionr   r   r4   r   r   r   r   r   r   r   r     s   zinstruments.bySymbolc                 C   s$   t jt d|  ddtj idS )Nz/instruments/ry   r   r   r  )cusip_idr   r   r   byCusip  s   zinstruments.byCusipN)r   r   r	   r   r   r  r   r   r   r   r     s
    
r   )r   NNN)Nr   )"__doc__r3   r   rA   modulesr   r   dotenvr   r"   r   r   r6   r.   rD   r;   r:   r(   rH   r   r   r   r   r/   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sF    
'

)
	7