o
    Zh                     @   sL   d Z ddlmZmZ ddlmZ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
ConfigDictmodel_validator)STEAM_GET_GAMES_DETAILSSTEAM_GET_RECOMMENDED_GAMESc                   @   s  e Zd ZU dZdZeed< ddedddedgZ	e
e ed	< ed
dZde
e fddZeddededefddZdedefddZdedefddZdedefddZdedefddZdedefd d!Zd"ede
e fd#d$Zd"edefd%d&Zd'ed(edefd)d*ZdS )+SteamWebAPIWrapperzWrapper for Steam API.NsteamZget_game_detailszGet Game Details)modenamedescriptionget_recommended_gameszGet Recommended Games
operationsZforbid)extrareturnc                 C   s   | j S )zReturn a list of operations.)r   )self r   Z/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/utilities/steam.pyget_operations%   s   z!SteamWebAPIWrapper.get_operationsbefore)r   valuesc                 C   sl   zddl m} W n ty   tdw zddlm} W n ty'   tdw |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detailsc                 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gamesc                 C   s>   i }|d D ]}|d |d< |d |d< |d |d<  |S |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_priceF   s   z$SteamWebAPIWrapper.get_id_link_pricehtml_stringc                 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_tagsR   s   
z#SteamWebAPIWrapper.remove_html_tagsr   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_detailsr-   )r   r   r&   Zinfo_partOne_dictZinfo_partOner(   Z	info_dictr.   r/   r0   Zinfo_partTwoinfor   r   r   details_of_gamesX   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_idp   s   zSteamWebAPIWrapper.get_steam_idr6   c                 C   s   | j j|ddS )NF)r
   r4   Zget_owned_games)r   r6   r   r   r   get_users_gamesu   s   z"SteamWebAPIWrapper.get_users_gamesc                    s2  zdd l }W n ty   tdw | |}i }d}d}|d D ];}|d }d|d}	||	}
|
ddd	}|D ]}||v rK||  d
7  < nd
||< || |kr[|| }|}q<q!t }	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)requestr9   genrez,    r:   c                 S   s   |  ddS )NZaverage_foreverr   )r1   )xr   r   r   <lambda>   s    z6SteamWebAPIWrapper.recommended_games.<locals>.<lambda>T)r#   reversec                 S      g | ]}|d  qS r9   r   .0gamer   r   r   
<listcomp>       z8SteamWebAPIWrapper.recommended_games.<locals>.<listcomp>c                    s   g | ]
}|d   vr|qS rA   r   rB   Zowned_gamesr   r   rE      s    c                 S   r@   )r   r   rB   r   r   r   rE      rF      )

steamspypir   r8   downloadr1   splitdictsortedr   r!   )r   r6   rI   Zusers_gamesr"   Zmost_popular_genreZmost_popular_genre_countrD   r9   Zdata_requestZ
genreStoreZ	genreListr;   r.   Zsorted_dataZremaining_gamesZtop_5_popular_not_ownedr   rG   r   recommended_gamesx   sH   


	

z$SteamWebAPIWrapper.recommended_gamesr   rD   c                 C   s4   |dkr	|  |S |dkr| |S td| d)NZget_games_detailsr   zInvalid mode z for Steam API.)r3   rN   
ValueError)r   r   rD   r   r   r   run   s
   

zSteamWebAPIWrapper.run)__name__
__module____qualname____doc__r
   r   __annotations__r   r   r   r   rL   r   Zmodel_configr   r   classmethodr   r!   r%   r*   r-   r3   r7   r8   rN   rP   r   r   r   r   r	      s6   
 &r	   N)rT   typingr   r   Zpydanticr   r   r   Z&langchain_community.tools.steam.promptr   r   r	   r   r   r   r   <module>   s
    