Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mxrch
GitHub Repository: mxrch/GHunt
Path: blob/master/ghunt/parsers/playgames.py
252 views
1
from typing import *
2
from datetime import datetime
3
4
from ghunt.objects.apis import Parser
5
6
7
### Profile
8
9
class PlayerProfile(Parser):
10
def __init__(self):
11
self.display_name: str = ""
12
self.id: str = ""
13
self.avatar_url: str = ""
14
self.banner_url_portrait: str = ""
15
self.banner_url_landscape: str = ""
16
self.gamertag: str = ""
17
self.last_played_app: PlayerPlayedApp = PlayerPlayedApp()
18
self.profile_settings: PlayerProfileSettings = PlayerProfileSettings()
19
self.experience_info: PlayerExperienceInfo = PlayerExperienceInfo()
20
self.title: str = ""
21
22
def _scrape(self, player_data: Dict[str, any]):
23
self.display_name = player_data.get("playerId")
24
self.display_name = player_data.get("displayName")
25
self.avatar_url = player_data.get("avatarImageUrl")
26
self.banner_url_portrait = player_data.get("bannerUrlPortrait")
27
self.banner_url_landscape = player_data.get("bannerUrlLandscape")
28
self.gamertag = player_data.get("gamerTag")
29
if (last_played_app_data := player_data.get("lastPlayedApp")):
30
self.last_played_app._scrape(last_played_app_data)
31
if (profile_settings_data := player_data.get("profileSettings")):
32
self.profile_settings._scrape(profile_settings_data)
33
if (experience_data := player_data.get("experienceInfo")):
34
self.experience_info._scrape(experience_data)
35
self.title = player_data.get("title")
36
37
class PlayerPlayedApp(Parser):
38
def __init__(self):
39
self.app_id: str = ""
40
self.icon_url: str = ""
41
self.featured_image_url: str = ""
42
self.app_name: str = ""
43
self.timestamp_millis: str = ""
44
45
def _scrape(self, played_app_data: Dict[str, any]):
46
self.app_id = played_app_data.get("applicationId")
47
self.icon_url = played_app_data.get("applicationIconUrl")
48
self.featured_image_url = played_app_data.get("featuredImageUrl")
49
self.app_name = played_app_data.get("applicationName")
50
if (timestamp := played_app_data.get("timeMillis")):
51
self.timestamp_millis = datetime.utcfromtimestamp(float(timestamp[:10]))
52
53
class PlayerExperienceInfo(Parser):
54
def __init__(self):
55
self.current_xp: str = ""
56
self.last_level_up_timestamp_millis: str = ""
57
self.current_level: PlayerLevel = PlayerLevel()
58
self.next_level: PlayerLevel = PlayerLevel()
59
self.total_unlocked_achievements: int = 0
60
61
def _scrape(self, experience_data: Dict[str, any]):
62
self.current_xp = experience_data.get("currentExperiencePoints")
63
if (timestamp := experience_data.get("lastLevelUpTimestampMillis")):
64
self.last_level_up_timestamp_millis = datetime.utcfromtimestamp(float(timestamp[:10]))
65
if (current_level_data := experience_data.get("currentLevel")):
66
self.current_level._scrape(current_level_data)
67
if (next_level_data := experience_data.get("nextLevel")):
68
self.next_level._scrape(next_level_data)
69
self.total_unlocked_achievements = experience_data.get("totalUnlockedAchievements")
70
71
class PlayerLevel(Parser):
72
def __init__(self):
73
self.level: int = 0
74
self.min_xp: str = ""
75
self.max_xp: str = ""
76
77
def _scrape(self, level_data: Dict[str, any]):
78
self.level = level_data.get("level")
79
self.min_xp = level_data.get("minExperiencePoints")
80
self.max_xp = level_data.get("maxExperiencePoints")
81
82
class PlayerProfileSettings(Parser):
83
def __init__(self):
84
self.profile_visible: bool = False
85
86
def _scrape(self, profile_settings_data: Dict[str, any]):
87
self.profile_visible = profile_settings_data.get("profileVisible")
88
89
### Played Applications
90
91
class PlayedGames(Parser):
92
def __init__(self):
93
self.games: List[PlayGame] = []
94
95
def _scrape(self, games_data: Dict[str, any]):
96
for game_data in games_data:
97
play_game = PlayGame()
98
play_game._scrape(game_data)
99
self.games.append(play_game)
100
101
class PlayGame(Parser):
102
def __init__(self):
103
self.game_data: PlayGameData = PlayGameData()
104
self.market_data: PlayGameMarketData = PlayGameMarketData()
105
self.formatted_last_played_time: str = ""
106
self.last_played_time_millis: str = ""
107
self.unlocked_achievement_count: int = 0
108
109
def _scrape(self, game_data: Dict[str, any]):
110
if (games_data := game_data.get("gamesData")):
111
self.game_data._scrape(games_data)
112
if (market_data := game_data.get("marketData")):
113
self.market_data._scrape(market_data)
114
self.formatted_last_played_time = game_data.get("formattedLastPlayedTime")
115
if (timestamp := game_data.get("lastPlayedTimeMillis")):
116
self.last_played_time_millis = datetime.utcfromtimestamp(float(timestamp[:10]))
117
self.unlocked_achievement_count = game_data.get("unlockedAchievementCount")
118
119
class PlayGameMarketData(Parser):
120
def __init__(self):
121
self.instances: List[PlayGameMarketInstance] = []
122
123
def _scrape(self, market_data: Dict[str, any]):
124
if (instances_data := market_data.get("instances")):
125
for instance_data in instances_data:
126
instance = PlayGameMarketInstance()
127
instance._scrape(instance_data)
128
self.instances.append(instance)
129
130
class PlayGameMarketInstance(Parser):
131
def __init__(self):
132
self.id: str = ""
133
self.title: str = ""
134
self.description: str = ""
135
self.images: List[PlayGameImageAsset] = []
136
self.developer_name: str = ""
137
self.categories: List[str] = []
138
self.formatted_price: str = ""
139
self.price_micros: str = ""
140
self.badges: List[PlayGameMarketBadge] = []
141
self.is_owned: bool = False
142
self.enabled_features: List[str] = []
143
self.description_snippet: str = ""
144
self.rating: PlayGameMarketRating = PlayGameMarketRating()
145
self.last_updated_timestamp_millis: str = ""
146
self.availability: str = ""
147
148
def _scrape(self, instance_data: Dict[str, any]):
149
self.id = instance_data.get("id")
150
self.title = instance_data.get("title")
151
self.description = instance_data.get("description")
152
if (images_data := instance_data.get("images")):
153
for image_data in images_data:
154
image = PlayGameImageAsset()
155
image._scrape(image_data)
156
self.images.append(image)
157
self.developer_name = instance_data.get("developerName")
158
self.categories = instance_data.get("categories", [])
159
self.formatted_price = instance_data.get("formattedPrice")
160
self.price_micros = instance_data.get("priceMicros")
161
if (badges_data := instance_data.get("badges")):
162
for badge_data in badges_data:
163
badge = PlayGameMarketBadge()
164
badge._scrape(badge_data)
165
self.badges.append(badge)
166
self.is_owned = instance_data.get("isOwned")
167
self.enabled_features = instance_data.get("enabledFeatures", [])
168
self.description_snippet = instance_data.get("descriptionSnippet")
169
if (rating_data := instance_data.get("rating")):
170
self.rating._scrape(rating_data)
171
if (timestamp := instance_data.get("lastUpdatedTimestampMillis")):
172
self.last_updated_timestamp_millis = datetime.utcfromtimestamp(float(timestamp[:10]))
173
self.availability = instance_data.get("availability")
174
175
class PlayGameMarketRating(Parser):
176
def __init__(self):
177
self.star_rating: float = 0.0
178
self.ratings_count: str = ""
179
180
def _scrape(self, rating_data: Dict[str, any]):
181
self.star_rating = rating_data.get("starRating")
182
self.ratings_count = rating_data.get("ratingsCount")
183
184
class PlayGameMarketBadge(Parser):
185
def __init__(self):
186
self.badge_type: str = ""
187
self.title: str = ""
188
self.description: str = ""
189
self.images: List[PlayGameImageAsset] = []
190
191
def _scrape(self, badge_data: Dict[str, any]):
192
self.badge_type = badge_data.get("badgeType")
193
self.title = badge_data.get("title")
194
self.description = badge_data.get("description")
195
if (images_data := badge_data.get("images")):
196
for image_data in images_data:
197
image = PlayGameImageAsset()
198
image._scrape(image_data)
199
self.images.append(image)
200
201
class PlayGameData(Parser):
202
def __init__(self):
203
self.id: str = ""
204
self.name: str = ""
205
self.author: str = ""
206
self.description: str = ""
207
self.category: PlayGameCategory = PlayGameCategory()
208
self.assets: List[PlayGameImageAsset] = []
209
self.instances: List[PlayGameInstance] = []
210
self.last_updated_timestamp: str = ""
211
self.achievement_count: int = 0,
212
self.leaderboard_count: int = 0,
213
self.enabled_features: List[str] = []
214
self.theme_color: str = ""
215
216
def _scrape(self, game_data: Dict[str, any]):
217
self.id = game_data.get("id")
218
self.name = game_data.get("name")
219
self.author = game_data.get("author")
220
self.description = game_data.get("description")
221
if (category_data := game_data.get("category")):
222
self.category._scrape(category_data)
223
if (assets_data := game_data.get("assets")):
224
for asset_data in assets_data:
225
asset = PlayGameImageAsset()
226
asset._scrape(asset_data)
227
self.assets.append(asset)
228
if (instances_data := game_data.get("instances")):
229
for instance_data in instances_data:
230
instance = PlayGameInstance()
231
instance._scrape(instance_data)
232
self.instances.append(instance)
233
if (timestamp := game_data.get("lastUpdatedTimestamp")):
234
self.last_updated_timestamp = datetime.utcfromtimestamp(float(timestamp[:10]))
235
self.achievement_count = game_data.get("achievement_count")
236
self.leaderboard_count = game_data.get("leaderboard_count")
237
self.enabled_features = game_data.get("enabledFeatures", [])
238
self.theme_color = game_data.get("themeColor")
239
240
class PlayGameInstance(Parser):
241
def __init__(self):
242
self.platform_type: str = ""
243
self.name: str = ""
244
self.turn_based_play: bool = False
245
self.realtime_play: bool = False
246
self.android_instance: List[PlayGameAndroidInstance] = []
247
self.acquisition_uri: str = ""
248
249
def _scrape(self, instance_data: Dict[str, any]):
250
self.platform_type = instance_data.get("plateformType")
251
self.name = instance_data.get("name")
252
self.turn_based_play = instance_data.get("turnBasedPlay")
253
self.realtime_play = instance_data.get("realtimePlay")
254
if (android_instance_data := instance_data.get("androidInstance")):
255
android_instance = PlayGameAndroidInstance()
256
android_instance._scrape(android_instance_data)
257
self.android_instance.append(android_instance_data)
258
259
class PlayGameAndroidInstance(Parser):
260
def __init__(self):
261
self.package_name: str = ""
262
self.enable_piracy_check: bool = False
263
self.preferred: bool = False
264
265
def _scrape(self, android_instance_data: Dict[str, any]):
266
self.package_name = android_instance_data.get("packageName")
267
self.enable_piracy_check = android_instance_data.get("enablePiracyCheck")
268
self.preferred = android_instance_data.get("preferred")
269
270
class PlayGameImageAsset(Parser):
271
def __init__(self):
272
self.name: str = ""
273
self.width: str = ""
274
self.height: str = ""
275
self.url: str = ""
276
277
def _scrape(self, image_data: Dict[str, any]):
278
self.name = image_data.get("name")
279
self.width = image_data.get("width")
280
self.height = image_data.get("height")
281
self.url = image_data.get("url")
282
283
class PlayGameCategory(Parser):
284
def __init__(self):
285
self.primary: str = ""
286
287
def _scrape(self, category_data: Dict[str, any]):
288
self.primary = category_data.get("primary")
289
290
### Achievements
291
292
class PlayerAchievements(Parser):
293
def __init__(self):
294
self.achievements: List[PlayerAchievement] = []
295
296
def _scrape(self, achievements_data: Dict[str, any]):
297
achievements_defs : List[PlayerAchievementDefinition] = []
298
if (achievement_defs_data := achievements_data.get("definitions")):
299
for achievement_def_data in achievement_defs_data:
300
achievement_def = PlayerAchievementDefinition()
301
achievement_def._scrape(achievement_def_data)
302
achievements_defs.append(achievement_def)
303
if (achievements_items_data := achievements_data.get("items")):
304
for achievement_item_data in achievements_items_data:
305
achievement = PlayerAchievement()
306
achievement._scrape(achievement_item_data)
307
for achievement_def in achievements_defs:
308
if achievement_def.id == achievement.id:
309
achievement.definition = achievement_def
310
self.achievements.append(achievement)
311
312
class PlayerAchievement(Parser):
313
def __init__(self):
314
self.id: str = ""
315
self.achievement_state: str = ""
316
self.last_updated_timestamp: datetime = 0
317
self.app_id: str = 0
318
self.xp: str = ""
319
self.definition: PlayerAchievementDefinition = PlayerAchievementDefinition()
320
321
def _scrape(self, achievement_item_data: Dict[str, any]):
322
self.id = achievement_item_data.get("id")
323
self.achievement_state = achievement_item_data.get("achievementState")
324
if (timestamp := achievement_item_data.get("lastUpdatedTimestamp")):
325
self.last_updated_timestamp = datetime.utcfromtimestamp(float(timestamp[:10]))
326
self.app_id = achievement_item_data.get("application_id")
327
self.xp = achievement_item_data.get("experiencePoints")
328
329
class PlayerAchievementDefinition(Parser):
330
def __init__(self):
331
self.id: str = ""
332
self.name: str = ""
333
self.description: str = ""
334
self.achievement_type: str = ""
335
self.xp: str = ""
336
self.revealed_icon_url: str = ""
337
self.unlocked_icon_url: str = ""
338
self.initial_state: str = ""
339
self.is_revealed_icon_url_default: bool = False
340
self.is_unlocked_icon_url_default: bool = False
341
self.rarity_percent: float = 0.0
342
343
def _scrape(self, achievement_def_data: Dict[str, any]):
344
self.id = achievement_def_data.get("id")
345
self.name = achievement_def_data.get("name")
346
self.description = achievement_def_data.get("description")
347
self.achievement_type = achievement_def_data.get("achievementType")
348
self.xp = achievement_def_data.get("experiencePoints")
349
self.revealed_icon_url = achievement_def_data.get("revealedIconUrl")
350
self.unlocked_icon_url = achievement_def_data.get("unlockedIconUrl")
351
self.initial_state = achievement_def_data.get("initialState")
352
self.is_revealed_icon_url_default = achievement_def_data.get("isRevealedIconUrlDefault")
353
self.is_unlocked_icon_url_default = achievement_def_data.get("isUnlockedIconUrlDefault")
354
self.rarity_percent = achievement_def_data.get("rarityParcent")
355
356
### Global
357
358
class Player(Parser):
359
def __init__(self, profile: PlayerProfile = PlayerProfile(),
360
played_games: List[PlayGame] = [],
361
achievements: List[PlayerAchievement] = []):
362
self.profile: PlayerProfile = profile
363
self.played_games: List[PlayGame] = played_games
364
self.achievements: List[PlayerAchievement] = achievements
365