o
    ȳg                     @   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steamget_game_detailszGet Game Details)modenamedescriptionget_recommended_gameszGet Recommended Games
operationsforbid)extrareturnc                 C   s   | j S )zReturn a list of operations.)r   )self r   _/var/www/html/chatdoc2/venv/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. 	STEAM_KEYr
   )r
   r   ImportErrordecoupler   )clsr   r   r   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linkpricer   )r   r+   	game_info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)bs4r4   get_text)r   r3   r4   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,   search_gamesr2   r*   r&   getget_app_detailsr8   )r   r   r+   info_partOne_dictinfo_partOner-   	info_dictr9   r:   r;   info_partTwoinfor   r   r   details_of_gamesX   s.   



z#SteamWebAPIWrapper.details_of_gamesc                 C   s   | j j|}|d d }|S )Nplayersteamid)r
   userssearch_user)r   r   usersteam_idr   r   r   get_steam_idp   s   zSteamWebAPIWrapper.get_steam_idrJ   c                 C   s   | j j|ddS )NF)r
   rG   get_owned_games)r   rJ   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+   appid
appdetails)requestrN   genrez,    rP   c                 S   s   |  ddS )Naverage_foreverr   )r=   )xr   r   r   <lambda>   s    z6SteamWebAPIWrapper.recommended_games.<locals>.<lambda>T)r(   reversec                 S      g | ]}|d  qS rN   r   .0gamer   r   r   
<listcomp>       z8SteamWebAPIWrapper.recommended_games.<locals>.<listcomp>c                    s   g | ]
}|d   vr|qS rX   r   rY   owned_gamesr   r   r\      s    c                 S   rW   )r   r   rY   r   r   r   r\      r]      )

steamspypir   rM   downloadr=   splitdictsortedr   r&   )r   rJ   ra   users_gamesr'   most_popular_genremost_popular_genre_countr[   rN   data_request
genreStore	genreListrQ   r9   sorted_dataremaining_gamestop_5_popular_not_ownedr   r^   r   recommended_gamesx   sH   


	

z$SteamWebAPIWrapper.recommended_gamesr   r[   c                 C   s4   |dkr	|  |S |dkr| |S td| d)Nget_games_detailsr   zInvalid mode z for Steam API.)rD   ro   
ValueError)r   r   r[   r   r   r   run   s
   

zSteamWebAPIWrapper.run)__name__
__module____qualname____doc__r
   r   __annotations__r   r   r   r   rd   r   model_configr   r   classmethodr!   r&   r*   r2   r8   rD   rK   rM   ro   rr   r   r   r   r   r	      s6   
 &r	   N)rv   typingr   r   pydanticr   r   r   &langchain_community.tools.steam.promptr   r   r	   r   r   r   r   <module>   s
    