Humble Bundle support
[GameHub.git] / src / data / sources / steam / SteamGame.vala
blobc3921f3750f14065576b0c567783139bc5fb07b6
1 using Gtk;
2 using GameHub.Utils;
4 namespace GameHub.Data.Sources.Steam
6 public class SteamGame: Game
8 private bool? _is_for_linux = null;
9 private int metadata_tries = 0;
11 public SteamGame(Steam src, Json.Object json)
13 source = src;
14 id = json.get_int_member("appid").to_string();
15 name = json.get_string_member("name");
16 var icon_hash = json.get_string_member("img_icon_url");
17 icon = @"https://media.steampowered.com/steamcommunity/public/images/apps/$(id)/$(icon_hash).jpg";
18 image = @"https://cdn.akamai.steamstatic.com/steam/apps/$(id)/header.jpg";
20 if(GamesDB.get_instance().is_game_unsupported(src, id))
22 _is_for_linux = false;
26 public SteamGame.from_db(Steam src, Sqlite.Statement stmt)
28 source = src;
29 id = stmt.column_text(1);
30 name = stmt.column_text(2);
31 icon = stmt.column_text(3);
32 image = stmt.column_text(4);
33 custom_info = stmt.column_text(5);
34 _is_for_linux = true;
37 public override async bool is_for_linux()
39 if(_is_for_linux != null) return _is_for_linux;
41 metadata_tries++;
43 print("[Steam app %s] Checking for linux compatibility [%d]...\n", id, metadata_tries);
45 var url = @"https://store.steampowered.com/api/appdetails?appids=$(id)";
46 var root = yield Parser.parse_remote_json_file_async(url);
47 var platforms = Parser.json_object(root, {id, "data", "platforms"});
49 if(platforms == null)
51 if(metadata_tries > 2)
53 print("[Steam app %s] No data, %d tries failed, assuming no linux support\n", id, metadata_tries);
54 _is_for_linux = false;
55 GamesDB.get_instance().add_unsupported_game(source, id);
56 return _is_for_linux;
59 print("[Steam app %s] No data, sleeping for 2.5s\n", id);
60 yield Utils.sleep_async(2500);
61 return yield is_for_linux();
64 _is_for_linux = platforms.get_boolean_member("linux");
66 if(_is_for_linux == false) GamesDB.get_instance().add_unsupported_game(source, id);
68 return _is_for_linux;
71 public override bool is_installed()
73 foreach(var dir in Steam.LibraryFolders)
75 var acf = FSUtils.file(dir, @"appmanifest_$(id).acf");
76 if(acf.query_exists())
78 return true;
82 return false;
85 public override async void install(DownloadProgress progress = (d, t) => {})
87 yield run();
90 public override async void run()
92 Utils.open_uri(@"steam://rungameid/$(id)");