Humble Bundle support
[GameHub.git] / src / data / sources / gog / GOG.vala
blob8b3be1e644d0b7a36908347c67063f7f5e7c8d47
1 using Gtk;
2 using Gee;
3 using GameHub.Utils;
5 namespace GameHub.Data.Sources.GOG
7 public class GOG: GameSource
9 private const string CLIENT_ID = "46899977096215655";
10 private const string CLIENT_SECRET = "9d85c43b1482497dbbce61f6e4aa173a433796eeae2ca8c5f6129f2dc4de46d9";
11 private const string REDIRECT = "https%3A%2F%2Fembed.gog.com%2Fon_login_success%3Forigin%3Dclient";
13 public override string name { get { return "GOG"; } }
14 public override string icon { get { return "gog"; } }
16 public string? user_id { get; protected set; }
17 public string? user_name { get; protected set; }
19 private string? user_auth_code = null;
20 public string? user_token = null;
21 private string? user_refresh_token = null;
22 private bool token_needs_refresh = false;
24 private Settings.Auth.GOG settings;
26 public GOG()
28 settings = Settings.Auth.GOG.get_instance();
29 var access_token = settings.access_token;
30 var refresh_token = settings.refresh_token;
31 if(access_token.length > 0 && refresh_token.length > 0)
33 user_token = access_token;
34 user_refresh_token = refresh_token;
35 token_needs_refresh = true;
39 public override bool is_installed(bool refresh)
41 return true;
44 public override async bool install()
46 return true;
49 public override async bool authenticate()
51 settings.authenticated = true;
53 if(token_needs_refresh && user_refresh_token != null)
55 return (yield refresh_token());
58 return (yield get_auth_code()) && (yield get_token());
61 public override bool is_authenticated()
63 return !token_needs_refresh && user_token != null;
66 public override bool can_authenticate_automatically()
68 return user_refresh_token != null && settings.authenticated;
71 private async bool get_auth_code()
73 if(user_auth_code != null)
75 return true;
78 var wnd = new GameHub.UI.Windows.WebAuthWindow(this.name, @"https://auth.gog.com/auth?client_id=$(CLIENT_ID)&redirect_uri=$(REDIRECT)&response_type=code&layout=client2", "https://embed.gog.com/on_login_success?origin=client&code=");
80 wnd.finished.connect(code =>
82 user_auth_code = code;
83 Idle.add(get_auth_code.callback);
84 });
86 wnd.canceled.connect(() => Idle.add(get_auth_code.callback));
88 wnd.set_size_request(550, 680);
89 wnd.show_all();
90 wnd.present();
92 yield;
94 return user_auth_code != null;
97 private async bool get_token()
99 if(user_token != null)
101 return true;
104 var url = @"https://auth.gog.com/token?client_id=$(CLIENT_ID)&client_secret=$(CLIENT_SECRET)&grant_type=authorization_code&redirect_uri=$(REDIRECT)&code=$(user_auth_code)";
105 var root = (yield Parser.parse_remote_json_file_async(url)).get_object();
106 user_token = root.get_string_member("access_token");
107 user_refresh_token = root.get_string_member("refresh_token");
108 user_id = root.get_string_member("user_id");
110 settings.access_token = user_token ?? "";
111 settings.refresh_token = user_refresh_token ?? "";
113 return user_token != null;
116 private async bool refresh_token()
118 if(user_refresh_token == null)
120 return false;
123 var url = @"https://auth.gog.com/token?client_id=$(CLIENT_ID)&client_secret=$(CLIENT_SECRET)&grant_type=refresh_token&refresh_token=$(user_refresh_token)";
124 var root = (yield Parser.parse_remote_json_file_async(url)).get_object();
125 user_token = root.get_string_member("access_token");
126 user_refresh_token = root.get_string_member("refresh_token");
127 user_id = root.get_string_member("user_id");
129 settings.access_token = user_token ?? "";
130 settings.refresh_token = user_refresh_token ?? "";
132 token_needs_refresh = false;
134 return user_token != null;
137 private ArrayList<Game> games = new ArrayList<Game>(Game.is_equal);
138 public override async ArrayList<Game> load_games(FutureResult<Game>? game_loaded = null)
140 if(user_id == null || user_token == null || games.size > 0)
142 return games;
145 games.clear();
147 var cached = GamesDB.get_instance().get_games(this);
148 if(cached.size > 0)
150 games = cached;
151 if(game_loaded != null)
153 foreach(var g in cached)
155 game_loaded(g);
159 games_count = games.size;
161 var url = @"https://embed.gog.com/account/getFilteredProducts?mediaType=1";
162 var root = (yield Parser.parse_remote_json_file_async(url, "GET", user_token)).get_object();
164 var products = root.get_array_member("products");
166 foreach(var g in products.get_elements())
168 var game = new GOGGame(this, g.get_object());
169 if(!games.contains(game) && yield game.is_for_linux())
171 games.add(game);
172 if(game_loaded != null) game_loaded(game);
173 GamesDB.get_instance().add_game(game);
175 games_count = games.size;
178 return games;