U
    h                     @   s8   d Z ddlmZmZ ddlmZmZ G dd deZdS )zUtil that calls Steam-WebAPI.    )AnyList)	BaseModelroot_validatorc                   @   s  e Zd ZU dZeed< ddlmZmZ ddeddd	edgZ	e
e ed
< G dd dZe
e dddZeddeedddZeedddZeedddZeedddZeeddd Zeedd!d"Zee
e d#d$d%Zeed#d&d'Zeeed(d)d*Zd+S ),SteamWebAPIWrapperzWrapper for Steam API.steamr   )STEAM_GET_GAMES_DETAILSSTEAM_GET_RECOMMENDED_GAMESZget_game_detailszGet Game Details)modenamedescriptionget_recommended_gameszGet Recommended Games
operationsc                   @   s   e Zd ZdZdS )zSteamWebAPIWrapper.ConfigZforbidN)__name__
__module____qualname__extra r   r   G/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/steam.pyConfig!   s   r   )returnc                 C   s   | j S )zReturn a list of operations.)r   )selfr   r   r   get_operations$   s    z!SteamWebAPIWrapper.get_operationsT)pre)valuesr   c                 C   sx   zddl m} W n tk
r,   tdY nX zddlm} W n tk
rZ   tdY nX |d}||}||d< |S )z8Validate api key and python package has been configured.r   )Steamz+python-steam-api library is not installed. )configz#decouple library is not installed. Z	STEAM_KEYr   )r   r   ImportErrorZdecoupler   )clsr   r   r   ZKEYr   r   r   r   validate_environment(   s    z'SteamWebAPIWrapper.validate_environment)detailsr   c                 C   s:   d}|  D ](\}}|dt| d t| d 7 }q|S )zParse the details result. zThe z is: 
)itemsstr)r   r    resultkeyvaluer   r   r   parse_to_str=   s    "zSteamWebAPIWrapper.parse_to_str)gamesr   c                 C   s>   i }|d D ],}|d |d< |d |d< |d |d<  q:q|S )zjThe response may contain more than one game, so we need to choose the right
        one and return the id.appsidlinkZpricer   )r   r)   Z	game_infoZappr   r   r   get_id_link_priceD   s    z$SteamWebAPIWrapper.get_id_link_price)html_stringr   c                 C   s   ddl m} ||d}| S )Nr   )BeautifulSoupzhtml.parser)Zbs4r/   Zget_text)r   r.   r/   Zsoupr   r   r   remove_html_tagsP   s    
z#SteamWebAPIWrapper.remove_html_tags)r   r   c                 C   s   | j j|}| |}| |}t|d}| j j|}||d}|d}| |}||dd}	d| d d |	 d }
||
 }|S )Nr+   datadetailed_descriptionsupported_languageszThe summary of the game is: r"   z)The supported languages of the game are: )	r   r*   Zsearch_gamesr-   r(   r$   getZget_app_detailsr0   )r   r   r)   Zinfo_partOne_dictZinfo_partOner+   Z	info_dictr1   r2   r3   Zinfo_partTwoinfor   r   r   details_of_gamesV   s.    



z#SteamWebAPIWrapper.details_of_gamesc                 C   s   | j j|}|d d }|S )NZplayerZsteamid)r   usersZsearch_user)r   r   usersteam_idr   r   r   get_steam_idn   s    zSteamWebAPIWrapper.get_steam_id)r9   r   c                 C   s   | j j|ddS )NF)r   r7   Zget_owned_games)r   r9   r   r   r   get_users_gamess   s    z"SteamWebAPIWrapper.get_users_gamesc                    s8  zdd l }W n tk
r(   tdY nX | |}i }d}d}|d D ]v}|d }d|d}	||	}
|
ddd	}|D ]>}||kr||  d
7  < nd
||< || |kr~|| }|}q~qHt }	d|	d< ||	d< ||	}t| dd dd}dd |d D   fdd|D }dd |d d D }t	|S )Nr   z$steamspypi library is not installed.r!   r)   appidZ
appdetails)requestr<   genrez,    r=   c                 S   s   |  ddS )NZaverage_foreverr   )r4   )xr   r   r   <lambda>       z6SteamWebAPIWrapper.recommended_games.<locals>.<lambda>T)r&   reversec                 S   s   g | ]}|d  qS r<   r   .0gamer   r   r   
<listcomp>   s     z8SteamWebAPIWrapper.recommended_games.<locals>.<listcomp>c                    s   g | ]}|d   kr|qS rD   r   rE   Zowned_gamesr   r   rH      s     c                 S   s   g | ]}|d  qS )r   r   rE   r   r   r   rH      s        )

steamspypir   r;   downloadr4   splitdictsortedr   r$   )r   r9   rK   Zusers_gamesr%   Zmost_popular_genreZmost_popular_genre_countrG   r<   Zdata_requestZ
genreStoreZ	genreListr>   r1   Zsorted_dataZremaining_gamesZtop_5_popular_not_ownedr   rI   r   recommended_gamesv   sF    



  
z$SteamWebAPIWrapper.recommended_games)r
   rG   r   c                 C   s8   |dkr|  |S |dkr$| |S td| dd S )NZget_games_detailsr   zInvalid mode z for Steam API.)r6   rP   
ValueError)r   r
   rG   r   r   r   run   s
    

zSteamWebAPIWrapper.runN)r   r   r   __doc__r   __annotations__Z&langchain_community.tools.steam.promptr   r	   r   r   rN   r   r   r   r   r$   r(   r-   r0   r6   r:   r;   rP   rR   r   r   r   r   r      s0   
	&r   N)rS   typingr   r   Zlangchain_core.pydantic_v1r   r   r   r   r   r   r   <module>   s   