Humble Bundle support
[GameHub.git] / src / data / sources / steam / Steam.vala
blobd1242c6d341c7ace8cb0be12a80663ada7a51361
1 using Gtk;
2 using Gee;
3 using GameHub.Utils;
5 namespace GameHub.Data.Sources.Steam
7 public class Steam: GameSource
9 private string api_key;
11 public override string name { get { return "Steam"; } }
12 public override string icon { get { return "steam"; } }
13 public override string auth_description { owned get { return ".\n%s".printf(_("Your SteamID will be read from Steam configuration file")); } }
15 public string? user_id { get; protected set; }
16 public string? user_name { get; protected set; }
18 private bool? installed = null;
20 public override bool is_installed(bool refresh)
22 if(installed != null && !refresh)
24 return (!) installed;
27 installed = Utils.is_package_installed("steam");
28 return (!) installed;
31 public override async bool install()
33 Utils.open_uri("appstream://steam.desktop");
34 return true;
37 public override async bool authenticate()
39 Settings.Auth.Steam.get_instance().authenticated = true;
41 if(is_authenticated()) return true;
43 var result = false;
45 new Thread<void*>("steam-loginusers-thread", () => {
46 var config = Parser.parse_vdf_file(FSUtils.Paths.Steam.LoginUsersVDF);
47 var users = Parser.json_object(config, {"users"});
49 if(users == null)
51 result = false;
52 Idle.add(authenticate.callback);
53 return null;
56 foreach(var uid in users.get_members())
58 user_id = uid;
59 user_name = users.get_object_member(uid).get_string_member("PersonaName");
61 result = true;
62 break;
65 Idle.add(authenticate.callback);
66 return null;
67 });
69 yield;
70 return result;
73 public override bool is_authenticated()
75 return user_id != null;
78 public override bool can_authenticate_automatically()
80 return Settings.Auth.Steam.get_instance().authenticated;
83 private ArrayList<Game> games = new ArrayList<Game>(Game.is_equal);
84 public override async ArrayList<Game> load_games(FutureResult<Game>? game_loaded = null)
86 api_key = Settings.Auth.Steam.get_instance().api_key;
88 if(!is_authenticated() || games.size > 0)
90 return games;
93 games.clear();
95 var cached = GamesDB.get_instance().get_games(this);
96 if(cached.size > 0)
98 games = cached;
99 if(game_loaded != null)
101 foreach(var g in cached)
103 game_loaded(g);
107 games_count = games.size;
109 var url = @"https://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=$(api_key)&steamid=$(user_id)&format=json&include_appinfo=1&include_played_free_games=1";
111 var root = yield Parser.parse_remote_json_file_async(url);
112 var json_games = Parser.json_object(root, {"response"}).get_array_member("games");
114 foreach(var g in json_games.get_elements())
116 var game = new SteamGame(this, g.get_object());
117 if(!games.contains(game) && yield game.is_for_linux())
119 games.add(game);
120 if(game_loaded != null) game_loaded(game);
121 GamesDB.get_instance().add_game(game);
123 games_count = games.size;
126 return games;
129 public static ArrayList<string>? folders = null;
130 public static ArrayList<string> LibraryFolders
134 if(folders != null) return folders;
136 folders = new ArrayList<string>();
137 folders.add(FSUtils.Paths.Steam.SteamApps);
139 var root = Parser.parse_vdf_file(FSUtils.Paths.Steam.LibraryFoldersVDF);
140 var lf = Parser.json_object(root, {"LibraryFolders"});
142 if(lf != null)
144 foreach(var key in lf.get_members())
146 var dir = lf.get_string_member(key) + "/steamapps";
147 if(FSUtils.file(dir).query_exists()) folders.add(dir);
151 return folders;