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
)
27 installed
= Utils
.is_package_installed("steam");
31 public override async
bool install()
33 Utils
.open_uri("appstream://steam.desktop");
37 public override async
bool authenticate()
39 Settings
.Auth
.Steam
.get_instance().authenticated
= true;
41 if(is_authenticated()) return true;
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"});
52 Idle
.add(authenticate
.callback);
56 foreach(var uid
in users
.get_members())
59 user_name
= users
.get_object_member(uid
).get_string_member("PersonaName");
65 Idle
.add(authenticate
.callback);
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)
95 var cached
= GamesDB
.get_instance().get_games(this
);
99 if(game_loaded
!= null)
101 foreach(var g
in cached
)
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())
120 if(game_loaded
!= null) game_loaded(game
);
121 GamesDB
.get_instance().add_game(game
);
123 games_count
= games
.size
;
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"});
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
);