@@ -37,8 +37,17 @@ class MoreData:
37
37
# ["Tibba Games"]
38
38
publishers : list [str ] = field (default_factory = list )
39
39
40
+ # "4,99€"
41
+ old_price : str = ""
40
42
41
- def get_more_data (game_id : str ) -> MoreData :
43
+ # "11 Feb, 2022"
44
+ release_date : str = ""
45
+
46
+ # "Mixed"
47
+ reviews : str = ""
48
+
49
+
50
+ def get_more_data (game_id : str ) -> MoreData : # noqa: C901, PLR0912, PLR0915
42
51
"""Get more data about the game.
43
52
44
53
Args:
@@ -52,49 +61,76 @@ def get_more_data(game_id: str) -> MoreData:
52
61
return MoreData ()
53
62
54
63
logger .debug (f"Getting more data for { game_id = } " )
55
- response : requests .Response = requests .get (
64
+ appdetails_response : requests .Response = requests .get (
56
65
url = f"https://store.steampowered.com/api/appdetails?appids={ game_id } " ,
57
66
headers = {"User-Agent" : DEFAULT_USER_AGENT },
58
67
timeout = 30 ,
59
68
)
60
69
61
- if not response .ok :
62
- logger .error (f"Error when checking game for Steam:\n { response .status_code } - { response .reason } : { response .text } " )
63
- return MoreData ()
64
-
65
- response_data : dict = response .json ()
66
- if not response_data :
67
- logger .error (f"JSON data is empty for { game_id = } " )
68
- return MoreData ()
69
-
70
- logger .debug (f"{ response_data = } " )
71
-
72
- game_data : dict = response_data .get (game_id , {}).get ("data" , {})
73
- if game_data :
74
- more_data = MoreData ()
75
- header_image : str | None = game_data .get ("header_image" )
76
- if header_image :
77
- logger .debug (f"{ header_image = } for { game_id = } " )
78
- more_data .header_image = header_image
70
+ more_data = MoreData ()
71
+ if appdetails_response .ok :
72
+ game_data_from_api : dict = appdetails_response .json ()
73
+ if game_data_from_api and game_data_from_api .get (game_id , {}).get ("success" , False ):
74
+ logger .debug (f"{ game_data_from_api = } " )
75
+
76
+ game_data : dict = game_data_from_api .get (game_id , {}).get ("data" , {})
77
+ if game_data :
78
+ header_image : str | None = game_data .get ("header_image" )
79
+ if header_image :
80
+ logger .debug (f"{ header_image = } for { game_id = } " )
81
+ more_data .header_image = header_image
82
+
83
+ short_description : str | None = game_data .get ("short_description" )
84
+ if short_description :
85
+ logger .debug (f"{ short_description = } for { game_id = } " )
86
+ more_data .short_description = short_description
87
+
88
+ developers : list [str ] | None = game_data .get ("developers" )
89
+ if developers :
90
+ logger .debug (f"{ developers = } for { game_id = } " )
91
+ more_data .developers = developers
92
+
93
+ publishers : list [str ] | None = game_data .get ("publishers" )
94
+ if publishers :
95
+ logger .debug (f"{ publishers = } for { game_id = } " )
96
+ more_data .publishers = publishers
97
+
98
+ price_overview : dict | None = game_data .get ("price_overview" )
99
+ if price_overview :
100
+ more_data .old_price = price_overview .get ("initial_formatted" , "" )
101
+
102
+ release_date : dict | None = game_data .get ("release_date" )
103
+ if release_date :
104
+ more_data .release_date = release_date .get ("date" , "" )
79
105
80
- short_description : str | None = game_data . get ( "short_description" )
81
- if short_description :
82
- logger . debug ( f" { short_description = } for { game_id = } " )
83
- more_data . short_description = short_description
106
+ else :
107
+ logger . error ( f"Failed to get more data for { game_id = } : { game_data_from_api = } " )
108
+ else :
109
+ logger . error ( f"Failed to get more data for { game_id = } : { appdetails_response . status_code } - { appdetails_response . reason } " )
84
110
85
- developers : list [str ] | None = game_data .get ("developers" )
86
- if developers :
87
- logger .debug (f"{ developers = } for { game_id = } " )
88
- more_data .developers = developers
111
+ logger .debug (f"Getting reviews for { game_id = } " )
89
112
90
- publishers : list [str ] | None = game_data .get ("publishers" )
91
- if publishers :
92
- logger .debug (f"{ publishers = } for { game_id = } " )
93
- more_data .publishers = publishers
113
+ # {"success":1,"query_summary":{"num_reviews":0,"review_score":5,"review_score_desc":"Mixed","total_positive":125,"total_negative":74,"total_reviews":199},"reviews":[],"cursor":"*"} # noqa: E501
114
+ reviews_response : requests .Response = requests .get (
115
+ url = f"https://store.steampowered.com/appreviews/{ game_id } ?json=1&language=all&num_per_page=0&purchase_type=all" ,
116
+ headers = {"User-Agent" : DEFAULT_USER_AGENT },
117
+ timeout = 30 ,
118
+ )
94
119
95
- return more_data
120
+ if reviews_response .ok :
121
+ game_data : dict = reviews_response .json ()
122
+ if game_data and game_data .get ("success" , False ):
123
+ logger .debug (f"{ game_data = } " )
124
+ reviews : str | None = game_data .get ("query_summary" , {}).get ("review_score_desc" )
125
+ if reviews :
126
+ logger .debug (f"{ reviews = } for { game_id = } " )
127
+ more_data .reviews = reviews
128
+ else :
129
+ logger .error (f"Failed to get reviews for { game_id = } : { game_data = } " )
130
+ else :
131
+ logger .error (f"Failed to get reviews for { game_id = } : { reviews_response .status_code } - { reviews_response .reason } " )
96
132
97
- return MoreData ()
133
+ return more_data
98
134
99
135
100
136
def get_free_steam_games () -> Generator [DiscordEmbed , Any , None ]:
@@ -108,7 +144,12 @@ def get_free_steam_games() -> Generator[DiscordEmbed, Any, None]:
108
144
games : list [Node ] = parser .css ("a.search_result_row" )
109
145
110
146
for game in games :
111
- game_name : str = game .css_first ("span.title" ).text (strip = True )
147
+ title_element = game .css_first ("span.title" )
148
+ if title_element is None :
149
+ logger .warning ("Could not find title for game, skipping" )
150
+ continue
151
+
152
+ game_name : str = title_element .text (strip = True )
112
153
113
154
logger .info (f"Checking game: { game_name } " )
114
155
previous_games_file : Path = Path (settings .app_dir ) / "steam.txt"
@@ -130,6 +171,15 @@ def get_free_steam_games() -> Generator[DiscordEmbed, Any, None]:
130
171
if more_data .short_description :
131
172
embed .description = html .unescape (more_data .short_description )
132
173
174
+ if more_data .old_price :
175
+ embed .add_embed_field (name = "Old Price" , value = more_data .old_price )
176
+
177
+ if more_data .release_date :
178
+ embed .add_embed_field (name = "Release Date" , value = more_data .release_date )
179
+
180
+ if more_data .reviews :
181
+ embed .add_embed_field (name = "Reviews" , value = more_data .reviews )
182
+
133
183
set_game_footer (more_data , embed )
134
184
135
185
logger .debug (f"More data for { game_name } : { more_data } " )
0 commit comments